Puntero (informática)

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.

Generalmente, los punteros primitivos son almacenados en un formato similar a un entero; no obstante, intentar eliminar la referencia o "mirar arriba" hacia un puntero cuyo valor no fue nunca una dirección de memoria válida conllevaría a provocar que un programa se bloquee.

Sin embargo, por lo general esos planos tienen un montón de problemas, y por conveniencia para el programador son preferibles las direcciones absolutas del programador (y subyacente a esa, un espacio de dirección plano).

A este último efecto, el "puntero" simplemente puede ser el número de entrada de la tabla en sí y puede pasar a ser una dirección actual usando aritmética simple.

Por otra parte, algunos sistemas tienen más unidades de memoria que no son direcciones.

Así, solo el 1/16 de la posible memoria total puede ser accedida a la vez.

Sin embargo, punteros inicializados podría obstaculizar innecesariamente el análisis del programa, ocultando de ese modo los bugs.

Este ejemplo puede ser más claro si la memoria no es directamente examinada.

Estos cinco enteros ocupan 32 bits (4 bytes) cada uno con el byte menos significativo que se almacena primero (esto es una arquitectura de CPU little endian) y se almacenan de forma consecutiva comenzando en la dirección 0x1000.

La sintaxis de C con punteros es: El último ejemplo es cómo acceder a los contenidos del array.

Descomponiéndolo: Por ejemplo array[3] es sinónimo de *(array+ 3), es decir, *(0x1000 + 3*sizeof (int)), que dice "eliminar la referencia al valor almacenado en 0x100C", en este caso 0x0001.

La biblioteca C estándar proporciona la función malloc() para asignar bloques de memoria desde el montón.

El código siguiente muestra cómo se desasignan dinámicamente objetos de memoria, es decir, retorna al montón o tienda libre.

Por lo tanto, para poner la letra 'A' en la línea 5, columna 2 blanco sobre azul luminoso, uno podría escribir código como el siguiente: En muchos lenguajes, los punteros tienen la restricción adicional de que el objeto que apuntan tiene un tipo específico.

Para suprimir la advertencia del compilador, debe quedar explícita de que realmente se desea hacer la cesión por encasillamiento.

Otros lenguajes simplemente aceptan una aproximación conservadora de moldes seguros, o ninguno en absoluto.

Muchos lenguajes, incluyendo lenguajes de programación funcionales y los últimos lenguajes imperativos como Java, reemplazan los punteros con un tipo más opaco de referencia, típicamente referido simplemente como referencia, que solo puede ser usado para referirse a los objetos y no manipula a los números, previniendo este tipo de error.

Cualquier intento de utilizar estos punteros no inicializados puede causar un comportamiento inesperado, ya sea porque el valor inicial no es una dirección válida, o porque su uso puede dañar otras partes del programa.

Además, tener en cuenta que hay ocasiones en que la desreferenciación NULL es intencional y bien definida, como por ejemplo el código del BIOS, escrito en C, para dispositivos x86 de 16 bits en modo real, puede escribir la IDT en la dirección física 0 de la máquina, desreferenciando al puntero a NULL para la escritura.

En 2009, C. A. R. Hoare declaró[13]​[14]​ que en 1965 inventó la referencia nula como parte del lenguaje Algol W, aunque, desde 1959, NIL hubiera existido en Lisp.

En los lenguajes de programación Pascal o C, los punteros que no están específicamente inicializados pueden apuntar a direcciones impredecibles en la memoria.

Como se puede apreciar, cada miembro tiene una dirección en memoria con 4 bytes de diferencia entre sí.

Además, la conversión entre ANY y cualquier otro tipo de punteros no generará ninguna advertencia.

Generalmente, tales bloques requieren permisos de seguridad superiores a código pointerless que se le permitiera correr.

El estándar ECMA para Eiffel incluye un mecanismo de "tipo adjunto" que pretende garantizar un void seguro.

El Fortran-90 también se puede usar la declaración ALLOCATE para asociar un puntero a un bloque de memoria.

En cambio, las estructuras de datos más complejas como los objetos y las matrices se implementan utilizando referencias.

[18]​ Los punteros son fuertemente implementados como en Pascal, al igual que los parámetros VAR en las llamadas a procedimiento.

A diferencia de muchas lenguajes que cuentan con punteros, el estándar ISO Pascal solo permite punteros para hacer referencia a las variables creadas dinámicamente que son anónimas y no les permiten referenciar estándares estáticos o variables locales.

Puntero ' a' apuntando a la dirección de memoria asociada con la variable ' b' . Obsérvese que en este diagrama en particular, la arquitectura de cálculo utiliza el mismo espacio de direcciones y datos primitivos tanto para punteros como para no punteros; esto no tiene por qué ser el caso.