You are on page 1of 6

Puntero (programacin)

De Wikipedia, la enciclopedia libre


Saltar a navegacin, bsqueda Un puntero (o apuntador) es una variable manipulable que referencia una regin de memoria; en otras palabras es una variable cuyo valor es una direccin de memoria. Si se tiene una variable ' p ' de tipo puntero que contiene una direccin de memoria en la que se encuentra almacenado un valor ' v ' se dice que p apunta a v.
[Memoria] | . | | . | | . | ----|---------| | p |---->| v | ----|---------| | . | | . | | . |

Trabajar con punteros implica la no manipulacin de las variables en s, sino manejar direcciones de memoria en la cuales residen los datos. Los punteros son de amplia utilizacin en programacin y casi todos los lenguajes permiten la manipulacin de los mismos. La razn de ser principal de los punteros reside en manejar datos alojados en la zona de memoria dinmica o heap (aunque tambin se pueden manipular objetos en la zona esttica), bien sean datos elementales, estructuras (struct en C) u objetos pertenecientes a una clase (en lenguajes Orientados a Objetos). Gracias a esta propiedad, los punteros permiten modelar un grafo, en donde los elementos de ste son los datos residentes en memoria y las relaciones entre los elementos son los propios apuntadores. Sin embargo, los punteros son un gran dolor de cabeza para los programadores novatos y para cualquier programador que deba depurar una aplicacin. En nuevos lenguajes de alto nivel, los punteros se han tratado de abstraer. De tal forma que en el lenguaje C# slo pueden ser usados en zonas de cdigo delimitadas como "inseguras", o llegando a su total desaparicin en lenguajes como Java o Eiffel.

Ejemplo de uso de punteros en una estructura en C [editar]


(El ejemplo que sigue es propio del lenguaje C/C++ y no es de aplicacin en otros lenguajes de programacin).
struct Elemento // Ejemplo de un nodo de lista doble enlazada { int dato; struct Elemento *siguiente; // Para la declaracin de un puntero se usa '*' struct Elemento *anterior; };

Para acceder a los atributos como punteros de una estructura que va a ser tratada como tal, se debe desreferenciar el puntero y acceder a sus miembros como se hara con una variable normal, o usar directamente el operador: ->. De tal modo que:
Elemento *elem; Elemento sig1 = (*elem).siguiente; Elemento sig2 = elem->siguiente; /* Se cumple que: sig1==sig2 */

Otro ejemplo en C++


