Facebook Twitter RSS Reset

Declarar punteros en C y C++

¿Qué es un PUNTERO?:

Un puntero es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable.

No hay que confundir una dirección de memoria con el contenido de esa dirección de memoria.

Las direcciones de memoria dependen de la arquitectura del ordenador y de la gestión que el sistema operativo haga de ella.

En lenguaje ensamblador se debe indicar numéricamente la posición física de memoria en que queremos almacenar un dato. De ahí que este lenguaje dependa tanto de la máquina en la que se aplique.

En C no debemos, ni podemos, indicar numéricamente la dirección de memoria, si no que utilizamos una etiqueta que conocemos como variable (en su día definimos las variables como direcciones de memoria). Lo que nos interesa es almacenar un dato, y no la localización exacta de ese dato en memoria.

Una variable puntero se declara como todas las variables. Debe ser del mismo tipo que la variable apuntada. Su identificador va precedido de un asterisco (*):

int *punt;

Es una variable puntero que apunta a variable que contiene un dato de tipo entero llamada punt.

char *car:

Es un puntero a variable de tipo carácter.

long float *num;

float *mat[5]; // . . .

*Un puntero tiene su propia dirección de memoria: &punt, &car

Es decir: hay tantos tipos de punteros como tipos de datos, aunque también pueden declararse punteros a estructuras más complejas (funciones, struct, ficheros…) e incluso punteros vacíos (void ) y punteros nulos (NULL).

Finalmente habiendo contextualizado pasaremos a la manera de declarar punteros:

int *p; p es un puntero a un entero

int *p[10]; p es un array de 10 punteros a enteros

int (*p)[10]; p es un puntero a un array de 10 enteros

int *p(void); p es una función que devuelve un puntero a entero

int p(char *a); p es una función que acepta un argumento que es un puntero a carácter, devuelve un entero

int *p(char *a); p es una función que acepta un argumento que es un puntero a carácter, devuelve un puntero a entero

int (*p)(char *a); p es un puntero a función que acepta un argumento que es un puntero a carácter, devuelve un puntero a entero

int (*p(char *a))[10];p es una función que acepta un argumento que es un puntero a carácter, devuelve un puntero a un array de 10 enteros

int p(char (*a)[]); p es un puntero a función que acepta un argumento que es un puntero a un array de caracteres, devuelve un puntero a entero

int p(char *a[]);p es un puntero a función que acepta un argumento que es un array de punteros a

caracteres, devuelve un puntero a entero

int *p(char a[]); p es una función que acepta un argumento que es un array de caracteres, devuelve un puntero a entero

int *p(char (*a)[]); p es una función que acepta un argumento que es un puntero a un array de

caracteres, devuelve un puntero a entero

int *p(char *a[]); p es una función que acepta un argumento que es un puntero a un array de punterosa caracteres, devuelve un puntero a entero

int (*p)(char (*a)[]); p es una función que acepta un argumento que es un puntero a un array de

caracteres, devuelve un puntero a entero

int *(*p)(char (*a)[]); p es un puntero a una función que acepta un argumento que es un puntero a unarray de punteros a caracteres, devuelve un puntero a entero

int *(*p)(char *a[]); p es un puntero a una función que acepta un argumento que es un array de punteros a caracteres, devuelve un puntero a entero

int (*p[10])(void); p es una array de 10 punteros a función, cada función devuelve un entero

int (*p[10])(char * a); p es una array de 10 punteros a función; cada función acepta un argumento que es un puntero a carácter y devuelve un entero.

int *(*p[10])(char a);p es una array de 10 punteros a función; cada función acepta un argumento que es un carácter, y devuelve un puntero a entero.

char *(*p[10])(char * a); p es una array de 10 punteros a función; cada función acepta un argumento que es un carácter, y devuelve un puntero a caracter.

Si les cuesta un poco entender el tema de punteros, les recomiendo el siguiente video: