Pointer (programación de computadoras)


Considero que las declaraciones de asignación y las variables de puntero se encuentran entre los "tesoros más valiosos" de las ciencias de la computación.

En informática , un puntero es un objeto en muchos lenguajes de programación que almacena una dirección de memoria . Este puede ser el de otro valor ubicado en la memoria de la computadora o, en algunos casos, el del hardware de la computadora con asignación de memoria . Un puntero hace referencia a una ubicación en la memoria, y la obtención del valor almacenado en esa ubicación se conoce como desreferenciaciónel puntero. Como 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 dicho puntero se haría pasando a la página con el número de página dado y leyendo el texto que se encuentra en esa página. El formato y el contenido reales de una variable de puntero dependen de la arquitectura de la computadora subyacente .

El uso de punteros mejora significativamente el rendimiento para operaciones repetitivas, como atravesar estructuras de datos iterables (por ejemplo , cadenas , tablas de búsqueda , tablas de control y estructuras de árbol ). En particular, a menudo es mucho más barato en tiempo y espacio copiar y desreferenciar punteros que copiar y acceder a los datos a los que apuntan los punteros.

Los punteros también se utilizan para contener las direcciones de los puntos de entrada para las subrutinas llamadas en la programación de procedimientos y para la vinculación en tiempo de ejecución a bibliotecas de vínculos dinámicos (DLL) . En la programación orientada a objetos , los punteros a las funciones se utilizan para los métodos de enlace , a menudo utilizando tablas de métodos virtuales .

Un puntero es una implementación simple y más concreta del tipo de datos de referencia más abstracto . Varios idiomas, especialmente los de bajo nivel , admiten algún tipo de puntero, aunque algunos tienen más restricciones de uso que otros. Si bien "puntero" se ha utilizado para referirse a referencias en general, se aplica más correctamente a estructuras de datos cuya interfaz permite explícitamente que el puntero sea manipulado (aritméticamente a través depuntero aritmética ) como una dirección de memoria, en contraposición a unacookie mágicaocapacidadque no lo permite.[ cita requerida ]Debido a que los punteros permiten el acceso protegido y desprotegido a las direcciones de memoria, existen riesgos asociados con su uso, particularmente en el último caso. Los punteros primitivos a menudo se almacenan en un formato similar a unnúmero entero; sin embargo, intentar eliminar la referencia o "buscar" un puntero cuyo valor no sea una dirección de memoria válida podría hacer que un programa sebloquee(o que contenga datos no válidos). Para aliviar este problema potencial, como una cuestión deseguridaddetipo, los punteros se consideran un tipo separado parametrizado por el tipo de datos al que apuntan, incluso si la representación subyacente es un número entero. También se pueden tomar otras medidas (como validación y verificación de límites ) para verificar que la variable de puntero contiene un valor que es tanto una dirección de memoria válida como dentro del rango numérico que el procesador es capaz de direccionar.

En 1955, la científica informática soviética Kateryna Yushchenko inventó el lenguaje de programación Address que hizo posible el direccionamiento indirecto y las direcciones del rango más alto, análogas a los punteros. Este idioma fue ampliamente utilizado en las computadoras de la Unión Soviética. Sin embargo, era desconocido fuera de la Unión Soviética y, por lo general, a Harold Lawson se le atribuye la invención, en 1964, del puntero. [2] En 2000, Lawson recibió el premio Computer Pioneer Award por el IEEE "[p] o inventar la variable de puntero e introducir este concepto en PL / I, proporcionando así por primera vez, la capacidad de tratar de forma flexible listas enlazadas en un lenguaje de alto nivel de uso general ". [3]Su artículo fundamental sobre los conceptos apareció en la edición de junio de 1967 del CACM titulado: Procesamiento de listas PL / I. Según el Oxford English Dictionary , la palabra puntero apareció por primera vez impresa como un puntero de pila en un memorando técnico de System Development Corporation .


Puntero a apuntando a la dirección de memoria asociada con la variable b . En este diagrama, la arquitectura informática utiliza el mismo espacio de direcciones y primitiva de datos para punteros y no punteros; esta necesidad no debería ser el caso.