Suatu pointer type mendefinisikan suatu variabel yang menyimpan alamat memory dari variabel lain dengan suatu data type tertentu (atau dengan type yang belum terdefinisi). Jadi suatu variabel pointer secara tidak langsung merujuk pada suatu nilai. Definisi pointer type tidaklah didasarkan pada suatu keyword tertentu, tapi menggunakan karakter khusus. Simbol khusus ini adalah tanda caping / caret (^):
type
PointerToInt = ^Integer;
Setelah Anda mendefinisikan suatu variabel pointer, Anda dapat mengisikannya dengan alamat variabel lainnya dengan type yang sama, menggunakan operator @:
var
P: ^Integer;
X: Integer;
begin
P := @X;
// change the value in two different ways
X := 10;
P^ := 20;
Ketika Anda mempunyai suatu pointer P, dengan ekspresi P Anda merujuk pada alamat yang ditunjuk oleh pointer tersebut, dan dengan ekspresi P^ Anda merujuk pada isi sebenarnya dari lokasi memory tadi. Untuk alasan inilah, dalam potongan code diatas ^P merujuk ke X.
Ketimbang merujuk pada lokasi memory yang sudah ada, suatu pointer juga dapat merujuk pada suatu memory block baru yang dialokasikan secara dinamis (pada heap memory area) dengan prosedur New. Dalam kasus ini, ketika Anda tidak membutuhkan pointer ini lagi, Anda harus membebaskan memory yang telah Anda alokasikan secara dinamis, dengan memanggil prosedur Dispose.
var
P: ^Integer;
begin
// initialization
New (P);
// operations
P^ := 20;
ShowMessage (IntToStr (P^));
// termination
Dispose (P);
end;
Jika suatu pointer tidak mempunyai nilai, Anda dapat mengisinya dengan nil. Lalu Anda dapat mencocokkan apakah pointer tersebut nil untuk memeriksa apakah pointer tersebut merujuk ke suatu nilai. Ini sering digunakan, karena merujuk dengan pointer yang invalid akan menyebabkan access violation (ini juga dikenal dengan suatu general protection fault, GPF):
procedure TFormGPF.BtnGpfClick(Sender: TObject);
var
P: ^Integer;
begin
P := nil;
ShowMessage (IntToStr (P^));
end;
Anda dapat melihat contoh dari hasil code ini dengan menjalankan contoh GPF (atau melihat gambar 4.4). Contoh ini mengandung potongan code diatas.
Gambar 4.4: System error karena mengakses nil pointer, dari contoh GPF.
Dalam program yang sama, Anda dapat melihat contoh mengakses data secara aman. Dalam contoh kedua ini, pointer diisi dengan local variabel yang suda hada, dan dengan aman bisa digunakan, tapi bagaimanapun juga saya telah menambahkan suatu pemeriksaan keamanan:
procedure TFormGPF.BtnSafeClick(Sender: TObject);
var
P: ^Integer;
X: Integer;
begin
P := @X;
X := 100;
if P <> nil then
ShowMessage (IntToStr (P^));
end;
Kenyataan bahwa pointer jarang diperlukan dalam
Posting Komentar