Punteros.

Cuando se crea una variable, una matriz, etc. se está ocupando un espacio de la memoria del ordenador. Simplificando, un puntero no es más que una variable que recoge « el sitio », es decir, la dirección de memoria donde se ha almacenado.

Como una variable puede ser un puntero y además se crea en « var » igual que todas, para indicárselo al compilador, se antepone el símbolo ^ , por ejemplo

var
numero:integer;
pNumero:^integer;

Numero lo definimos como una variable de tipo integer, en cambio pNumero lo estamos definiendo como un puntero a una variable del mismo tipo.

Hay, como es de suponer, una relación muy estrecha entre lo que apunta y la cosa apuntada. En el ejemplo anterior sabemos que la segunda variable es un puntero, perfecto, pero no sabemos a donde está
apuntando, lo que puede ser útil para algunas cosas. Si queremos obtener la dirección de memoria donde se aloja una variable se usa @ Por ejemplo

var
numero : integer; // aquí hemos declarado la variable
pNumero : ^integer; // aquí el puntero
begin
numero := 2000; // aquí damos el valor a la variable
pNumero := @numero

En esta última línea le estamos indicando que la variable de tipo puntero pNumero apunta a la dirección de la variable número.

Showmessage(InttoStr(pNumero)); // error
end;

Está claro el error ¿por qué indica tipos incompatibles entre integer y pointer cuando el puntero está declarado como integer? Pues por que es un puntero a un entero, no un entero.
Lo correcto sería

Showmessage(InttoStr(pNumero^);

Ahora no da error . Con el símbolo antes de la variable hacemos la declaración, con el símbolo después accedemos a ella.

De manera que la variable « numero » que hemos inicializado a 2000 y está en una posición de memoria determinada, la podemos recuperar si manejamos un puntero a ella.

También podemos modificar el contenido de la variable a través del puntero, por ejemplo:

pNumero^:=pNumero^+10;

Pues con independencia de lo que se almacene en la memoria, desde una variable simple a una matriz de varias dimensiones o una estructura completa, etc., podemos acceder a ella a través de los punteros, por lo que su importancia es indudable. Si se permite opinar, un lenguaje de programación en el cual no exista la posibilidad de manejo de punteros puede ser cualquier cosa, incluso de lo mas entretenida, pero no es un lenguaje de programación o al menos « de verdad ».