Hola y bienvenido de nuevo.
Estamos en una nueva sección. Esta sección se denomina punteros.
Esta es probablemente la sección más importante del curso.
También es probablemente la sección más difícil del curso. El concepto de
punteros yc es un concepto complicado y complicado.
Pero lo haremos muy lento.
Vamos a ofrecer muchas conferencias e ir paso a paso.
Vamos a empezar en el nivel más alto y entrar en más y más detalles.
Debe comprender los indicadores si desea aprovechar al máximo el
lenguaje c. Entonces es muy importante.
Así que comencemos por arriba y hablemos de este concepto de indirección, que
es esencialmente el mismo concepto que un puntero.
Entonces, los punteros son muy similares al concepto de indirección.
Emplea la indirecta en su vida diaria. Entonces, por ejemplo, si
estoy describiendo lo que significa la indirección, sería como
si tuvieras que comprar algo nuevo, un producto nuevo en tu empresa.
Entonces, por ejemplo, digamos que tuvo que comprar un cartucho de tinta nuevo para su impresora.
Si está trabajando en una gran empresa, lo que probablemente
haría es pasar por un determinado departamento
para comprar nuevas compras. Así que probablemente irías al departamento de compras.
Probablemente llamaría a alguien para comprar
y pedirle que le pida el nuevo cartucho.
Sería su trabajo encontrar una tienda local
que proporcione el artículo real que desea pedir.
Y lo que esto significa es que no vas a pedir ese artículo directamente por ti mismo.
Le estás pidiendo a alguien que lo haga por ti.
Y luego, a través de su experiencia y su conocimiento
de quién tiene ese producto en inventario, se
lo devuelven.
Así que este es un nivel de indirecta que le concierne. No sigas adelante y vayas
a la tienda y lo compres. Vas al departamento de compras, el departamento
de la persona tiene el conocimiento de que va y hace todo por ti.
Este es el mismo concepto de puntero en programación.
En los lenguajes de programación, la indirección es la capacidad de hacer referencia a algo utilizando un
nombre, una referencia o un contenedor en lugar del valor en sí.
Usamos una forma de interacción mediante el uso de nombres de variables.
No usamos la dirección de la memoria para acceder a los datos.
Usamos un nombre de variable.
La forma más común de indirección es el acto de manipular un valor a través
de su dirección de memoria.
Entonces, además de una descripción realmente
pequeña de la indirección usando un nombre de variable para representar una dirección de memoria, también
manipula un valor a través de su dirección de memoria usando la dirección misma.
la dirección en sí.
Por tanto, un puntero proporciona un medio indirecto de acceder al valor de un elemento de datos en particular.
Es una variable cuyo valor es una dirección de
memoria y es vital comprenderla.
Hemos aprendido variables hasta este punto que contienen
ciertos tipos de datos,
números, caracteres, dobles, flotantes con números racionales.
Ahora vamos a tener una variable que
no almacena ninguno de este tipo de datos.
El tipo de almacenamiento de datos es una dirección de memoria.
La dirección de memoria se representará como un entero, un
número hexadecimal, pero
seguirá siendo una dirección de memoria.
Entonces, será el valor de
una dirección y otra ubicación de la memoria si es una variable
existente o una nueva ubicación que asigna dinámicamente.
Así como hay razones por las que tiene sentido pasar por el
departamento de compras para pedir cartuchos nuevos, no
es necesario que sepa a qué tienda en particular se ordenan los cartuchos, por ejemplo.
También hay buenas razones por las que tiene sentido usar
punteros yc Para usar estas variables que representan una dirección, una dirección de memoria.
Hablamos de direcciones de memoria al comienzo del curso.
Y cómo cada vez que ejecuta un programa y crea variables, esas se almacenan en la memoria.
Y ese recuerdo tiene una dirección particular. Tienes que saber la dirección para recuperar esos
datos, al igual que necesitas saber la dirección de una casa si vas a conducir a algún lugar o
la dirección de una ubicación.
Entonces, usar punteros en su programa es una de las herramientas más poderosas disponibles en el lenguaje c.
Por eso es importante comprender.
Cualquier programa en c que sea sustantivo utilizará punteros.
Entonces tienes que entender este concepto.
Y para los programadores que han programado lenguajes más modernos
como java o c sharp, no necesariamente tienen que
preocuparse por esto porque toda
la asignación de memoria y no hay un
concepto real de punteros.
Aunque bajo el
capó, Java usa punteros porque tienen copias de referencias.
Es el mismo tipo de concepto. Pero en c, tienes
explícitamente una variable que representa una dirección.
Los punteros son también uno de los conceptos más confusos del lenguaje c.
Tienden a ser abusados
y tienden a no ser completamente entendidos, especialmente por los nuevos programadores.
Por lo tanto, es importante que entienda este concepto al
principio y tenga una idea clara de lo que
está sucediendo a medida que avanza en el concepto de punteros cada vez más avanzados.
Entonces, si no entiende esto al
principio, estudie, estudie, estudie, practique escribiendo código con punteros.
El compilador debe conocer el tipo de datos almacenados en
la variable a la que apunta. Así que es como una variable
regular y tienes que especificar el tipo de datos cuando creas el puntero.
La razón por la que el compilador necesita saber esto es la misma
razón para las variables, necesita saber cuántos datos asignar incluso si está apuntando a algunos datos.
Cada puntero se asociará con un tipo de variable específico.
Solo se puede usar para apuntar a variables de
ese tipo, daremos un ejemplo de esto cuando hablemos de definir un puntero.
Entonces, por ejemplo, los punteros de
tipo puntero solo pueden apuntar a variables de tipo int.
Una vez más, una variable tiene
el valor de una dirección, que es un puntero.
Esa dirección puede contener un valor en algún lugar de la memoria.
Los punteros de tipo pointer to float solo pueden apuntar a variables de tipo float.
Así que aquí tienes una
idea ilustrativa que te da el concepto de puntero.
No se preocupe por la sintaxis aquí.
Lo hemos discutido brevemente en conferencias anteriores, este ampersand y este asterisco, no necesariamente
tiene que preocuparse por eso. Lo que quiero que presten
atención aquí es cómo un puntero tiene una dirección, y esa dirección
puede contener un valor pero estar en otro lugar de la memoria.
Entonces, en este ejemplo, estamos creando un número regular, lo
hemos creado un millón de veces, luego verá esta sintaxis con el asterisco que
significa que es un puntero. Vamos a analizar eso en detalle.
También verá el ampersand, que significa que es una dirección.
Entonces, en este ejemplo, cuando creamos este puntero de tipo int p
número, estamos asignando una dirección. Porque recuerde, los punteros solo pueden almacenar direcciones.
Y la forma en que esto se presenta realmente en la memoria
es que tiene un número de nombre
de variable, y el número tiene un valor de 99.
El número también tiene una dirección en la memoria.
Esa dirección en la memoria es el valor del puntero.
Entonces, el número p es un puntero que apunta a la dirección 1008.
1008 tiene un valor de 99, también contiene
el número de variable.
Así que esto es realmente a lo que nos referimos. Si esto no está claro, debe
mirarlo durante una hora y asegurarse de comprenderlo.
Nuevamente, el punto es que un puntero tiene un valor para
una dirección, eso es lo que almacena.
Y luego puede acceder al valor en esa dirección usando cierta sintaxis.
Entonces, ¿por qué usar punteros, por qué incluso abordar este concepto, por qué no
podemos simplemente usar los tipos de
datos existentes que usamos y usar la matriz de caracteres cuando queremos usar cadenas?
Bueno, acceder a los datos mediante variables únicas es muy limitante.
Con los punteros, puede acceder a cualquier ubicación, puede tratar cualquier posición de la
memoria como una variable, por ejemplo, y luego puede realizar operaciones aritméticas
con punteros también, lo que facilita las cosas.
Los punteros en c facilitan el uso de
matrices y cadenas, y también lo veremos, esa es otra ventaja de usar punteros.
Los punteros le permiten hacer referencia al mismo espacio y memoria con múltiples ubicaciones.
Entonces, lo que esto significa es que puede actualizar la memoria
en una ubicación y luego el cambio se puede ver desde otra ubicación en su programa.
Es una forma de usar datos globales, pero aún tiene funciones internas encapsuladas.
También puede ahorrar mucho espacio en la memoria al poder compartir componentes en sus
estructuras de datos.
Así que recuerde, cuando se inventó c, c se inventó en los años 70.
La idea de c era ser muy eficiente y de bajo nivel.
La idea de acceder a la memoria directamente a través de
punteros es muy
eficiente y también muy rápida.
Los punteros también permiten que las funciones modifiquen los datos que se
les pasan como variables. Esto se pasa por referencia. Vamos a dar una conferencia sobre esto.
Aquí es donde puede pasar argumentos a una función con sus punteros.
Y luego, dentro de la función, cuando cambie esos
datos, el cambio se reflejará fuera de esa función.
Entonces ya no tenemos que usar datos globales.
Podemos usar datos dentro de una función, pasar esos datos
como un puntero y luego se asignarán los datos
fuera de esa función. Entonces, no tiene la desventaja
de usar variables globales donde todo está estrechamente acoplado, puede limitar
eso solo a los datos que necesitan solo a las funciones que necesitan conocer esos datos.
Como mencioné, también se puede usar para optimizar el programa para que se ejecute más
rápido y use menos memoria de lo que
usaría de otra manera, lo cual
es un concepto importante, especialmente en programas integrados en tiempo real.
Los punteros también nos permiten obtener múltiples valores de una función.
Hemos hablado de funciones sobre cómo puede pasar funciones de datos.
También hemos hablado sobre cómo puede devolver datos.
Sabemos que en este momento solo puede devolver un valor de una función.
Pero si usa punteros, en realidad puede devolver múltiples valores de una función.
Y vamos a hablar de eso. Esa es una gran ventaja.
También vamos a hablar sobre la asignación de memoria dinámica.
En este momento, cuando creamos memoria para un programa, el
compilador lo hace implícitamente cuando declaras una variable.
Si declara una variable int, automáticamente crea 4 bytes para esa variable, por ejemplo.
Cuando utiliza matrices y especifica el tamaño de una matriz,
ese tamaño se asigna en el momento de la compilación.
Entonces, si está tratando de almacenar más datos que eso, está
jodido, su programa no funcionará.
Pero si tuviera la capacidad de
crear tanta memoria como necesite en tiempo de
ejecución, sería enorme. Y los punteros te permiten hacer esto.
Le permiten crear memoria en tiempo de ejecución, asignación de memoria dinámica.
También vamos a hablar de todo esto.
Los punteros nos permiten diseñar y desarrollar estructuras de datos más complejas.
Y la estructura de datos es algo que almacena datos.
Ejemplos de estructuras de datos son apilar una señal o una lista enlazada.
Y podemos crearlos mucho más fácilmente usando punteros.
Los punteros brindan acceso directo a la memoria, nuevamente, de manera eficiente y rápida.
Así que los punteros van a ser un gran concepto. Vamos a tener muchas conferencias sobre consejos.
Quiero que se concentren, y quiero que presten atención cuando hablo de todos estos
conceptos porque es importante y vital para comprender el lenguaje de programación C.
Así que buena suerte y comencemos. Gracias.