Universidad Carlos III de Madrid

Grado en Ing. Telemática/Sist. Audiovisuales/Sist. de Comunicaciones

Arquitectura de Sistemas

Septiembre 2012 - Enero 2013

4. Asignación de una dirección a un puntero

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.

Sugerencia

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.

4.1. Preguntas de autoevaluación

  1. Se define las variables a de tipo entero, b de tipo puntero a entero, y c de tipo puntero a puntero a entero. ¿Cómo se consigue que c tenga la dirección de la dirección del entero a?

    • c = b; b = a;

    • c = b; b = &a;

    • c = &b; b = a;

    • c = &b; b = &a;

  2. Dadas dos variables de cualquier tipo en un programa en C, considera la siguiente expressión:

    &a == &b;
    • La expresión es incorrecta.

    • La expresión es correcta y es siempre falsa.

    • La expresión es correcta y es siempre cierta.

    • La expresión es correcta y es cierta o false dependiendo de los valores de a y b.