Dirección Valor 0x1000 25 0x1004 10 0x1008 ?
int a = 25;
Mentalmente:
a → 0x1000 contenido(0x1000) = 25
"a" es solo un nombre (alias)
Siempre pensar en 3 cosas:
a
0x1000
25
Si no separan esto, fallan con punteros
int *p;
NO es:
"puntero a int"
Es:
"variable que guarda una dirección donde hay un int"
p → 0x2000
Todavía NO apunta a nada útil
p = &a;
Ahora:
a → 0x1000 → 25 p → 0x2000 → 0x1000
p guarda una dirección, no un valor
&a
*p
Proceso mental:
Resultado: 25
int a = 25; int *p = &a; printf("%d", *p);
Salida:
*p = 50;
Resultado:
a = 50
Cambiaste memoria indirectamente
int a = 10; int b = 20; int *p; p = &a; *p = 15; p = &b; *p = 30;
int a = 10; int *p = &a; int *q = &a; *p = 50;
Pregunta:
¿qué vale *q?
*q
p ┐ ├──> a (0x1000) q ┘
Respuesta: 50
Múltiples punteros pueden referirse al mismo lugar de memoria
void cambiar(int *x) { *x = 100; }
int a = 10; cambiar(&a);
a = 100
Simulación de "pass by reference"
Un puntero es solo una dirección.
* significa: "ir a esa dirección"
*
Esto habilita:
Cuando vean:
*p = 20;
Deben pensar:
Herramienta:
Python Tutor (modo C)
Permite ver memoria y punteros visualmente