POINTER
Pointer adalah jenis data terstruktur yang dibuat sebagai suatu variabel yang menyimpan alamat dari suatu obyek ( dapat berupa variabel, konstanta bertipe atau subprogram ). Karena itu, variabel pointer bukan berisi data, tapi alamat dari dari data, singkatnya pointer menunjuk ke suatu lokasi data.
1. Karakteristik Penggunaan pointer terkait dengan penggunaan memori. Turbo Pascal mengalokasikan memori atas dasar :
Pada saat mendeklarasikan suatu variabel dengan tipe data tertentu, Turbo Pascal akan mengalokasikannya pada bagian DATA. Maksimal besar data yang dapat ditampung adalah 64 KB. Contoh :
Type
Halaman 1
Type var_ptr : ^ pengenal_tipe ; Atau Algoritma & Pemrograman 2, RRM Var var_ptr : ^ pengenal_tipe; array_besar = array [1..100,1..1500] of real; Var a_b:array_besar; Alokasi memori berdasarkan variabel tersebut dapat dihitung sebagai berikut : Untuk tipe data real = 6 byte. Maka array di atas memerlukan 100 x 1500 x 6 byte = 90000 byte. Lebih besar dari maksimal data yang dapat ditampung. Deklarasi ini akan gagal dengan adanya pesan kesalahan : structure too large 2. MENGGUNAKAN POINTER 2.1. Deklarasi Pointer Suatu tipe pointer diawali dengan tanda ^ (caret) dan diikuti dengan pengenal tipe sebagai berikut :
Contoh : Type RecordData = RECORD Nama : string [20]; Jabatan : string [15]; END; = ^ RecordData;
: PtrData; : ^Integer;
Halaman 2
Dengan : Var_ptr = Variabel pointer. Var_isi = variabel yang isinya akan ditunjuk oleh pointer. Operator @ = akan menghasilkan alamat dari variabel yang ditunjuk (var_isi), bukan isi dari var_isi tersebut. Untuk mengambil isi data yang ditunjuk oleh suatu variabel pointer, menggunakan :
Pointer tidak dapat dijumlahkan atau dikurangi, hanya boleh menggunakan operator := dan operator relasi seperti : = dan <>. Contoh : Program pointer01; Uses crt; Type Ptrinteger = ^integer; Var Ptrbilangan : ptrinteger; Bilangan : integer; Begin
Halaman 3
Clrscr; Bilangan := 10; Writeln (Isi Variabel Bilangan =,bilangan); Ptrbilangan :=@Bilangan ; { Mengisi variabel pointer dengan operator := } Writeln (Nilai yang ditunjuk oleh Ptrbilangan =,ptrbilangan^); { Mengambil isi data yang ditunjuk pointer } Readln; End. Hasil run : Isi Variabel Bilangan = 10 Nilai yang ditunjuk oleh Ptrbilangan = 10
New (var_ptr);
Algoritma & Pemrograman 2, RRM
end. Variabel pointer yang tidak dipakai sebaiknya diisi sesuatu yang kira-kira artinya tidak menunjuk kemana-mana. Turbo Pascal menyediakan nilai tersebut pada variabel NIL. Kita dapat mengisi pointer dengan NIL sebelum memakainya. Contoh : If P <> NIL then P^ :=12; Else writeln(Pointer belum diisi);
Bentuk Umumnya : Bila sudah tidak dibutuhkan, kita dapat mende-alokasikan pointer tersebut, sehingga memori yang tadinya dipakai oleh pointer tersebut dapat digunakan oleh pointer yang lainnya. Cara mende-alokasikannya adalah :
Halaman 5
Dispose (var_ptr);
Algoritma & Pemrograman 2, RRM
Contoh : Uses crt; Type data = RECORD Nama : String [20]; Nilai : Real; End; Var Ptrdata : ^data; Begin New (Ptrdata); Ptrdata^.nama := Amir; Ptrdata^.nilai := 90; Dispose(ptrdata); End. Logika menciptakan Variabel Dinamis Perhatikan alur logikanya : Uses crt; Type PtrData = ^RecordData; RecordData = RECORD Nama : String[20]; Jabatan : String[15]; Lanjutan : PtrData; End; Var PtrKepala,PtrBaru :PtrData; Begin New(PtrBaru); {Peryataan ini akan menyebabkan
Halaman 6
suatu alamat memori dan variabel dinamis bertipe record data disimpan dalam variabel PtrBaru.} Sebelum New(PtrBaru) PtrBaru Sesudah New(PtrBaru) PtrBaru Nama Jabatan Lanjutan
Setelah variabel dinamis terbentuk, pengisian data dapat dilakukan, dengan : PtrBaru^.Nama:= Hasan PtrBaru^.Jabatan := Direktur Hasilnya :
PtrBaru Variabel Dinamis Nama Jabatan Lanjutan
Jika kita ingin melibatkan 2 pointer, pointer kepala(head) dan pointer baru, Maka : New(PtrKepala); {Menciptakan variabel dinamis yang ditunjuk oleh PtrKepala} PtrKepala^.Nama := PtrBaru^.Nama ; {menyalin nama} Jika yang ingin disalin adalah semua field, maka :
Halaman 7
PtrKepala^ := PtrBaru^; {Menyalin isi yang ditunjuk oleh PtrBaru ke lokasi yang ditunjuk PtrKepala}
Sebelum Penugasan PtrBaru Nama PtrKepala Nama Sesudah Penugasan PtrBaru Nama PtrKepala Nama
Variabel Dinamis
Jabatan
Variabel Dinamis
Lanjutan
Jabatan
Variabel Dinamis
Lanjutan
Jabatan
Variabel Dinamis
Lanjutan
Jabatan
Lanjutan
Sedangkan bentuk : PtrKepala := PtrBaru; {Menyalin isi PtrBaru ke PtrKepala, baik PtrBaru maupun PtrKepala menunjuk ke lokasi memori yang sama}
Sebelum Penugasan PtrBaru Nama PtrKepala
Variabel Dinamis
Jabatan
Lanjutan
Variabel Dinamis
Jabatan
Lanjutan
Halaman 8
PtrKepala
Menghapus seluruh variabel dinamis yang terletak antara yang ditunjuk oleh var_ptr sampai sebelum yang ditunjuk oleh HEAPPTR.
FREEMEM(var_ptr, ukuran);
Algoritma & Pemrograman 2, RRM
Contoh : Program alokasiDgnGetMem; Uses crt; Const MaxHeapAlloc = 65521 ; {maksimal +64KB} Type Arraysemu = array [1..1] of real; Var P : ^arraysemu; I,ukuran, totalbyte : longint; Begin Clrscr; Write (Berapa Ukuran array yang diinginkan :);readln(ukuran); Totalbyte :=ukuran * SizeOf (real); If (MemAvail > totalbyte) and (totalbyte < MaxHeapAlloc) begin GetMem( p, totalbyte ); For I := 1 to ukuran do p^[I] :=9; For I := 1 to ukuran Do write (p^[I]:4:0); FreeMem( p, totalbyte ); End Else Writeln (terlalu besar, memori yang ada tidak tersedia sebesar itu); End. Ada beberapa fungsi yang sering digunakan terkait dengan penggunaan memori, yaitu : 1. Function PTR(segment, offset : word )
Halaman 10
Memberi informasi mengenai isi suatu pointer dengan menggunakan alamat segmen dan offsetnya. Bentuk Umum :
memori
yang
masih
3. Function MaxAvail : longint Memberikan jumlah byte dalam blok memori yang terbesar yang tersedia. Bentuk umum :
4. Function SizeOf Mengalokasikan besar byte tipe data yang digunakan. Contoh : Untuk Real = 6 byte. Bentuk Umum :
2.4. Link List ( Daftar Berantai ) Link list adalah rangkaian data yang saling berkaitan satu sama lain dengan menggunakan pointer sebagai pengaitnya.
Keterangan :
Halaman 11
Var Elemen : PointerData; New (Elemen); Elemen^.isi : = . ; New (Elemen^.berikut); Elemen^.berikut.isi : = . ; New (Elemen^.berikut^.berikut); Elemen^.berikut^.berikut^.isi : = ;
Dan seterusnya.
PointerData didefinisikan sebagai pointer ke suatu record yang belum didefinisikan (data). Di dalam record data, terdapat field yang bertipe pointerData (menunjuk PointerData itu lagi- rekrusif - ciri Link List pointer sebagai pengait). Kita dapat mengisi banyak data ke ISI dengan satu variabel saja (Elemen) Alokasi record ke-1 Mengisi ISI ke-1 Alokasi record ke-2 Mengisi ISI ke-2 Alokasi record ke-3 Mengisi ISI ke-3
NIL
berikut
isi
berikut
isi
isi
yang tidak mungkin dimiliki record lain. Memberi nilai NIL pada alamat record berikutnya setelah record terakhir. Perhatikan gambar Link List di bawah ini :
Alamat 1 Alamat 2 Alamatl -n
.. kepala
Simpul 1 Simpul 2 Simpul -n
NIL
Karakteristik Link List : Terdapat pointer sebagai kepala Berisi sejumlah simpul yang merupakan tipe data pointer yang menghubungkan dengan data pada simpul selanjutnya.
NIL
Algoritma & Pemrograman 2, RRM
1. PtrKepala := NIL; 2. New(PtrBaru); 3. PtrBaru^.Nama := HASAN; 4. PtrBaru^.Jabatan :=DIREKTUR; 5. PtrBaru^.Lanjutan := PtrKepala; 6. PtrKepala := PtrBaru; Diagram sesudah pernyataan keempat berupa :
PtrKepala
PtrBaru
Variabel Dinamis
Nama
Jabatan Lanjutan
kelima
Variabel Dinamis
Nama
Jabatan
Lanjutan
PtrBaru^.Lanjutan :=
PtrBaru
Variabel Dinamis
Nama
Jabatan
Lanjutan
Halaman 14
Simpul tambahan dapat dibentuk peryataan berikut : 1. New(PtrBaru); 2. PtrBaru^.Nama := Asih; 3. PtrBaru^.Jabatan :=Sekretaris; 4. PtrBaru^.Lanjutan := PtrKepala; 5. PtrKepala := PtrBaru;
dengan
sederetan
Nama PtrKepala
Jabatan
Lanjutan
Variabel Dinamis
Nama
Jabatan
Lanjutan
Nama
Jabatan
Lanjutan
PtrKepala
Variabel Dinamis
Halaman 15
HASAN
DIREKTUR
Nama
Jabatan
Lanjutan
Nama
Jabatan
Lanjutan
Variabel Dinamis
Nama
Jabatan
Lanjutan
Contoh Program :
Halaman 16
PROGRAM Pointer; Uses crt; Type PtrData = ^RecordData; RecordData = RECORD Nama :String [20]; Jabatan : String [15]; Lanjutan : PtrData; End; Var PtrAwalHeap : POINTER; {Pointer awal Heap merupakan pointer tidak bertipe } PtrKepala : PtrData; {Pointer kepala link list}
Procedure BentukDaftar (Var PtrKepala : PtrData ); {Menyusun daftar berantai dengan variabel PtrKepala menunjuk data terakhir yang dimasukkan melalui keyboard} Var PtrBaru : PtrData; Jawaban : Char; Begin Repeat Clrscr; New(PtrBaru); Write(Nama Pegawai :);Readln(PtrBaru^.Nama); Write(Jabatan :);Readln(PtrBaru^.jabatan); PtrBaru^.Lanjutan := PtrKepala; PtrKepala := PtrBaru;
Halaman 17
Write (Masukkan Data lagi (Y/T) ); Repeat Jawaban := Upcase(readkey); Until Jawaban in [Y,T] Writeln(jawaban); Until jawaban =T End; Begin Writeln(Memasukkan Data Pegawai); BentukDaftar(NIL); Readln; End. 2.4.4. Menampilkan Link List ( Daftar Berantai ) Sebuah variabel pointer (PtrSementara) diatur supaya menunjuk lokasi yang ditunjuk oleh PtrKepala. Selama Ptrsementara tidak berisi NIL, maka : Cetak isi simpul yang ditunjuk oleh PtrSementara PtrSementara digeser agar menunjuk lokasi yang ditunjuk oleh pointer lanjutan. Contoh Program : Prosedur CetakDaftar(PtrKepala:PtrData); {mencetak isi Link List} Var PtrSementara : PtrData; Begin Clrscr; Writeln(Isi Daftar Pegawai);Writeln; Writeln(-----------------------------------------------------------); Writeln( Nama Jabatan ); Writeln(-----------------------------------------------------------); PtrSementara := PtrKepala; {PtrSementara menunjuk ke
Halaman 18
lokasi yang sama dengan PtrKepala} While PtrSementara <> NIL Do With PtrSementara^ Do Begin Writeln(Nama:20, Jabatan:15); PtrSementara :=Lanjutan; End ; Writeln(-----------------------------------------------------------); Write(tekan Return);readln; End;
Halaman 19