Dada una variable var
de tipo t
y
una variable var_ptr
de tipo puntero a t (t
*
) es posible asignar
var_ptr = &var
El siguiente ejemplo muestra la declaración y asignación de valores a punteros (fichero pointer_example_1.c):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <stdio.h> int main() { int num1, num2; int *ptr1, *ptr2; ptr1 = &num1; ptr2 = &num2; num1 = 10; num2 = 20; ptr1 = ptr2; ptr2 = NULL; return 0; } |
Las líneas 4 y 5 definen dos enteros y dos punteros a
enteros respectivamente. Los punteros se comportan como el resto de
variables, no tienen valor inicial al comienzo del programa. Las líneas 7 y
8 asignan las direcciones de las dos variables. La dirección de una variable
existe desde el principio de un programa, y por tanto esta asignación es
correcta a pesar de que todavía no hemos almacenado nada en las variables
num1
y num2
.
Esta es una fuente común de anomalías. La dirección de una variable se puede obtener en cualquier punto del programa. Un error frecuente consiste en obtener la dirección de una variable cuando esta no tiene valor alguno asignado. El valor del puntero es correcto, pero el valor al que apunta no. En el ejemplo anterior, antes de ejecutar la línea 10, el programa tiene dos punteros inicializados, pero los valores a los que apuntan no lo están.
La línea 13 es una asignación de un puntero a otro. El valor
de ptr2
es la dirección de num2
tal y como se ha
asignado anteriormente. Como resultado, ptr1
contiene también
ahora la dirección de num2
.
La línea 14 asigna al puntero ptr2
la constante
NULL
que está definida en el fichero
stdio.h
incluido en la primera línea del programa. Esta
constante representa el “puntero vacío”. Su valor numérico es
cero, y cuando un puntero tiene este valor no está apuntando a nada.
La siguiente figura muestra la evolución de las variables en diferentes puntos de ejecución. Las direcciones de memoria en las que están almacenadas las variables son arbitrarias.
Copia y pega el contenido del programa anterior en un fichero de texto en tu entorno de desarrollo. Compila para comprobar su corrección sintáctica. Realiza cambios en las declaraciones y asignaciones y re-compila para comprobar su corrección.