Puntero (informática)

Considero que las sentencias de asignación y variables puntero están entre los tesoros más valiosos de la informática
Donald Knuth, Structured Programming with go to Statements[1]

En ciencias de la computación, 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.

          [ Memoria ]
          |    ·    |
          |    ·    |
          |    ·    |
+---+     |---------|
| p |---->|    v    |
+---+     |---------|
          |    ·    |
          |    ·    |
          |    ·    |

Los punteros a datos mejoran significativamente el rendimiento de las operaciones repetitivas tales como cadenas de desplazamiento, tablas de búsqueda, tablas de control y estructuras árbol. En particular, muchas veces es mucho más barato en tiempo y espacio copiar y des referenciar punteros que copiar y acceder a los datos a los cuales apunta el puntero.

Los punteros también se utilizan para mantener las direcciones de los puntos de entrada para las subrutinas para llamadas en programación por procedimientos y enlaces para vincular a las bibliotecas de enlace dinámico (DLL) en tiempo de ejecución. En la programación orientada a objetos, los punteros a funciones se utilizan para métodos de unión, muchas veces utilizando lo que se llama tablas de métodos virtuales.

Un puntero es una implementación más concreta y simple del tipo de datos de referencia más abstracto. Varios lenguajes soportan algún tipo de puntero, aunque algunos tengan más restricciones en su uso que otros. Mientras que se utilice un "puntero" para referirse a referencias en general, se aplica más propiamente a las estructuras de datos cuya interfaz permita explícitamente que el puntero sea manipulado (aritméticamente vía aritmética de punteros) como una dirección de memoria, en oposición a una cookie u opción dónde esto no sea posible.[ cita requerida] Debido a que los punteros permiten tanto proteger como permitir el acceso a direcciones de memoria, hay riesgos asociados con su uso, sobre todo en este último caso. Generalmente, los punteros primitivas son almacenados en un formato similar a un entero; no obstante, intentar eliminar la referencia o "mirar hacia arriba" hacia un puntero cuyo valor no fue nunca una dirección de memoria válida conllevaría provocar que un programa se bloquee. Para aliviar este potencial problema, como una cuestión de seguridad de tipos, los punteros son considerados un tipo separado parametrizado por un tipo de datos que apuntan a, incluso si la representación subyacente es un número entero. También se pueden tomar otras medidas (como la validación y comprobación de los límites, para verificar el contenido de la variable de puntero contenga un valor que es a la vez una dirección de memoria válida y dentro del rango numérico que el procesador sea capaz de abordar).

Other Languages