Curso de Delphi

Iniciado por Khronos14, 6 Octubre 2010, 16:00 PM

0 Miembros y 1 Visitante están viendo este tema.

Khronos14

Capítulo 10. Punteros I.

Los punteros son variables que almacenan la posición de memoria en la que se encuentra un dato. En Delphi se pueden emplear punteros como se haría en C.

A simple vista las clases y objetos de Delphi, no parecen punteros, pero en realidad si que lo son. Se oculta su verdadera naturaleza para que al programador le sea más agradable trabajar con ellos (ya veremos las clases más adelante).
Otro ejemplo, es el tipo de datos string; este es un puntero que apunta a una región de memoria dinámica en la que se almacena texto. El tamaño máximo de un string ronda los 4 Gb...

El tipo genérico de puntero en Pascal se llama Pointer, es un puntero no-de tipo porque únicamente contiene una dirección de memoria, y el compilador no guarda ninguna información sobre el dato al que apunta.
Los punteros con tipo se declaran utilizando el operador ^ (puntero) antes del tipo de dato de una variable.

Ejemplo:

Código (delphi) [Seleccionar]

var
   I: ^Integer;


Para que un puntero tenga la dirección de memoria de otra variable, usaríamos este método:

Código (delphi) [Seleccionar]

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  Puntero: ^Integer;
  I: Integer;
begin
  I:= 5;
  Puntero:= @I; //Tambien sirve Puntero:= Addr(I);

  Writeln('I tiene el valor: ', I);
  Writeln('Puntero tiene el valor: ', Puntero^);
  Readln;
end.


Creamos una variable de tipo integer y un puntero que apunta a una variable de tipo integer. Introducimos un valor en I y utilizando el operador @ o Addr, le decimos a Puntero que apunte a la dirección de memoria de I. Luego comprobamos que I y Puntero tienen el mismo valor. Para acceder al valor de un puntero hay que poner el operador ^ al final.

Tendríamos algo como esto:



Un puntero también puede apuntar a un valor en concreto, no hace falta que sea una variable. Ejemplo:

Código (delphi) [Seleccionar]

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  Puntero: ^Integer;
begin
  Puntero^:= 5;

  Writeln('Puntero tiene el valor: ', Puntero^);
  Readln;
end.