[Índice][Previo] [Siguiente]
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
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 apuntan a la misma variable.
Siempre que se realiza una operación aritmética sobre un puntero, sumando o restando
un entero, el puntero se incrementa o decrementa un número apropiado de sitios tal que el
nuevo valor apunta a la variable que está n elementos (no n bytes) antes o después
que el dado. De la misma forma, al restar dos punteros se obtiene el número de objetos entre
las dos localizaciones. Finalmente, dos punteros son iguales si y sólo si apuntan a la misma
variable (el valor de las direcciones es el mismo). No son necesariamente iguales si sus valores
indirectos son los mismos, ya que estas variables podrían estar en diferentes localizaciones
de memoria.
La siguiente tabla resume los operadores que manipulan punteros:
Operador | Acción
|
---|
*p | Contenido
|
&x | Puntero a un objeto
|
p[i] | Elemento de un vector
|
p->m | Selección de miembros de una clase
|
++p | Preincremento al siguiente elemento
|
p++ | Postincremento al siguiente elemento
|
--p | Predecremento al elemento anterior
|
p-- | Postdecremento al elemento anterior
|
p += n | Incremento en n elementos
|
p -= n | Decremento en n elementos
|
p+n | Offset en n elementos
|
p-n | Offset en n elementos
|
new T | Reserva de memoria para el objeto T
|
new T[n] | Reserva memoria para un vector de n objetos de tipo T
|
delete p | Libera la memoria reservada para p
|
delete [] p | Libera la memoria reservada para un vector de objetos
|
|
|
[Índice][Previo] [Siguiente]
Última modificación: 2-4-97
Comentarios, sugerencias, ideas...
© Beatriz Fuentes Arenaz, 1996-1997