void swap(int *x, int *y) { int temp; temp = *x; // copia el valor apuntado por x a temp *x = *y; // copia el valor apuntado por y en la ubicacin del puntero x *y = temp; // copia el valor de temp en la ubicacin apuntada por y }

12 Tipos de variables IV: Punteros 1


Los punteros proporcionan la mayor parte de la potencia al C y C++, y marcan la principal diferencia con otros lenguajes de programacin. Una buena comprensin y un buen dominio de los punteros pondr en tus manos una herramienta de gran potencia. Un conocimiento mediocre o incompleto te impedir desarrollar programas eficaces. Por eso le dedicaremos mucha atencin y mucho espacio a los punteros. Es muy importante comprender bien cmo funcionan y cmo se usan. Para entender qu es un puntero veremos primero cmo se almacenan los datos en un ordenador. La memoria de un ordenador est compuesta por unidades bsicas llamadas bits. Cada bit slo puede tomar dos valores, normalmente denominados alto y bajo, 1 y 0. Pero trabajar con bits no es prctico, y por eso se agrupan. Cada grupo de 8 bits forma un byte u octeto. En realidad el microprocesador, y por lo tanto nuestro programa, slo puede manejar directamente bytes o grupos de dos o cuatro bytes. Para acceder a los bits hay que acceder antes a los bytes. Y aqu llegamos al quid, cada byte tiene una direccin, llamada normalmente direccin de memoria. La unidad de informacin bsica es la palabra, dependiendo del tipo de microprocesador una palabra puede estar compuesta por dos, cuatro, ocho o diecisis bytes. Hablaremos en estos casos de plataformas de 16, 32, 64 128 bits. Se habla indistintamente de direcciones de memoria, aunque las palabras sean de distinta longitud. Cada direccin de memoria contiene siempre un byte. Lo que suceder cuando las palabras sean de 32 bits es que accederemos a posiciones de memoria que sern mltiplos de 4. Todo esto sucede en el interior de la mquina, y nos importa ms bien poco. Podemos saber qu tipo de plataforma estamos usando averiguando el tamao del tipo int, y para ello hay que usar el operador "sizeof()", por ejemplo:
cout << "Plataforma de " << 8*sizeof(int) << " bits";

Ahora veremos cmo funcionan los punteros. Un puntero es un tipo especial de variable que contiene, ni ms ni menos que, una direccin de memoria. Por supuesto, a partir de esa direccin de memoria puede haber cualquier tipo de objeto: un char, un int, un float, un array, una estructura, una funcin u otro puntero. Seremos nosotros los responsables de decidir ese contenido. Intentemos ver con mayor claridad el funcionamiento de los punteros. Podemos considerar la memoria del ordenador como un gran array, de modo que podemos acceder a cada celda de memoria a travs de un ndice. Podemos considerar que la primera posicin del array es la 0 celda[0].

Si usamos una variable para almacenar el ndice, por ejemplo, indice=0, entonces celda[0] == celda[indice]. Prescindiendo de la notacin de los arrays, el ndice se comporta exactamente igual que un puntero. grafico El puntero ndice podra tener por ejemplo, el valor 3, en ese caso, *indice tendra el valor 'valor3'. Las celdas de memoria existirn independientemente del valor de indice, o incluso de la existencia de indice, por lo tanto, la existencia del puntero no implica nada ms que eso, pero no que el valor de la direccin que contiene sea un valor vlido de memoria. Dentro del array de celdas de memoria existirn zonas que contendrn programas y datos, tanto del usuario como del propio sistema operativo o de otros programas, el sistema operativo se encarga de gestionar esa memoria, prohibiendo o protegiendo determinadas zonas. El propio puntero, como variable que es, ocupar ciertas direcciones de memoria. En principio, debemos asignar a un puntero, o bien la direccin de un objeto existente, o bien la de uno creado explcitamente durante la ejecucin del programa. El sistema operativo suele controlar la memoria, y no tiene por costumbre permitir el acceso al resto de la memoria.

Declaracin de punteros:
Los punteros se declaran igual que el resto de las variables, pero precediendo el identificador con el operador de indireccin, (*), que leeremos como "puntero a". Sintaxis:
<tipo> *<identificador>;

Ejemplos:
int *entero; char *carcter; struct stPunto *punto;

Los punteros siempre apuntan a un objeto de un tipo determinado, en el ejemplo, "entero" siempre apuntar a un objeto de tipo "int". La forma:
<tipo>* <identificador>;

con el (*) junto al tipo, en lugar de junto al identificador de variable, tambin est permitida.

Veamos algunos matices. Tomemos el primer ejemplo:


int *entero;

equivale a:
int* entero;

Debes tener muy claro que "entero" es una variable del tipo "puntero a int", que "*entero" NO es una variable de tipo "int". Como pasa con todas las variables en C++, cuando se declaran slo se reserva espacio para almacenarlas, pero no se asigna ningn valor inicial, el contenido de la variable permanecer sin cambios, de modo que el valor inicial del puntero ser aleatorio e indeterminado. Debemos suponer que contiene una direccin no vlida. Si "entero" apunta a una variable de tipo "int", "*entero" ser el contenido de esa variable, pero no olvides que "*entero" es un operador aplicado a una variable de tipo "puntero a int", es decir "*entero" es una expresin, no una variable.

Obtener punteros a variables:


Para averiguar la direccin de memoria de cualquier variable usaremos el operador de direccin (&), que leeremos como "direccin de". Por supuesto, los tipos tienen que ser "compatibles", no podemos almacenar la direccin de una variable de tipo "char" en un puntero de tipo "int". Por ejemplo:
int A; int *pA; pA = &A;

Segn este ejemplo, pA es un puntero a int que apunta a la direccin donde se almacena el valor del entero A.

Diferencia entre punteros y variables:


Declarar un puntero no crear un objeto. Por ejemplo: int *entero; no crea un objeto de tipo "int" en memoria, slo crea una variable que puede contener una direccin de memoria. Se puede decir que existe fsicamente la variable "entero", y tambin que esta variable puede contener la direccin de un objeto de tipo "int". Lo veremos mejor con otro ejemplo:
int A, B; int *entero; ... B = 213; /* B vale 213 */ entero = &A; /* entero apunta a la

direccin de la variable A */ *entero = 103; /* equivale a la lnea A = 103; */ B = *entero; /* equivale a B = A; */ ...

En este ejemplo vemos que "entero" puede apuntar a cualquier variable de tipo "int", y que podemos hacer referencia al contenido de dichas variables usando el operador de indireccin (*). Como todas las variables, los punteros tambin contienen "basura" cuando son declaradas. Es costumbre dar valores iniciales nulos a los punteros que no apuntan a ningn sitio concreto:
entero = NULL; caracter = NULL;

NULL es una constante, que est definida como cero en varios ficheros de cabecera, como "cstdio" o "iostream", y normalmente vale 0L.

You might also like