UC3M

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

Arquitectura de Sistemas

Septiembre 2017 - Enero 2018

5.3. El tipo de datos puntero a

El operador & seguido del nombre de una variable devuelve su dirección de memoria. El tipo de datos del resultado es puntero a seguido del tipo de la variable utilizada. La regla para obtener la sintaxis y el significado de estos tipos de datos es:

Para todo tipo de datos T existe un tipo de datos que se denomina Puntero a T definido como T *.

En la siguiente tabla se muestran las consecuencias de aplicar esta regla a los tipos de datos básicos en C, así como ejemplos de declaración de variables.

Tipo T Tamaño (bytes) [a] Puntero a T Tamaño (bytes) Ejemplo de uso
int4int *4int *a, *b, *c;
unsigned int4unsigned int *4unsigned int *d, *e, *f;
short int2short int *4short int *g, *h, *i;
unsigned short int2unsigned short int *4unsigned short int *j, *k, *l;
long int4long int *4long int *m, *n, *o;
unsigned long int4unsigned long int *4unsigned long int *p, *q, *r;
char1char *4char *s, *t;
unsigned char1unsigned char *4unsigned char *u, *v;
float4float *4float *w, *x;
double8double *4double *y, *z;
long double8long double *4long double *a1, *a2;

[a] Valores de referencia, pueden cambiar dependiendo de la plataforma

Además de los punteros a los tipos de datos creados, C permite declarar un puntero genérico de tipo void *. Una variable de este tipo almacena un puntero a cualquier dato. Se recomienda utilizar este tipo de datos sólo cuando sea estrictamente necesario.

El tamaño de los punteros es siempre el mismo independientemente del dato al que apuntan porque todos ellos almacenan una dirección de memoria. Para las estructuras de datos, la regla se aplica de forma idéntica. El siguiente ejemplo muestra la definición de una estructura y la declaración de una variable de tipo estructura y otra de tipo puntero a esa estructura:

La variable contact1 es de tipo estructura y ocupa 44 bytes (20 + 20 + 4), mientras que contactPointer es de tipo puntero y ocupa 4 bytes.

5.3.1. Preguntas de autoevaluación

  1. Se define un array de dos enteros de 4 bytes del tipo int array[2] y está almacenado a partir de la posición 100 de memoria. Se ejecuta el código:

    array[0] = 20;
    array[1] = 30;

    ¿Qué valor tiene el entero almacenado en la posición de memoria 104?

    • 2

    • 20

    • 30

    • 104

    ¿Y en qué dirección está almacenado el primer elemento del array?

    • 100

    • 101

    • 102

    • 103

  2. En un programa se definen estas dos variables:

    int i = 10;
    int *i_ptr;

    Si la variable i está almacenada en la posición de memoria 100, ¿qué valor contiene la variable i_ptr?

    • La valor 100 que es la dirección de la variable i

    • El valor 104 porque es la posición siguiente a la que ocupa i.

    • Ningún valor porque no ha sido inicializada.

    • Su propia dirección de memoria.

  3. Si una variable tiene que almacenar la dirección de la dirección de un carácter, ¿qué tipo debe tener su declaración?

    • char *

    • ** char

    • char **

    • string **