Puntero (informática)

De Wikipedia, la enciclopedia libre

(Redirigido desde Puntero (programación))

Un puntero o apuntador es una variable que referencia una región de memoria; en otras palabras es una variable cuyo valor es una dirección de memoria. Si se tiene una variable ' p ' de tipo puntero que contiene una dirección 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 manipulación de las variables en sí, sino manejar direcciones de memoria en la cuales residen los datos.

Contenido

[editar] Introducción

Los punteros son de amplia utilización en programación y casi todos los lenguajes permiten la manipulación de los mismos. La razón de ser principal de los punteros reside en manejar datos alojados en la zona de memoria dinámica o heap (aunque también se pueden manipular objetos en la zona estática), 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 aplicación.

En nuevos lenguajes de alto nivel, los punteros se han tratado de abstraer. De tal forma que en el lenguaje C# sólo pueden ser usados en zonas de código delimitadas como "inseguras", o llegando a su total desaparición en lenguajes como Java o Eiffel.

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

El ejemplo que sigue es propio del lenguaje C/C++ y no es de aplicación en otros lenguajes de programación:

struct Elemento // Ejemplo de un nodo de lista doble enlazada
{
    int dato;
    struct Elemento *siguiente; // Para la declaración 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 haría 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 ubicación del puntero x
    *y = temp;  // copia el valor de temp en la ubicación apuntada por y
}

Ejemplo en C# (C Sharp)

//Suma de dos números enteros
private unsafe int Suma(int* a, int* b)
{
    return *a + *b;
}
 
// Su uso (El método llamador también debe tener la palabra clave 'unsafe'):
// int x, y;
// int *ptr1 = &x;
// int *ptr2 = &y;
// Suma(ptr1, ptr2);

[editar] Véase también

[editar] Enlaces externos

Herramientas personales
Crear un libro