Definición y declaración de Punteros
Enviado por Canquiz1223 • 9 de Enero de 2015 • Trabajo • 2.088 Palabras (9 Páginas) • 311 Visitas
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érminos 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 esencia 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: Posteriormente mostramos una demostración de las distintas formas en las que se nos puede presentar un puntero así como los incrementos de direcciones y de valores apuntados, teniendo en cuenta la precedencia de operadores que se vio en el capítulo 2.
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.
Operadores
Existen dos operadores a tener en cuenta cuando trabajamos con punteros. El operador de dirección (&) que devuelve la dirección de memoria de su operando y el operador de indirección (*) que devuelve un alias para el objeto al cual apunta el operando del puntero.
En el siguiente ejemplo vemos como se inicializa una variable X con el valor 15. Luego se crea un puntero a int y por último el puntero pasa a apuntar a la variable X. Esto es, ptrX es un puntero a X.
int X = 15;
int *ptrX;
ptrX = &X;
Operaciones
Un puntero es un tipo de dato similar a un entero, y hay un conjunto de operaciones definidas para punteros:
• La suma o resta de un entero produce una nueva localización de memoria.
• Se pueden comparar punteros, utilizando expresiones lógicas, para ver si están apuntando o no a la misma dirección de memoria.
• La resta de dos punteros da como resultado el número de variables entre las dos direcciones.
Veamos un ejemplo de utilización de punteros:
#include <iostream.h>
main()
{
int vector[3];
int* princPunt = vector;
int* finPunt = &vector[2];
vector[2] = 15;
cout << *(princPunt+2) << '\t' << *finPunt <<'\n';
if (princPunt == finPunt)
cout << " Esto no puede suceder " << '\n';
cout << "Numero de elementos \t" <<finPunt-princPunt << '\n';}
El resultado de la ejecución de este programa es:
15 15
Numero de elementos 2
Veamos cómo trabaja este programa:
• princPunt es la dirección del primer elemento de vector, y finPunt la dirección del último elemento. int princPunt = vector; es una combinación de declaración y definición.
• La expresión *(princPunt+2) incrementa el valor del puntero princPunt en dos y devuelve el número guardado en esa localización, es decir, apunta a la tercera localización de memoria y su valor es 15.
• Se pueden utilizar también enteros en formato hexadecimal. Así,
cout << *(princPunt + 17 )
y
cout << *(princPunt + 0x11 )
producen la misma salida.
• La expresión princPunt == finPunt comprueba si los dos punteros son iguales. Esto sólo puede ser verdad si los dos punteros
...