Conceptos Básicos
Veremos cómo se organiza la memoria de un computador. Una máquina típica tiene un arreglo
de celdas de memoria numeradas o direccionadas consecutivamente, que pueden manipularse
individualmente o en grupos contiguos. De esta forma, cualquier byte puede ser un char, un par
de bytes puede ser un entero y cuatro bytes consecutivos un entero largo. Un puntero es un
grupo de bytes (2 o 4) que pueden almacenar una dirección.
Como un puntero contiene la dirección de un objeto, es posible acceder al objeto
indirectamente a través del puntero.
Supongamos que x es una variable de tipo entero (int), px es un puntero creado de alguna
forma que todavía no conocemos.
px: x:
... ||| ||| ||| ||| .... ||| ||| ||| ||| ....
Figura 1: Una variable apuntando a otra
dirección de x valor de x
px x
Figura 2: Relación entre px y x (donde px = &x y x = *px)
Así, si y es una variable de tipo entero
y= *px;
asigna a y el contenido de cualquier cosa a la que apunte px
por lo tanto la secuencia
px = &x;
y = *px; asigna indirectamente el valor de x a y.
Es necesario también declarar las variables que participan en esto
int x,y;
int *px;
Ejemplo 1: Mostramos a continuación un programa sencillo que ilustra la relación entre dos
variables enteras, sus correspondientes direcciones y sus punteros asociados.
#include <stdio.h>
#include <conio.h>
void main()
{
int u = 3;
int v;
int *pu; /* puntero a un entero */
int *pv; /* puntero a un entero */
En la primera línea vemos que u tiene el valor 3, como está especificado en la instrucción de
declaración. La dirección de u está directamente determinada por el compilador como 12FF88
hexadecimal. Al puntero pu se le asigna este valor; por tanto pu también representa la dirección
12FF88 hexadecimal. Finalmente el valor al que apunta pu (el valor almacenado en la celda de
memoria cuya dirección es 12FF88) es 3.
Análogamente, la segunda línea muestra que v representa el valor 3. Esto era lo esperado, ya
que hemos asignado el valor *pu a v. La dirección de v, y por tanto el valor de pv es 12FF84.
Observemos que u y v tienen direcciones diferentes. Y finalmente, vemos que el valor al que
apunta pv es 3.
Declaración de punteros
tipo *nombre;
donde tipo es cualquier tipo válido de C (el tipo base del puntero) y nombre es el nombre de la
variable puntero.
El tipo base del puntero define el tipo de variables a las que puede apuntar el puntero.
Los dos operadores especiales de punteros son & y *.
& devuelve la dirección de memoria de su operando.
* es el complemento de &: devuelve el valor de la variable localizada en la
dirección que sigue.
void main()
{
int u = 3;
int *pu;
pu = &u; /* pu apunta a u */
printf("\n*pu= %d u= %d", *pu, u);
*pu = 0; /* reasigna u indirectamente */
printf("\n\n*pu= %d u= %d", *pu, u);
getch();
}
*pu= 3 u= 3
*pu= 0 u= 0