Moverse de cajita en cajita
Sumarle uno a una dirección te lleva a la cajita siguiente.
1Por qué
Queda una pieza, y es la que amarra todo lo anterior.
El nombre de un arreglo es la dirección de su primera cajita. Por eso int *p = a; funciona sin &: a ya es una dirección.
Y aquí viene lo que confunde a todo el mundo. p + 1 no suma uno: suma una cajita entera. Si son enteros de cuatro bytes, avanza cuatro. C puede hacerlo porque sabe a qué tipo apunta p — por eso un puntero siempre lleva su tipo pegado, y por eso char * y int * no se mueven igual.
De ahí sale algo que parece magia y no lo es: *(p + 2) y a[2] son exactamente lo mismo. Los corchetes son una forma corta de escribir esa suma. Por dentro, C hace lo mismo en los dos casos.
Cuando esto se te haga natural, ya sabes lo que la mayor parte del curso viene a enseñar.
2Míralo andar
Este programa funciona. Léelo, y después ejecútalo sin cambiar nada.
#include <stdio.h>int main(void){int a[3] = {7, 8, 9};int *p = a;printf("%d\n", *p);printf("%d\n", *(p + 1));printf("%d\n", a[1]);return 0;}
- línea 6
aya es una dirección, así que no lleva&.pqueda apuntando a la primera cajita. - línea 8
*pentra donde apuntap, o sea la cajita número 0. - línea 9
p + 1avanza una cajita entera, no un byte. - línea 10
La misma cajita que la línea de arriba, escrita de la otra forma. Fíjate en que salen iguales: por dentro son idénticas.
3Ahora tú
Haz que el programa escriba: 10 30
#include <stdio.h>int main(void){int a[4] = {10, 20, 30, 40};int *p = a;printf("%d %d\n", /* Escribe tu orden aquí */);return 0;}
Ejecutar
Lo que dice tu programa
↖︎ Escribe tu parte y dale a Ejecutar
Qué pasó
Aquí te aviso si tu programa hace algo raro.
4Qué guarda tu programa
Memoria
↖︎ Ejecuta el programa para ver qué pasa por dentro