La ultima forma es como se hace en delphi, pero el array se define con el tamaño mayor posible, po ejemplo:
Código Delphi
[-]
TLISTA = ARRAY [0..MaxInt div sizeof(TListaObjectPTR)-1] OF TLISTAOBJ;
TLISTAptr = ^TLISTA;
Con esto en un S.O. de 32 bits estas definiendo un array TLista de 500 millones de elementos, lo maximo posible, pero no importa que el tipo de variable TLista que defines sea muchisimo mas grande que el que uses en realidad, porque nunca crearas un array de ese tamaño, ya que vas a utilizar punteros. Se utiliza esta definicion simplemente para poder usar la sintaxis ListP^[Indice] y te seguras asi de que el indice pueda utilizarse con cualquier tamaño de array al que apunte el puntero.
Saludos