Intercambiar dos valores
Puedes guardar dónde vive una cajita, no solo lo que tiene dentro.
1Por qué
Hasta ahora tus funciones reciben un número y entregan otro. Ahora viene el problema que hace que C se sienta distinto de todo lo que has visto.
Escribe una función que intercambie dos números y no va a funcionar. No porque la escribas mal: porque una función recibe copias. Le pasas x, ella trabaja con su propia copia, la cambia, y al terminar la copia desaparece. Tu x sigue igual que antes.
Para cambiar el original hay que decirle dónde está. Y para eso hace falta una idea nueva.
Cada cajita vive en algún sitio de la memoria, y ese sitio tiene un número que lo identifica: su dirección, como el número de una casa. &x significa «la dirección de x».
Un puntero es una cajita que en vez de guardar un número guarda una dirección. int *p se lee «p apunta a un entero». Y *p significa «entra ahí»: leer *p es leer la cajita apuntada, y cambiar *p la cambia de verdad, aunque nunca escribas su nombre.
Aquí es donde se cae mucha gente, y casi siempre por lo mismo: confundir & con *. & saca la dirección de algo. * entra en la dirección que un puntero tiene guardada. Uno va y el otro viene.
Al ejecutar, los punteros no muestran un número: muestran una flecha roja con el nombre de la cajita a la que apuntan. En este taller el rojo significa siempre eso — algo que apunta a otra cosa.
2Míralo andar
Este programa funciona. Léelo, y después ejecútalo sin cambiar nada.
#include <stdio.h>void poner_en_cero(int *p){*p = 0;}int main(void){int x = 7;poner_en_cero(&x);printf("x=%d\n", x);return 0;}
- línea 3
int *pdice quepno guarda un número, sino la dirección de un número.voidsignifica que esta función no entrega nada. - línea 5
*p = 0no cambiap: entra en la dirección quepguarda y cambia lo que hay ahí. - línea 12
&xes la dirección dex. Sin ese&la función recibiría una copia, yxseguiría valiendo 7.
3Ahora tú
Completa intercambiar para que x e y terminen cambiadas. Son tres líneas
#include <stdio.h>void intercambiar(int *a, int *b){/* Escribe tu orden aquí */}int main(void){int x = 1;int y = 2;intercambiar(&x, &y);printf("x=%d y=%d\n", x, y);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