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 |
---|---|---|---|---|
int | 4 | int * | 4 | int *a, *b, *c; |
unsigned int | 4 | unsigned int * | 4 | unsigned int *d, *e, *f; |
short int | 2 | short int * | 4 | short int *g, *h, *i; |
unsigned short int | 2 | unsigned short int * | 4 | unsigned short int *j, *k, *l; |
long int | 4 | long int * | 4 | long int *m, *n, *o; |
unsigned long int | 4 | unsigned long int * | 4 | unsigned long int *p, *q, *r; |
char | 1 | char * | 4 | char *s, *t; |
unsigned char | 1 | unsigned char * | 4 | unsigned char *u, *v; |
float | 4 | float * | 4 | float *w, *x; |
double | 8 | double * | 4 | double *y, *z; |
long double | 8 | long double * | 4 | long 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.