¿Por qué no puedo entender los punteros?

A2A. Lo intentaré: es difícil de explicar sin entender lo que no entiendes. Principalmente, los punteros son difíciles porque estás acostumbrado a pensar en las cosas.
No son tan difíciles, pero hay algo que debe hacer clic. Dependiendo del idioma que esté utilizando, la notación tampoco ayuda.

Todo en una computadora está realmente almacenado en la memoria.
Cada bit / byte en la memoria tiene una dirección. Para los humanos, tratar con direcciones es complejo, por lo que todos los lenguajes de programación le permiten nombrar cosas: las variables tienen nombres y también las funciones.

Esto le permite hacer cosas como definir una variable:

int edad = 42;

y a partir de ese momento puede referirse a esa variable por su nombre.

Sin embargo, lo que la computadora hará internamente es elegir una dirección, digamos 5432, y almacenar el valor 42 allí:

memoria [5432] = 42;

El nombre “edad” que utiliza es simplemente un alias para “memoria [5432]”.

Si quisieras saber qué es este puntero, puedes hacer:

int * age_ptr = & age;

El primer bit “int *” define age_ptr que es una variable que puede contener un puntero a un entero.
El segundo bit “& age” le dice al compilador que tome el puntero interno y lo asigne a age_ptr, el 5432 en el ejemplo.

Para enteros, esto es algo bastante inútil, pero para estructuras u objetos ahora puede pasar el puntero en lugar de todo. “Solo mira la dirección 5432”. En lugar de traer toda la casa, solo recuerda el número de la casa.

¿Más claro?

En primer lugar, no hay necesidad de entrar en pánico si no comprende los punteros. Es uno de esos temas difíciles. Le sugiero que lea algunos materiales, videos de New Boston, etc. Los punteros son en realidad variables que contienen direcciones de memoria que apuntan a una determinada ubicación de memoria. Por ejemplo, la dirección de su casa es el puntero a su casa. Básicamente, si conozco tu dirección, conozco tu casa.

En segundo lugar, si tiene problemas con las implementaciones y está trabajando en C o C ++, solo necesita comprender vívidamente los operadores ‘&’ y ‘*’ y si simplemente odia los punteros, le recomiendo Java. Sin embargo, es un tema importante, puede tomar un tiempo pero vale la pena aprenderlo.

¡Mi profesor en la universidad comenzó su primera conferencia sobre puntero con estas líneas de A través del espejo de Lewis Caroll, que ciertamente ayudó a establecer las expectativas correctas sobre la comprensión del puntero!

Estás triste “, dijo el Caballero en un tono ansioso:” déjame cantarte una canción para consolarte. El nombre de la canción se llama “HADDOCKS ‘EYES”.

‘Oh, ese es el nombre de la canción, ¿verdad?’ Dijo Alice, tratando de sentirse interesada.

“No, no lo entiendes”, dijo el Caballero, un poco molesto. ‘Así se llama el nombre. El nombre realmente ES “EL HOMBRE ENVEJECIDO”.

‘¿Entonces debería haber dicho “Así se llama la CANCIÓN”? ” Alice se corrigió a sí misma.

‘No, no deberías: ¡eso es otra cosa! La canción se llama “CAMINOS Y MEDIOS”: ¡pero eso es lo que SE LLAMA, ya sabes!

‘Bueno, entonces, ¿cuál es la canción?’ dijo Alice, que para entonces estaba completamente desconcertada.

“Estaba llegando a eso”, dijo el Caballero. ‘La canción realmente ES “A-SITTING ON A GATE”: y la canción es mi propio invento.

Respuesta simple, la persona que te enseñó dijo que los punteros son difíciles.

Recuerde que los punteros le permiten preguntar a la memoria dónde se almacenan las variables / datos.

Esto es poderoso y es muy útil. Con un gran poder viene una gran responsabilidad, si cambia el valor de una variable por error. Ha habido muchos casos en los que encontramos que el valor se modificó en la dirección incorrecta.

Sin embargo, el poder es útil en la vida real.

Supongo que si intentas un enfoque de bajo nivel, por ejemplo, aprender a programar en Arduino, inmediatamente obtienes este concepto.

La programación con un lenguaje de alto nivel como Java pero incluso C ++ cuando usa bibliotecas avanzadas lo mantiene tan alejado del hardware que el concepto de puntero se vuelve borroso, mezclado con conceptos similares como el de referencia.

Programación

No entiendes los punteros porque te enseñaron mal.

Entiendes las matrices ¿verdad?

Suponga que la RAM de todo su sistema era una matriz: memoria de caracteres [X] donde X es el tamaño. Ahora imagine que cada vez que indexa esa memoria con un número que me gusta la memoria [i] , i es el puntero.

En otras palabras, un puntero es un número, y cuando desreferencia un puntero p con * p , básicamente está haciendo lo mismo que la memoria [p] con cualquier valor integral que haya en p

¿Tiene sentido?