Last Updated:

Lebih Jauh Dengan Pointer

Grup KPPDI
Grup KPPDI Docs

Pointer adalah sebuah tipe data yang berfungsi menunjukkan alamat di memori. Semua objek dalam Delphi yang diturunkan dari TObject adalah pointer. TForm, TStrings, TList, TDBGrid, semuanya pointer.

Oke. Saya mulai dengan sebuah contoh.

var
  p: Pointer;
  i, j: Integer;
begin
  i:=45;
  j:=0;
  p:=@i;
  j:=Integer(p^);
  ShowMessage(IntToStr(j));

Pertama, nilai j adalah 0, nilai i adalah 45. kemudian kita tugaskan p untuk menunjukkan alamat dari i di memori. Pada alamat tersebut terdapat nilai 45. Bilai alamat yang ditunjuk oleh p kita ambil isinya ke variabel j, maka j akan memiliki nilai 45 juga.

Kode di atas memiliki hasil:
image 

Dengan demikian kita tahu bahwa:
p := @x adalah ekspresi menugaskan p untuk menunjukkan alamat dari x disebut referencing, dan
x:=p^ adalah mengambil data/nilai pada alamat yang ditunjukkan oleh p, disebut dereferencing.

Biasanya orang bingung dengan @, dan ^. Jangan khawatir, lama-lama semuanya akan terasa biasa saja :)

Mungkin Anda akan bertanya, apa maksudnya j:=integer(p^) ? Mudah saja, p adalah untyped pointer (pointer tak bertipe), sehingga akan membingungkan compiler berapa ukuran data/nilai yang ditunjuk oleh pointer tersebut. Mari membuat semua jelas: pointer berukuran 4 byte, tapi data/nilai di memori yang ditunjuknya tidak diketahui berapa ukurannya. Bisa jadi nilai itu adalah Char (1 byte), Integer (4 byte), Variant, atau lainnya.

Kita akan lihat alamat yang ditunjukkan oleh pointer dan mekanisme derefencing data pada alamat tersebut.

i:=45;
  p:=@i;
  ShowMessage(IntToStr( integer(p) ));

integer(p) merupakan casting/perubahan tipe dari pointer ke integer. Jadi alamat yang ditunjukkan oleh p dapat kita tampilkan dengan ShowMessage(IntToStr( integer(p) ));
image
Lantas, bagaimana mekanisme dereferencing?
image

Dengan memeriksa p, compiler tahu bahwa data yang akan direferensikan berada pada alamat 1244636 di memori. Tapi berapakah ukuran datanya? apakah cuma 1 byte atau sepanjang alamat 1244636 sampai akhir memori? Compiler takkan pernah tahu. Jadi kita harus mengarahkan compiler dengan:

j:=Integer(p^);

Kini compiler tahu bahwa kita akan mengambil data bertipe integer. Compiler tahu bahwa integer berukuran 4 byte. Dengan begitu, compiler akan mengambil data sebanyak 4 byte, dimulai dengan byte pertama pada alamat 1244636. Terakhir, compiler mengembalikan hasilnya, nilai 45.
 image

Demikian halnya bila kita ingin mengambil nilai dengan ukuran yang berbeda. Katakan kita hanya mengambil 1 byte:

j:=Byte(p^);

Bila Anda jeli, Anda dapat melihat kenapa ada tipe data PByte, PInt64, PDword, dan lainnya. Deklarasi tipe-tipe tersebut adalah:

PByte = ^Byte;
PInt64 = ^Int64;
PDword = ^Dword;

Mereka dideklarasikan sebagai tipe pointer ke tipe data dasarnya. Maksudnya, agar compiler tahu bahwa ukuran data pada alamat yang ditunjuknya.
image 

Anda lihat? Compiler kebingungan karena harus mengambil nilai yang tidak diketahui berapa ukurannya. Bagaimana jika kode di atas kita modifikasi:

image

Tidak ada masalah, kan?

Oke. Tulisan ini belum berakhir. Saya capek, maen Point Blank dulu. Nanti sambung lagi :)

Biar gak panjang, tulisan ini telah saya bagi dua. Lanjutannya di sini.

 

 

Comments