,
El puntero en el lenguaje C es una herramienta muy poderosa para realizar ciertas tareas. Es un concepto que necesitas comprender si quieres mejorar tus habilidades en C. Algunos algoritmos serán más complicados o incluso imposibles de escribir sin el uso de punteros.
Introducción
En un programa, cualquier elemento definido (variables, objetos, funciones, etc.) se almacena en memoria en una dirección determinada. Para encontrar este elemento, basta con conocer la dirección de memoria utilizada por el elemento, o la primera dirección utilizada si la variable ocupa varias zonas de memoria.
Un puntero es una variable que contiene la dirección de memoria de otra variable (u objeto). Aunque el valor de un puntero es siempre un número entero, su tipo depende del objeto al que apunte.
Declarar un puntero
El tipo del puntero debe ser idéntico al tipo de la variable a la que se dirige.
<type> * <pointer_name> //o <type> *<pointer_name>
Ex:
float myfloat float * myfloataddress; int myint int * myintaddress;
Por tanto, podemos inicializar la variable y su dirección en la misma línea
int i,*pi;
Operación con punteros
La dirección de una variable es un número entero. Por lo tanto, es posible sumar y restar un entero a una dirección para obtener un puntero del mismo tipo a una dirección diferente.
ptr+i –>dirección contenida en ptr + i * tamaño del tipo ptr
También se pueden restar dos direcciones que apunten al mismo tipo. La resta es útil, por ejemplo, cuando los dos punteros apuntan a la misma matriz para averiguar el número de elementos entre los dos elementos apuntados.
ptr1-ptr2 -> (dirección apuntada por ptr1 – dirección apuntada por ptr2)/( tipo tamaño de ptr1 y ptr2)
También es posible comparar valores de direcciones utilizando los operadores <,>,<=,>=,!= y ==.
Modificación del valor de una variable mediante un puntero
En el siguiente ejemplo, x es una variable entera y p es un puntero entero que contiene la dirección de la variable x. El valor de x inicializado en 3 se cambia a 21 utilizando el puntero. El valor de x, inicializado en 3, se cambia a 21 utilizando el puntero.
int x=3; int * p=&amp;x; *p=21; // is equivalent to x=21; printf("valeur de *p = %d\n",*p); // equivalent to printf("valeur de x = %d\n",x);
Modificación de una variable en la entrada de una función
En C, una función sólo puede devolver una única variable. Para devolver varios valores, es posible utilizar los punteros de estas variables de entrada en lugar de devolver los propios valores.
#include <iostream> int myparam=5; struct mystruct_T{ int val1; int val2; }STRUCT; void change_struct( mystruct_T * mystruct, int * param) { mystruct->val1=10; *param=26; } int main(){ change_struct(&STRUCT, &myparam); printf("Struct.val1 : %d",STRUCT.val1); printf("param : %d",myparam); }
Con este método, es posible modificar varias variables como si la función devolviera varios valores.
Breve resumen
- Un puntero es una variable que contiene la dirección de otra variable
- Para acceder a la dirección de la variable var utilizamos el operador de dirección(&): &var
- Para obtener el valor de la variable a partir de la dirección, utilice el operador de indirección(*): *puntero
- Cuando se utiliza un puntero de estructura, se utiliza el operador -> para acceder al miembro de la estructura: mystruct->elm1
- Es posible señalar funciones