Me gustaría compartir una técnica general que he usado para aprender cómo funcionan los punteros cuando estaba empezando a cabo. Si lo aplica a su problema, verá la respuesta tan clara como el día.
Coge una hoja grande de papel milimetrado y colócala longitudinalmente sobre la mesa que tienes delante. Esta es la memoria de tu computadora. Cada caja representa un byte. Elija una fila y coloque el número "100" debajo del cuadro en el extremo izquierdo. Esta es "la dirección más baja" de la memoria. (Elegí 100 como un número arbitrario que no es 0, puede elegir otro.) Numere los cuadros en orden ascendente de izquierda a derecha.
+---+---+---+---+---+--
| | | | | | ...
+---+---+---+---+---+--
100 101 102 103 104 ...
Ahora, solo por el momento, imagina que un int tiene un byte de tamaño. Eres una computadora de ocho bits. Escriba su int a
en una de las casillas. El número debajo del cuadro es su dirección. Ahora elija otro cuadro para contener int *b = &a
. int *b
es también una variable almacenada en algún lugar de la memoria, y es un puntero que contiene &a
, que se pronuncia "dirección de a".
int a = 5;
int *b = &a;
a b
+---+---+---+---+---+--
| 5 | |100| | | ...
+---+---+---+---+---+--
100 101 102 103 104 ...
Ahora usted puede utilizar este modelo para trabajar visualmente a través de cualquier otras combinaciones de valores y punteros que se ven. Es una simplificación (porque como dirán los pedantes del lenguaje, un puntero no es necesariamente una dirección, y la memoria no es necesariamente secuencial, y hay pila y pila y registros, etc.), pero es bastante buena analogía para el 99% de las computadoras y microcontroladores.
Así, en su caso,
int x = 35;
int y = 46;
x y
+---+---+---+---+---+--
| 35| 46| | | | ...
+---+---+---+---+---+--
100 101 102 103 104 ...
int *p = &x;
int *q = &y;
x y p q
+---+---+---+---+---+--
| 35| 46|100|101| | ...
+---+---+---+---+---+--
100 101 102 103 104 ...
p = q;
x y p q
+---+---+---+---+---+--
| 35| 46|101|101| | ...
+---+---+---+---+---+--
100 101 102 103 104 ...
*p = 90;
x y p q
+---+---+---+---+---+--
| 35| 90|101|101| | ...
+---+---+---+---+---+--
100 101 102 103 104 ...
Ahora lo que es *p
? ¿Cuál es *q
?
una respuesta muy elegante. Cuando aprendí C/C++, mi amigo me dio una pista para llamar * p como "contenido de p" y quedó muy claro después de eso. – lud0h