Pointer

Setiap variabel disimpan dalam memori komputer dan memiliki alamat sesuai letaknya dalam memori. Variabel biasa digunakan untuk menyimpan suatu nilai berdasarkan tipe datanya, sedangkan variabel dengan tipe data pointer digunakan untuk menyimpan alamat variabel lain. Tipe data pointer dideklarasikan dengan tanda caret (^) sebelum nama tipe data. Contohnya : 

Var
   A = ^real;
   B = ^char;
   C = ^array[1..1o] of integer;
   date-ptr = ^date;
      Tanggal = record
         Tahun: 1..31;
         Bulan: 1..12;
         Tahun: 1800..3000;
      End;


Tipe data pointer dalam pascal hanya dapat menyimpan alamat variabel dengan satu jenis tipe data. Misalnya "variabel A" pada contoh di atas hanya bisa menyimpan tipe data real. Perhatikan contoh berikut ini :

Program pointer;
uses crt;
Var
Aptr : ^real;
Bptr : ^char;
Cptr : ^ Boolean;
A: real;
B: char;
C: Boolean;
Begin
    clrscr;
    Aptr := @A;
    Bptr := @B;
    Cptr := @C;
End.
Selain harus sesuai tipe datanya, data yang akan disimpan alamatnya didahului dengan tanda "@". Jika kalian memperhatikan contoh di atas, kalian bisa melihat bahwa variabel Aptr digunakan untuk menyimpan alamat variabel A yang tipe datanya adalah real. Mari kita lanjutkan dengan contoh kode programnya!

Program pointer;
uses crt;
Var
Aptr : ^Integer;
A: integer;
Begin
    clrscr;
    A:=1;
    Aptr := @A;

    writeln('A:', A);
    writeln('Aptr:', Aptr^);
    readln;
End.


Jika deklarasi variabel pointer yang menggunakan tanda caret sebelum nama tipe data, untuk menulis nilai dari variabel yang ditunjuk oleh variabel pointer kita menggunakan tanda caret (^) setelah nama variabel. Sekarang coba ubah nilai variabel A dan jalankan kembali program yang dihasilkan!
Nilai A maupun pointer Apt tentu saja r yang menunjuk A seharusnya akan berubah.

Program pointer;
uses crt;
Var
Aptr : ^Integer;
A : integer;

Begin
    clrscr;
    A := 2;
    Aptr := @A;
    writeln('A :', A);
    writeln('Aptr :', Aptr^);
    readln;
End.

Silakan dicoba dan bandingkan hasilnya dengan kode program sebelumnya.

Alokasi Memori
Seperti dalam bahasa C / C++, pascal juga menyediakan alokasi memori untuk pointer. Alokasi memori untuk pointer dalam pascal bisa digunakan menggunakan prosedur getmem dan freemem. Setelah menggunakan malloc, kalian bisa membebaskan memorinya dengan free.

program alokasi_memori;
uses crt;
Var
Aptr: ^Integer;

Begin
    clrscr;
    Aptr := getmem(sizeof(Aptr));
    Aptr^:=2;
    writeln('Aptr : ', Aptr^);
    freemem(Aptr);
    readln;
End.
Pointer tidak menyimpan nilai, tapi menyimpan alamat dari "tempat penyimpanan nilai". Jika kalian ingin menyimpan nilai pada alamat yang sudah ditunjuk dengan pointer, kalian bisa menggabungkan tanda caret(^) dengan tanda sama dengan(=), sehingga tandanya jadi "^=". Isi dari memori ditampilkan dengan menambahkan tanda caret (^) setelah nama variabel. Tanpa tanda caret setelah variabel pointer, kode program tidak akan bisa dicompile karena error.