
Lebih Jauh Dengan Pointer [ 2 ]
Oke. Pembahasan kita terakhir adalah dereferensi pointer untuk mengambil nilai yang ditunjuknya.
Pertanyaan, bila kita bebas melakukan casting terhadap variabel bertipe pointer untuk mengambil nilainya, dapatkah kita membuat saja tipe variabel baru yang sesuai dengan kebutuhan kita? Agar tidak usah ada casting lagi tiap kita melakukan dereferensi terhadap pointer?
Jawabannya, tentu saja.
Kita dapat membuat tipe variabel baru bertipe pointer dengan ukuran yang bebas. Contoh, kita akan membuat sebuah tipe data, berjenis pointer, dan data yang ditunjuknya seukuran Dword.
type
PDword = ^Dword;
Nah, kita telah memiliki tipe data baru. Sebuah tipe data berjenis pointer, data yang ditunjuk seukuran Dword, bernama PDword. Kita memberi nama dengan prefiks P agar kita mudah mengingat bahwa tipe data tersebut berjenis pointer. Tanda ^ di depan tipe data dasar (Dword) adalah penunjuk bahwa kita sedang mendeklarasikan sejenis pointer sebagai tipe data baru.
Sebuah contoh akan menjelaskan lebih jauh:
procedure TForm1.Button1Click(Sender: TObject);
type
PDword = ^Dword;
var
PointerDword: PDword;
DwordBiasa1,
DwordBiasa2: Dword;
begin
DwordBiasa1 := 16762;
PointerDword := @DwordBiasa1;
DwordBiasa2 := pointerDword^;
ShowMessage('Nilai dereferensi: '+ IntToStr(DwordBiasa2));
pointerDword^ := 4;
ShowMessage('Nilai dereferensi: '+ IntToStr(DwordBiasa1));
end;
Lihat. Nilai DwordBiasa1 adalah 16762. Kita deklarasikan tipe data baru dengan nama PDword, sebagai tipe berjenis pointer, ukuran data yang ditunjuknya sebesar ukuran data Dword. Kita juga punya sebuah variabel PointerDword dengan tipe PDword tadi. variabel PointerDword ini kita tugaskan untuk menjukkan alamat variabel DwordBiasa1 di memori. Kemudian kita dereferensikan lagi ke variabel DwordBiasa2. Ternyata, tanpa perlu casting tipe data, kita sudah dapat mengambil nilai 16762 tadi.
Bagaimana dengan dua baris terakhir? Ingat, pointer, termasuk PDword tadi, hanya menunjukkan alamat sebuah data/variabel di memori. Bukan menunjukkan nilainya. Jika kita melakukan dereferensi dengan x:=p^, maka nilai pada memori yang ditunjuk oleh p di memori akan dimasukkan ke variabel x. Sebaliknya, bilai kita melakukan penugasan p^:=x, maka nilai di memori yang ditunjuk oleh p akan diisi dengan nilai x.
DwordBiasa1 := 16762;
PointerDword := @DwordBiasa1;
//……………………………
pointerDword^ := 4;
Pada kode di atas, DwordBiasa1 awalnya bernilai 16762. Kemudian kita mencatat alamat data DwordBiasa1 ke variabel PointerDword. Baris terakhir mengubah nilai di alamat tersebut (yang ditunjuk oleh PointerDword) menjadi 4. Ini berakibat variabel DwordBiasa1, yang berada di alamat tersebut, menjadi bernilai 4, bukan lagi 16762. Percaya?
Oke. Lanjut. :)
Kemudian perhatikan deklarasi tipe-tipe data yang tersedia di Delphi. Kebanyakan mereka dideklarasikan menggunakan cara kita:
PTipe = ^Tipe;
Dengan pembahasan ini, saya berharap kita sudah punya sebuah pengetahuan baru, bahwasannya pointer adalah sesuatu yang sangat bagus dalam memfasilitasi kita dalam menulis program. Meskipun terlihat begitu rumit dan bertele-tele, kita harus bersyukur bahwa pointer ada di dunia yang kita tinggali, dunia programming :)
Manfaat pointer tentu saja belum terasa sampai di sini. Kita masih akan melanjutkan dengan tipe-tipe data dasar lainnya, sebelum melanjutkan pembahasan sampai ke pemanfaatan pointer dan contoh-contoh implementasinya dalam kode.
Salam, Joko Rivai.
Comments