Pointer (1) – Dasar Penggunaan Pointer

March 10, 2006 at 11:33 am | Posted in Tutorials | 7 Comments

by: Kusnassriyanto

Dalam sistem komputer, semua bagian di memory dapat diasosiasikan dengan suatu nilai numerik yang disebut address atau alamat di memory. Dengan demikian, setiap bagian di memory dapat diakses menggunakan alamat. Pointer adalah tipe data dalam bahasa pemrograman yang berisi alamat di memory tersebut. Ini berarti pointer adalah sebuah tipe data yang isinya menunjuk ke data lain di memory.

Dalam bahasa pemrograman Delphi, khususnya pada tingkat yang lebih lanjut, peran pointer sangatlah penting, meskipun di sisi lain dapat menimbulkan malapetaka. Pointer memiliki kekuatan besar dalam membangun struktur data dan dapat dimanfaatkan untuk mengelola memori secara akurat. Di sisi lain, dalam penggunaan pointer, sangat mudah terjadi salah pakai yang bisa menimbulkan error yang sulit dicari penyebabnya, yaitu access violation. Karena peran pointer yang sangat besar dalam menghasilkan program yang efektif, seseorang tidak akan bisa menjadi programmer handal bila tidak memiliki pengetahuan yang baik tentang pointer.

Seri pembahasa tentang pointer akan dibuat dalam beberapa bagian yang mencakup topik-topik bahasan seperti berikut ini

  • Dasar penggunaan pointer
  • Mengoperasikan Pointer
  • Alokasi Dinamik
  • Pointer Liar dan Memory Leak
  • Tipe Record dan Pointer
  • Variabel bertipe Prosedural
  • TObject, Tclass, dan IInterface
  • Long String
  • TList, List of Pointer


Penggunaan Pointer

Seperti telah dijelaskan sebelumnya, pointer adalah tipe data yang dapat menunjuk ke lokasi tertentu di memori. Untuk mendefinisikan sebuah variabel pointer, kita bisa menggunakan ^ atau bisa menggunakan Pointer. Perhatikan contoh berikut ini.

var p1: ^Integer; // Pointer to integer
    p2: ^Real;    // Pointer to real number
    px: Pointer   // Untyped pointer

Variabel p1 adalah variabel dengan tipe pointer to integer, artinya nilai yang ditunjuk oleh p1 adalah nilai bertipe integer. Variabel p2 adalah pointer to real, artinya nilai yang ditunjuk oleh variabel ini adalah bilangan real. Semetera variabel px adalah untyped pointer, artinya tipe yang ditunjuk oleh variabel pointer ini tidak ditentukan. Variabel bertipe untyped pointer akan kompatibel dengan variabel pointer bertipe apapun. Menggunakan utyped pointer pada umumnya lebih fleksibel tetapi kurang aman.

Mengambil nilai yang ditunjuk oleh sebuah variabel pointer biasanya disebut sebagai dereferencing pointer. Untuk melakukan dereferencing pointer, kita harus menggunakan simbol ^. Bila p adalah pointer, maka p^ adalah nilai yang ditunjuk oleh p. Kita bisa mengisi sebuah pointer dengan alamat variabel lain, atau kita bisa mengalokasikannya dari heap memory. Untuk mengambil alamat dari suatu variabel tertentu, kita dapat menggunakan simbol @. Dengan demikian @a berarti alamat dari variabel a. Ada sebuah nilai konstanta khusus yang disebut dengan nil, yang berarti pointer tindak menunjuk ke manapun. Perhatikan contoh berikut ini

var
  a: Integer;
  p1, p2, p3: ^Integer;
begin
  p1 := @a;
  p2 := p1;
  p2^ := 100;
  p3 := nil;
end;

Ilustrasi pointer assignment

Pada langkah pertama, p1 diisi dengan alamat dari a (@a). Jadi setelah langkah pertama tersebut, pointer p1 menunjuk ke variabel a. Langkah kedua p2 diisi dengan nilai p1. Ini berarti p2 menunjuk ke a juga. Langkah ketiga p2^ diisi dengan 100. Artinya alamat di memori yang ditunjuk oleh p2 diisi dengan sebuah nilai interger 100. Setelah perintah ini, nilai a, nilai p1^, maupun p2^ adalah sama, yaitu 100. Langkah keempat, p3 diisi nil sehingga p3 sekarang tidak menunjuk kemana-mana. Perlu dicatat disini bahwa variabel pointer tidak diinisialisasi, sehingga isinya bisa menunjuk ke alamat tertentu yang tidak valid. Perkecualian diberikan kepada variabel pointer yang dimiliki oleh objek, dimana nilainya diinisialisasi dengan nil.

Operator dalam Pointer

Beberapa operator yang dapat dioperasikan dengan pointer adalah sebagai berikut
^, Untuk mengakses data yang ditunjuk oleh suatu variabel pointer. Operator ini hanya bekerja untuk typed pointer.
=, Untuk memeriksa apakah dua variabel pointer menunjuk alamat yang sama atau tidak
<>, Untuk memeriksa apakah dua variabel pointer menunjuk alamat yang berbeda
@, Untuk mengetahui alamat variabel tertentu. Operand dari operator ini adalah variabel apapun, sedangkan hasil dari operator ini adalah pointer. Peran operator ini sama persis dengan function Addr.

Menggunakan Inc dan Dec

