merry

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;

Delphi juga mendefinisikan suatu Pointer data type, yang mengindikasikan untyped pointer (seperti void* dalam bahasa C). Jika Anda menggunakan untyped pointer, Anda sebaiknya menggunakan GetMem ketimbang New. Prosedur GetMem diperlukan tiap kali ukuran variabel memory yang akan dialokasikan belum didefinisikan.

Kenyataan bahwa pointer jarang diperlukan dalam Delphi adalah suatu keuntungan yang menarik dari lingkungan ini. Bagaimanapun juga, mengerti cara kerja pointer adalah penting bagi pemrograman tingkat lanjut dan untuk pemahaman penuh dari object model dalam Delphi, yang menggunakan pointer "dibalik layar".

0 Responses

Posting Komentar