En sus propios estudios (por su cuenta o para una clase), ¿tuvo un momento de "ah ja" cuando finalmente comprendió los indicadores? ¿Tiene una explicación que utiliza para los programadores principiantes que parece particularmente efectiva?
Por ejemplo, cuando los principiantes primeros punteros de encuentro en C, puede ser que sólo tiene que añadir &
s y *
s hasta que se compila (como yo mismo hice una vez). Tal vez fue una imagen, o un ejemplo muy bien motivado, que hizo que los punteros hicieran "clic" para usted o su estudiante. ¿Qué fue y qué probaste antes de que eso no parecía funcionar? ¿Hubo algún requisito previo (p. Ej., Estructuras o matrices)?
En otras palabras, ¿qué era necesario para comprender el significado de &
sy *
cuando podía usarlos con confianza? Aprender la sintaxis y la terminología o los casos de uso no es suficiente, en algún momento la idea necesita ser internalizada.
Actualización: realmente me gustan las respuestas hasta ahora; por favor sigan viniendo Aquí hay muchas perspectivas geniales, pero creo que muchas son buenas explicaciones / consignas para nosotros mismos después de haber internalizado el concepto. Estoy buscando los contextos y circunstancias detallados cuando te di cuenta.
Por ejemplo:
Solo entendí un poco los punteros sintácticamente en C. Escuché a dos de mis amigos explicar los punteros a otro amigo, quien preguntó por qué
struct
se pasaba un puntero. El primer amigo habló sobre cómo necesitaba ser referenciado y modificado, pero fue solo un breve comentario del otro amigo donde me golpeó: "También es más eficiente". Pasar 4 bytes en lugar de 16 bytes fue el cambio conceptual final que necesitaba.
fuente
Respuestas:
Diagrama de memoria como una cuadrícula
Por lo general, lo que hago es representar la memoria como una "cuadrícula", de modo que pueda inventar direcciones, resaltar diferentes espacios de memoria y escribir en los valores de las celdas (o incluso más, sus representaciones binarias) y vincular los punteros en la memoria a los valores que apuntar a. (Y aún así mencionar que es una simplificación).
Por lo general, es un momento "ohhhh" para la mayoría de mis estudiantes.
Símbolo malabares
Luego, cuando se trata de hacer que dejen de olvidar cómo usar & y *, es muy simple: presentarlo de la misma manera que hacen cálculos matemáticos o físicos. Si divide una distancia en km por un tiempo en horas, obtendrá una velocidad en km / h. Lo que hay dentro debe estar afuera. Sencillo.
printf al rescate
Hacer solo unos pocos ejemplos básicos que representen visualmente lo que usted explicó con estos los reconfortará en lo que ellos creen que entendieron, o les dará la oportunidad de decir "ah, no entiendo este".
Ser extenso
Cubra los punteros para tipos simples y asegúrese de que entiendan la diferencia entre el direccionamiento y el tamaño de un tipo de datos, luego estructuras, matrices y niveles múltiples.
Luego, inicie la aritmética del puntero.
Anexo: Recursión
Usualmente explico la recursión de manera similar, usando una representación visual. Pídales que impriman el alfabeto usando una función prefabricada que escribe un solo carácter y luego pídales que lo impriman en orden inverso simplemente cambiando dos líneas.
Por lo general, hay un "¿qué demonios ...?" momento, y cuando agrega solo otro parámetro a su printf para imprimir valores numéricos y sangrar los pasos, se convierte en un suspiro de alivio.
Alternativas: el modelo Play-Doh y las tazas de agua
De hecho, tuve algunos compañeros de trabajo en una universidad que les mostraron a los estudiantes un video explicando punteros y accesos a la memoria usando play-doh paste. Fue increíblemente inteligente y bien hecho, aunque nunca usé esa técnica yo mismo, excepto para estudiantes muy jóvenes interesados en comprender la programación (pero generalmente aquellos que no los guiaría hacia un idioma usando punteros demasiado temprano). Básicamente, usando pequeñas bolas de play-doh que puede adjuntar a otras bolas más grandes de play-doh que representan espacios de memoria, y que puede combinar para unirlas (como en una estructura de datos enlazada) o fusionarlas (como en un contiguo espacio de memoria). El uso de diferentes colores para los espacios de memoria señalados y los punteros también ayudan. Pero sigo pensando que lo de la memoria como una cuadrícula funciona mejor, como puede mostrar claramente que el apuntar es realmente una cuestión de "direccionamiento", como en un "mapa / cuadrícula". Mientras que el modo Play-doh todavía los confunde al pensar que las cosas realmente "se tocan" entre sí en la memoria.
La cosa de la Copa del Agua fue utilizada directamente por un colega también, pero no sé si se le ocurrió. Fue un enfoque interesante, pero noté que muchos estudiantes quedaron desconcertados por la explicación. Algo parecido a la técnica DevSolo's Coffee Cup . Pero creo que en realidad es engañoso, ya que hace que los estudiantes confundan contenedores, estructuras de datos, punteros y matrices. Supongo que podría ser un enfoque interesante explicar las matrices al principio, pero no me quedaría mucho tiempo.
fuente
Alguien mucho más sabio de lo que dije una vez:
fuente
Encontré que los diagramas fueron muy útiles. Ejemplo:
Este tipo de diagrama me ayudó a ver que los punteros eran su propia variable, pero contenían un valor que era la ubicación de otro objeto, es decir, matriz o cadena. Además, cuando lo hago con lápiz, podría usarlo para trazar mi programa en papel o en una pizarra / pizarra.
fuente
Cuando "aprendí" por primera vez acerca de los punteros, me sentí empujado a ello. Mi universidad había tomado la decisión mucho tiempo antes de que me inscribiera para centrar el plan de estudios en Java, por lo que cuando mi profesor de Estructuras de datos dio una conferencia sobre C y nos pidió que implementemos una lista XOR con punteros, sentí que me estaba metiendo en algo muy por encima de mi cabeza.
Entendí la definición:
Pero todavía no entendía una gran parte del concepto. Mirando hacia atrás, creo que se centró en tres cosas:
¿Qué es exactamente una ubicación de memoria? (En ese momento no tomé una clase de organización de computadoras)
La sintaxis incómoda (Entonces ... ¿por qué exactamente se define como "int * ip" pero luego me refiero a la variable como "ip"?)
¿Cómo es exactamente beneficioso almacenar la dirección de una variable en lugar de solo usar la variable?
No fue hasta que compré el libro de K&R y completé todos los problemas que realmente pude entender los consejos. Además del hecho de que durante mucho tiempo completé la clase de Organización de la Computadora (que creo que debería ser necesaria antes de aprender C), parte de ella tuvo que ver con el hecho de que me di cuenta de que los punteros se pueden usar para funciones, matrices, estructuras ... para hacer cosas útiles y no simplemente como almacenamiento para direcciones de variables ordinarias.
Pero mi momento "ajá" fue la forma en que K&R explicó la incómoda sintaxis de definir un puntero simple. Tomé notas a lo largo del libro (en el que reformulo los puntos hechos por el libro en mis propias palabras para profundizar mi comprensión), y este es el que se relaciona con eso:
Siempre sentí que no podía comprender completamente los conceptos más avanzados de punteros hasta que tuviera algo tan elemental arraigado en mi cabeza. Me había molestado sin cesar después de esa tarea (que no me fue muy bien, por cierto;)) por qué "* ip" no existía justo después de que (pensé que) definía "* ip". Dominar esto es esencial para conceptos más avanzados que involucran punteros, como punteros de función y definiciones más complicadas como esta:
En general, creo que el concepto de punteros requiere:
Una comprensión básica de cómo se presenta la memoria en una computadora (y qué es la memoria).
Conocimiento de cuán poderosos pueden ser los punteros (uso en el mundo real, no solo otro concepto abstracto que aprenden por el simple hecho de aprender).
Descifrando los jeroglíficos coloquialmente conocidos como "una definición de puntero"
Así que, en general, creo que debería haber al menos 3 "aha" momentos al aprender sobre punteros. Todavía soy estudiante, así que pensé que apreciaría el punto de vista de alguien que todavía está (relativamente) recién aprendiendo el concepto.
fuente
PointerTo<int> a
]int* ip
no sea más común. Finalmente comencé a entender los punteros una vez que vi el código que estaba formateado de esta manera. Entonces podría leerlo como "ip is of type int pointer".El puntero es un poco como los accesos directos a aplicaciones en su escritorio. Elimine el acceso directo y el objetivo todavía existe. Inicie el acceso directo y el objetivo comienza.
Siempre explico el funcionamiento de esto simplemente creando un archivo txt en mi escritorio y dos accesos directos al archivo. Después de copiar y eliminar los accesos directos, puede ver que las personas entienden la idea detrás de las 'referencias'.
Una vez que el grupo comprende lo básico detrás de los atajos, puede comenzar a explicar los punteros de la forma que desee. Probablemente lo entenderán con bastante facilidad.
fuente
Hace 8-10 años, enseñé un curso de introducción "C" en un colegio comunitario. Este siempre fue un tema divertido para explorar. Lo que parecía funcionar mejor, y esto fue después de discutir un par de veces con un compañero de trabajo, fue usar una taza de café y la mano.
Usé la analogía de una taza de café (o una fila de ellos para los arreglos) como una variable (puede contener algo). Luego usé mi mano, que también podía sostener algo o, al extender mi dedo índice para "señalar" una taza de café.
Una mano cercana era nula, un dedo apuntando a mi cabeza (como una pistola simulada) era un puntero que colgaba.
Luego, con algunas demostraciones y viajes a través del depurador, hizo clic con la mayoría.
fuente
Realmente me preocupo bastante cuando escucho la pregunta "¿cómo entendiste los punteros?". Siempre pensé que el concepto era increíblemente simple y una evolución lógica de los lenguajes que proporcionaban un gran poder a los programadores.
Lo que me preocupa es que nunca me resultó difícil entender el concepto de punteros. Entonces, cuando estás aquí "cuándo finalmente lo conseguiste" una y otra vez, comienzas a pensar:
Tal vez la razón por la cual el concepto parece ser complicado, es porque seguimos diciéndoles a todos los que aún no los han encontrado que los punteros son tan difíciles, y aquí hay cientos de formas en que puedes aprender.
Simplemente lanzando esa idea, por supuesto, personalmente, me encanta un buen diagrama y Steve Gibson siempre hace un trabajo fantástico al explicar cualquier cosa .
fuente
Nunca tuve muchos problemas con los punteros en C, pero eso puede deberse a que primero tuve que aprender ensamblador. En realidad, fue un alivio no tener que administrar las direcciones por mí mismo. Entonces, tal vez la respuesta (suponiendo que esto es algo que está enseñando) es dar a los estudiantes un lenguaje ensamblador emulado para trabajar. Ellos van a averiguarlo en el proceso de escribir nada más sofisticado que "Hola, mundo".
fuente
Un puntero es una variable cuyo valor es la dirección de memoria de otra variable.
fuente
¿Cómo aprendí realmente sobre los punteros? Al escribir un simple compilador de primer año de la universidad.
¿Cómo explicar los punteros en términos simples? Me gusta la analogía (¿fechada?) De un catálogo de biblioteca almacenado en fichas. Cada tarjeta ("puntero") contiene información sobre dónde se encuentra algún libro ("datos"), pero en realidad no contiene el libro en sí. Si modifica la tarjeta ("aritmética de puntero"), todo lo que hace es cambiar el libro al que apunta y no tiene impacto en el libro en sí mismo; solo tenga cuidado de no arruinar la dirección o podría apuntar a un libro inexistente o incluso la biblioteca equivocada. Sin embargo, si sigue la "dirección" en la tarjeta y va a la parte adecuada de la biblioteca ("desreferenciar el puntero"), puede ver / modificar el libro en sí.
fuente
Asumiré que alguien que va a aprender punteros sabe cuáles son las variables normales y cómo funcionan en C. Ahora, intentemos definir punteros con algunos de sus atributos.
También son variables, pero de diferente naturaleza. Suponga que hay dos capas en el espacio variable. Las variables normales de diferentes tipos residen en la capa superior y los punteros en la capa inferior. Como esta figura
Como sugiere el nombre 'Puntero', los punteros pueden apuntar a algo. Como nuestro dedo puede apuntar a algún objeto. ¿Cuáles son las cosas que señalan? Estas son las variables normales. En resumen, "Los punteros apuntan a variables normales".
Entonces, ¿cómo se declara un puntero? Casi como las variables normales. Debe preceder el nombre con un asterisco (
*
). Me gusta-Entonces, ¿cómo se asocia un puntero con una variable? Usando el
&
operador antes de la variable como esta declaración:¿Cómo se usa un puntero apuntando a una variable? Esto también se hace precediendo el nombre con un asterisco (
*
). Entonces se puede usar en lugar de la variable que está señalando ahora.en lugar de
Ahora, juega con punteros con algo de código. Solo acostúmbrate a estas características de los punteros ahora. Hasta este punto, estamos hablando de lo que hacen los punteros. Una vez que esté de acuerdo con esto, comience a estudiar cómo los punteros apuntan a alguna variable y cómo reaccionan si se les aplican operaciones aritméticas normales. Luego, busque la relación entre punteros y matrices y punteros a punteros.
Eso es todo lo que sugeriré sobre aprender punteros.
fuente
Editado en apoyo del requisito revisado de la pregunta
Mi camino hacia la comprensión "post-puntero" (si no recuerdo mal) fue así. Tenía una experiencia simple de programación de ensamblaje de cuando todavía estaba jugando con una BBC Micro, así que tuve el concepto de memoria como un montón de cajas (ver más abajo para esto). Esto fue reforzado por el uso de matrices. Sin embargo, estaba entrando en el mundo de C y tuve que lidiar con cadenas y eso significaba punteros. En BASIC esto fue trivial, en ensamblador nunca tuve que trabajar con ellos, y ahora en el clásico C todo es punteros y demás. Ah, pero puedo volver a las matrices con cadenas (terminadas en nulo) como esta:
Todo bien, eso es solo una serie de caracteres (8 bits por personaje en mi pequeño mundo) con un carácter cero al final para mostrar dónde termina. El printf simplemente toma esa matriz y la ejecuta, imprimiéndola. Pero, ¿qué pasa si quiero pasar esta cadena a una función?
Es lo que dice el manual, pero ¿de qué se trata eso *? Hmm, char * significa "puntero a un char". OK ... me perdiste. Entonces caí en la cuenta de que char * hace p equivalente a s [0]. OK, puedo usar eso, pero todavía no he explicado qué son los punteros. Quiero decir, ¿cómo configuro algunos datos con una de estas cosas? De nuevo al manual ...
Mientras escribo lo anterior, me digo "declare un puntero a un carácter y configúrelo igual a este conjunto de caracteres". De alguna manera, ese puntero elimina la necesidad de una matriz. Supongo que es el compilador haciendo algunas cosas por mí para variar. Entonces, ¿cómo puedo cambiar la matriz con este puntero? Sé que podría usar la versión de matriz
pero, ¿cuál es el equivalente en "hablar puntero"? A ese manual otra vez ...
Supongo que * simplemente significa "el contenido de la dirección de memoria" y
(p+2)
ess[2]
. Lo que significaba que el puntero p era ... solo ... una ... dirección ... ¡bong!Que hay el sonido de la iluminación. Repentinamente tiré punteros (fue hace mucho tiempo, nosotros, los viejos, no "asimilamos" hasta más tarde). Fue solo indirección.
Original:
Vale, mi 2c vale:
Imagina que la memoria es un montón de cajas. Cada casilla tiene un número al costado (la dirección). Cada cuadro contiene un número (el contenido). Puede trabajar con estos cuadros de 2 maneras: variables (quiero el contenido del cuadro N), punteros (quiero el contenido del cuadro, lo que sea que esté en el cuadro N ). Los punteros son simplemente indirección.
Y para la gran respuesta que cubre todo lo que necesitará saber, lea esto .
fuente
Consigue unos pequeños bloques de madera.
agregue ganchos de metal a un extremo y ojos de metal al otro.
ahora puedes hacer una lista vinculada en cosas con las que puedes jugar.
Intenta explicar con este accesorio físico. A menudo deseaba tener esto cuando enseñaba consejos a estudiantes de primer año (primer año).
El pequeño gancho de metal es el puntero, el bloque de madera al que apuntaba la cosa.
Desafío a cualquiera a que no lo obtenga después de jugar con los bloques.
fuente
Hice mi vida más fácil cuando eliminé toda la pelusa y comencé a tratar el puntero como cualquier otra variable en lugar de una entidad mágica (hace mucho tiempo en el grado 11) ... solo sé 3 cosas:
El resto es azúcar sintáctica y sentido común. Simplemente escriba algunos programas simples de C (como implementar una biblioteca de listas enlazadas) usando punteros para familiarizarse con ellos.
fuente
fuente
No puedo recordar las circunstancias en torno a mis punteros-aha-momento, pero he reajustado retroactivamente la memoria en torno a mi comprensión de una matriz de estilo C. (
arr[3]
es decir, es lo mismo que*(arr+3)
)Por alguna razón, encuentro inmensamente útil ver los punteros como matrices cada vez que me encuentro con una situación de puntero.
fuente
Básicamente, @Gary Rowe presentó el modelo correcto. Memoria como un conjunto de cuadros con direcciones (números) en ellos. Cada caja almacena un valor (número).
La idea de un puntero es interpretar el valor en un cuadro como la dirección de otro cuadro. Este valor se usa para referirse a un cuadro específico, por eso se le llama referencia . Por lo tanto, la desreferenciación es el proceso de abrir el cuadro al que se hace referencia.
si
v
es una variable (cuadro), entonces la declaraciónv
significa valor dev
, es decir, dame lo que hay en el cuadro*v
significa desreferenciar el valor dev
, es decir, darme lo que está en el cuadro referido por el valor dev
&v
significa referenciav
, es decir, dame la dirección en la casillaCreo que no sirve al propósito de introducir punteros como algo completamente diferente. Fue un concepto difícil de entender para mí cuando era niño. Siempre parecía una magia oscura que nunca entendí realmente, que necesitaba muchos personajes especiales. La primera vez que entendí fue cuando escribí un pequeño juego usando doble indirección en un lenguaje que no tiene aritmética de puntero. Eso me iluminó.
Los punteros son una cuestión de interpretación. Creo que explicar eso hace las cosas mucho más fáciles. Y la aritmética de punteros son operaciones extremadamente simples e intuitivas si se muestra un ejemplo simple con una memoria de 10 variables.
fuente
La explicación que realmente critiqué fue:
fuente
Si desea explicar los punteros, primero debe explicar la memoria. Usualmente hago eso usando papel cuadriculado / papel cuadrado con filas y columnas. Si el "estudiante" entiende la memoria, puede entender qué es una dirección. Si tienes dirección tienes punteros.
Puedes jugar con esta abstracción. Por ejemplo, escriba la dirección (número) de un cuadrado en otro cuadrado. Ahora dibuja una flecha desde el cuadrado del puntero hasta el cuadrado de destino. Ahora sobrescriba el puntero (por ejemplo, increméntelo) y ajuste la flecha. Escriba una dirección en otro cuadrado y deje que el alumno dibuje la flecha ...
Siguiente paso: asigne un nombre a ciertos cuadrados (como el puntero). Ahora puede explicar la desreferenciación. Eso es.
fuente
Quizás solo soy yo, pero trabajo bien con analogías. Entonces, digamos que tiene un amigo (función / clase) "Foo", que quiere tener a otra persona (función / clase diferente), "Bar", que se contacte con usted por alguna razón. "Foo" podría llevarte a ver "Bar", pero eso no es conveniente, moviendo a todos esos seres (instancias). Sin embargo, "Foo" podría enviar a "Bar" su número de teléfono (puntero). De esa manera, no importa dónde se encuentre, "Foo" sabe cómo contactarlo sin tener que encontrarlo.
Y, digamos que "Bar" tiene un conocido, "Baz", que también quiere ponerse en contacto con usted. Pero protege su número de teléfono y no quiere que todos lo tengan, "Baz" puede llamar a "Bar" (teléfono como puntero), que luego puede reenviarle la llamada (otro puntero). Y así sucesivamente en la cadena de amigos y amigos de "Baz".
fuente
Los punteros tienen mucho más sentido si has estudiado lenguaje ensamblador y / o arquitectura de computadora. Creo que si enseño una clase C, comenzaría con un par de semanas de arquitectura para explicar el modelo de memoria y el tipo de instrucciones que el procesador realmente ejecuta.
fuente
Mi "¡ajá!" momento llegó en este tutorial:
Un tutorial sobre punteros y matrices en C
Para ser exactos, vino en este capítulo: Capítulo 3: Punteros y cadenas
Para ser aún más preciso, vino con esta oración:
Cuando leí eso, las nubes se separaron y los ángeles hicieron sonar trompetas.
Como puede ver, cada tutorial o libro de C que leí antes afirmaba que C podía pasar por valor o por referencia, una mentira nefasta. La verdad es que C siempre pasa por valor, pero a veces el valor pasado es una dirección. Dentro del método, se hace una copia de esa dirección, al igual que una copia se haría de un int se ha pasado. Una copia es no hizo del valor al que apunta el puntero. Por lo tanto, al usar el puntero dentro del método, puede acceder al valor original y cambiarlo.
Nunca me convertí en programador de C, pero me convertí en programador de .NET, y los objetos y referencias de objetos funcionan de la misma manera; la referencia al objeto se pasa por valor (y, por lo tanto, se copia), pero el objeto en sí no se copia. He trabajado con muchos programadores que no entienden esto porque nunca aprendieron punteros.
fuente
El truco consiste en explicar que la ubicación de una cosa y la cosa en sí no son lo mismo, al igual que una imagen de una tubería no es una tubería . Cuando mueves una cosa, su ubicación cambia. La ubicación permanece y se puede poner algo más allí.
fuente
Un puntero es una nota adhesiva que te dice dónde está algo útil. Contiene la ubicación de la cosa y te dice qué tan grande es la cosa (en C, de todos modos). Entonces, un doble puntero es como una nota adhesiva que dice "Hay un paquete de seis en el refrigerador". Tienes que ir a buscar el paquete de seis para averiguar si es Coca-Cola o Budweiser.
fuente
Dado el código:
int v=42;
// declarando e inicializando una variable simpleint *p = &v;
// creando un punto p para la variable vLo siguiente se puede decir sobre el código anterior:
int * p
// "int puntero p" ... así es como declaras un puntero a una variable de tipo int*p
// "señalado por p" ... esa es la información a la que apunta p, es lo mismo que v.&v
// "dirección de la variable v" ... esto representa el valor literal para pfuente
http://cslibrary.stanford.edu/
Este sitio tiene excelentes tutoriales para aprender punteros y administrar la memoria.
Te sugiero que recorras los aspectos básicos de los punteros, los punteros y la memoria que se dan en el sitio. También puede ver los problemas de las listas vinculadas que figuran en el enlace para fortalecer aún más los conceptos de puntero.
fuente
La clave para explicar los punteros es asegurarse de que las personas a las que les está explicando ya comprendan el concepto de memoria. Si bien sería bueno si realmente lo entendieran de bajo nivel, creer que la memoria existe como una matriz masiva y comprender que puede acceder a cualquier posición en la matriz por su ubicación de índice es suficiente.
El siguiente paso, tener el concepto de pasar la ubicación del índice en lugar de copiar toda la memoria tiene sentido para la mayoría de las personas. Y eso es suficiente para que la mayoría de las personas entiendan por qué los punteros son útiles.
El último paso para comprender los punteros es explicar cómo puede pasar como parámetro una ubicación de índice de memoria para el método para almacenar la ubicación de índice donde se almacenan todos los datos. He descubierto que esto puede ser un paso demasiado lejos para que algunas personas lo puedan hacer frente.
Una vez que alguien ha comprendido estos pasos básicos, es sencillo que comprenda que puede encadenar punteros indefinidamente, siempre y cuando realice un seguimiento de cuántas veces necesita buscar direcciones para encontrar el objeto de datos real.
Una vez que alguien ha captado los punteros, lo siguiente que debe comprender rápidamente es la diferencia entre la memoria de montón y la memoria de apilamiento, y por qué los punteros para apilar la memoria son peligrosos cuando se pasan fuera del método.
fuente
Recuerdo un libro "Rompecabezas en C" o similar, que leí simplemente porque era uno de los pocos libros de programación / informática disponibles en la biblioteca, mi comprensión de C era rudimentaria. Le arrojó una expresión C y le pidió que lo explotara, cada vez más complicado.
fuente
Cuando estaba en la universidad, mi profesor tenía algunas diapositivas de PowerPoint realmente ordenadas que representaban un punto como una variable separada por sí mismo con una flecha a una ubicación de memoria (representada como una matriz) y cuando estábamos haciendo Listas Vinculadas, lo hacía paso a paso. paso a paso, que muestra cuándo cambia la flecha, cuándo se desreferencia el puntero, etc., no había forma de que uno no pudiera entenderlo en un par de minutos. El concepto en sí es realmente fácil, pero hacerlo bien o aplicarlo en programas prácticos requiere más práctica.
fuente
Antes de hacer eso, explico que en la programación "todo usa memoria" y la asignación de variables (estáticas) en la memoria. También explicaré qué es una dirección de memoria y la relación entre el espacio de memoria, la dirección de memoria y las variables.
Finalmente, explico que hay tipos de datos enteros y variables, tipos de datos de cadena y variables ... y así sucesivamente, hasta explicar que hay un tipo de datos especial que almacena direcciones de memoria, que tiene un valor vacío como 0 o "", llamado nulo .
Y, finalmente, variables asignadas dinámicamente a través del uso de punteros.
fuente