8.2) Definición y declaración de Punteros. |
Un puntero es una variable que contiene la dirección
de otra variable.
También podríamos decir que un
puntero
es una variable que representa la posición (más que el valor)
de otro dato, tal como una variable o un elemento de un array.
Cuando una variable puntero es definida, el nombre de la variable debe ir precedido de un asterisco (*). Este identifica que la variable es un puntero. Por tanto, una declaración de puntero puede ser escrita en téminos generales como:
<tipo> es cualquier tipo de variable en C.
<identificador> es el nombre del puntero. El tipo o tipo base, indica el tipo de variables que se podrán manipular a través del puntero. Es importante conocer el tipo base de un puntero, puesto que toda la aritmética de punteros se realiza con relación a la base. (Luego lo veremos más claro en los ejemplos).
& Devuelve la dirección de memoria del operando. | |
* Devuelve el valor almacenado en la dirección de memoria que determina el operando. |
NOTA IMPORTANTE: Es importante que los punteros siempre apunten a variables del mismo tipo. Si se mezclan los tipos, los resultados son erróneos. También es importante inicializar los punteros antes de utilizarlos. Si no se inicializan, es decir, si no apuntan a algún sitio válido, se pueden alterar otras zonas de memoria, ya se a del propio programa o del sistema operativo. |
Los punteros se pueden comparar entre ellos y se pueden asignar direcciones de memoria. Además, se pueden decrementar o incrementar. El incremento o el decremento varía según el tipo de dato al que apunten. A los punteros también se les puede sumar o restar números enteros. NO SE PUEDE REALIZAR NINGUNA OTRA OPERACIÓN ARITMÉTICA CON LOS PUNTEROS.
Los punteros son usados con frecuencia
en C, y tienen gran cantidad de aplicaciones:
Proporcionan una forma de devolver varios datos desde una función mediante los argumentos de la función. | |
Nos permiten igualmente, que referencias a otras funciones puedan ser especificadas como argumentos de una función (pasar funciones como argumentos en una función determinada). |
Supongamos que
v una variable que representa una determinado
dato, esta variable le corresponde una dirección de memoria, esta
dirección de memoria puede ser accedida mediante &v
(el
operador unario & proporciona la dirección del operando v).
Es importante recordar que si asignamos
&v
a
una variable pv,
dicha variable me va a representar la dirección de memoria de v,
y no su valor. Si queremos acceder al valor que posee la dirección
de x tendremos
que poner: *pv (donde
* es un operador unario, llamado operador indirección, que opera
sólo sobre una variable puntero). Entonces vemos que tanto
v como como *pv,
representan el mismo valor. Si ahora asignáramos a una variable
u
el
valor de
*pv,
entonces voy a tener u
y v representando
al mismo valor.
Ejemplo: Se muestran a continuación una serie de declaraciones y asignaciones de punteros que nos pueden ayudar a comprender la esncia de las variables dinámicas.
Dentro de una declaración de variable,
una variable puntero puede ser inicializada asignándole la dirección
de otra variable. Hay que tener en cuenta que la variable cuya dirección
se asigna al puntero debe estar previamente declarada en el programa. Veamos
que las siguientes declaraciones son equivalentes, sin embargo, es conveniente
usar la segunda ya que es mucho más clarificadora.
float u, v; /* 1*/
float *pv=&v; |
float u, v; /* 1 */
float *pv; /* 2 */ ............. pv=&v; /* 3 */ |
/* 1 */ declaración de variables en coma flotante. |
/* 2 */ declaración de variables puntero. |
/* 3 */ asignar la dirección de v a pv. |
Ejemplo: Por último, para acabar este apartado pondremos un ejemplo sencillo de variables puntero con una explicación gráfica, de la traza que se va produciendo.