Punteros
Un puntero es un objeto del lenguaje de programación, cuyo valor se refiere a (o "apunta a") otro valor almacenado en otra parte de la memoria del ordenador utilizando su dirección. Un puntero referencia a una ubicación en memoria, y a la obtención del valor almacenado en esa ubicación se la conoce como desreferenciación del puntero. A modo de analogía, un número de página en el índice de un libro podría considerarse un puntero a la página correspondiente; desreferenciar un puntero sería como ir a la página con el número de página especificada en el índice.
Operadores de punteros
Un puntero es una variable cuyo Rvalue es justamente la dirección en memoria de un objeto x. Es decir: Rvalue(p) == Lvalue(x). Además de los operadores aritméticos, de los que existen versiones para los tipos numéricos y para los punteros, C++ dispone de dos operadores específicos para estos últimos (punteros de cualquier tipo): la indirección * y la referencia &. Además existen dos operadores específicos para punteros-a-clases.
Operador de dirección *
Este operador unitario "deferencia" el operando (que debe ser un puntero). Es decir, devuelve el valor del objeto señalado por el operando. El símbolo * tiene tres usos en C++: operador de multiplicación, indicador de tipo de variable (tipo puntero) y operador de indirección.
Sintaxis
Operando cast-expresión debe ser una expresión que se resuelva a un puntero-a-objeto, o a-función. Cuando se usa como operador de indirección se espera que el operando sea una variable de tipo puntero de cualquier tipo (a objeto, o a función). Si el operando es un puntero-a-función, el resultado es un designador de función que puede ser utilizado para invocación de la misma. Si ptr es un puntero-a-X, entonces se cumple que *ptr es el objeto apuntado por ptr y su tipo es el de X. Es decir:
Operador de referencia &
Este operador unitario es complementario del de indirección. Cuando se aplica a un objeto devuelve la dirección de almacenamiento del objeto (valor que puede ser asignado a un puntero). En C++ el símbolo & se utiliza también como declarador de referencia; casi siempre para pasar argumentos a funciones.
Sintaxis
El operando cast-expresión debe ser alguno de los siguientes:
· Un identificador cualificado. Ejemplo:
· El designador de una función. Ejemplo:
· Un Lvalue designando un objeto X que no sea un campo de bits ni tenga un especificador de almacenamiento tipo registro. Recuerde que no es posible obtener la dirección de una variable de registro. Es decir, no se le puede aplicar le operador de referencia a una de estas variables. Tampoco se puede aplicar al valor devuelto por una función, en consecuencia, la expresión x = &func(x); es incorrecta, ya que el valor devuelto por func() es del tipo registro (está en la pila que no es direccionable por este método). Regla: el operador de referencia no puede ser aplicado al valor devuelto por una función.
Declaraciones de punteros
Para declarar un puntero se le debe informar a C que es lo que uno desea almacenar en memoria, por lo tanto se le informa el tipo de lo almacenado, por ejemplo:
- char *p; (puntero a char)
- int *p; (puntero a int)
- float *p; (puntero a float)
La forma general de la declaración de un puntero es tipo *variable;
Ejemplo:
int x=1, y=2;
int *ip; /* ip es un puntero a int*/
ip = &x; /* ip apunta a la dirección de x */
y = *ip; /* y = 1 */
*ip = 0; /* x = 0 */
Operaciones con punteros
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
Número de elementos 2
Comentarios
Publicar un comentario