Sebuah variabel bertipe pointer bisa di-increment untuk menggeser alamat yang ditunjuk oleh pointer. Jarak bergesernya pointer akan disesuaikan dengan ukuran data yang ditunjuk oleh pointer tersebut. Untuk lebih jelasnya, perhatikan contoh berikut.

Pertama kita akan mendefinisikan beberapa pointer yang menunjuk ke tipe data yang ukurannya berbeda.

type
  TArrayByte = array [0..15] of Byte;
  T2Byte = array [0..1] of Byte;
  T4Byte = array [0..3] of Byte;
  P1Byte = ^Byte;
  P2Byte = ^T2Byte;
  P4Byte = ^T4Byte;

Untuk mempermudah pembahasan, kita akan bekerja dengan array of byte. TArrayByte adalah array sepanjang 16 byte yang akan kita gunakan untuk menyimpan data. T2Byte adalah data dengan panjang 2 byte sedangkan T4Byte adalah data dengan panjang 4 Byte. P1Byte adalah pointer yang menunjuk ke Byte, dalam hal ini ukuran data yang ditunjuk oleh P1Byte adalah 1 Byte. P2Byte menunjuk ke T2Byte dan P4Byte menunjuk ke T4Byte, sehingga panjang data yang ditunjuk oleh kedua jenis pointer ini adalah 2 dan 4 Byte.

procedure TForm1.Button1Click(Sender: TObject);
var Data: TArrayByte;
  P1: P1Byte;
  P2: P2Byte;
  P4: P4Byte;
  i: Integer;
begin
  for i:=0 to 15 do begin // inisialisasi data
    Data[i] := i;
  end;
  P1 := @Data; // P1, P2 dan P4 menunjuk
  P2 := @Data; // ke Data
  P4 := @Data; //
  ShowMessage(Format('P1: %d, P2: %d, %d P4: %d, %d, %d, %d',
    [P1^, P4^[0], P4^[1], P4^[0], P4^[1], P4^[2], P4^[3]]));
  Inc(P1);
  Inc(P2);
  Inc(P4);
  ShowMessage(Format('P1: %d, P2: %d, %d P4: %d, %d, %d, %d',
    [P1^, P2^[0], P2^[1], P4^[0], P4^[1], P4^[2], P4^[3]]));
end;

Tampilan ShowMessage pertama dan kedua secara berurutan adalah

Hasil ShowMessage

Perhatikan ilustrasi berikut

Ilustrasi

Setelah P1, P2, dan P4 diinisialisasi, ketiganya menunjuk ke alamat yang sama yaitu awal dari alamat variabel Data, sama juga dengan alamat dari Data[0]. Karena variabel Data tersebut sudah diinisalisasi, maka nilai P1^ adalah 0, nilai P2^[0] dan P2^[1] adalah 0 dan 1, sedangkan nilai P4^[0], P4^[1], P4^[2], P4^[3] adalah 0, 1, 2, dan 3.

Kemudian ketiga pointer di-increment dengan memanggil procedure Inc, sehingga ketiga pointer tersebut menunjuk ke alamat yang telah digeser seperti ditunjukkan oleh ilustrasi berikut ini

Ilustrasi

Karena P1 ukurannya 1 byte, maka alamat yang ditunjuk oleh P1 bergeser 1 byte sehinga sama dengan alamat Data[1]. Untuk P2, karena ukurannya 2 byte, maka pointer ini akan bergeser 2 byte sehingga sekarang nilainya sama dengan alamat Data[2]. Sedangkan P4 karena ukurannya 4 byte, maka alamat yang ditunjuk P4 bergeser 4 byte sehingga sekarang nilainya sama dengan alamat Data[5]. Oleh karena itulah nilai P1^ sekarang menjadi 1, nilai P2^[0] dan P2^[1] menjadi 2 dan 3, sedangkan nilai P4^[0], P4^[1], P4^[2] dan P4^[3] nilanya sekarang menjadi 4, 5, 6, dan 7.

Procedure Dec adalah kebalikan dari Inc, sehingga pointer bila Inc pointernya bergeser ke kanan (bertambah), maka Dec pointernya bergeser ke kiri (berkurang).

Perlu diperhatikan juga bahwa bila kita increment terus menerus P1, P2, maupun P4, maka ketiganya bisa menunjuk alamat diluar variabel Data, suatu alamat yang bisa jadi tidak valid. Hal ini bisa berbahaya terhadap aplikasi. Oleh karena itulah kita harus selalu berhati-hati bila kita bekerja dengan Pointer.

(bersambung …)

About these ads

7 Comments »

RSS feed for comments on this post. TrackBack URI

  1. saya minta tolong,saya ada tugas dari dosen tentang pointer sama file binary ,
    bisa diberikan contoh pointer sama file binary sourcode yang sederhana saja.

    sebelumnya saya ucapkan terima kasih

  2. thxxxx…….. yaaaa

  3. iyap nih… sama tU ma yg di ats
    gy di suruh cari ma dosen tentang pointer…
    rada” gk ngerti gtu sih cz lum d ajarin…

    smuga artkl ini bs ngbantu..
    binun.. ni..

  4. saya mau tanya apa sih..
    tipe-tipe pointer

  5. tolong minta data tentang maksud dari pointer itu pa q ga jeles di ajari ma dosen

    makasih ya sebelumnya

  6. thanks,,^^

  7. Terima kasih.
    sangat membantu saya.


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Blog at WordPress.com. | The Pool Theme.
Entries and comments feeds.

Follow

Get every new post delivered to your Inbox.

%d bloggers like this: