Kali ini saya akan membahas salah satu tipe data khusus yang (bagi kebanyakan programmer pemula) cukup rumit, yakni tipe data pointer.
Saya akan membahas pengertian dan cara penggunaan tipe data pointer di dalam bahasa pemrograman pascal.
Pengertian Tipe Data Pointer Pascal
Tipe data pointer adalah tipe data yang berisi alamat memory dari sebuah variabel. Untuk dapat memahami ini, saya akan membahas terlebih dahulu bagaimana pascal (dan bahasa pemrograman lain) menyimpan nilai dari sebuah variabel.
Ketika kita mendeklarasikan sebuah variabel (misalkan variabel 'angka'), pascal akan menyiapkan sebuah tempat di memory komputer. Tempat ini memiliki alamat, yang berfungsi untuk menandai lokasi variabel tersebut.
Untuk dapat memahami ini, bayangkan memory komputer sebagai sebuah lemari besar. Variabel disimpan di dalam setiap laci lemari. Setiap laci tentunya memiliki nomor agar mudah diakses. Nomor laci inilah yang akan disimpan sebagai pointer.
Sebagai contoh, variabel 'angka' bisa ditempatkan di alamat 10023 pada memory komputer. Variabel lain, misalnya 'huruf', akan disimpan di alamat 19920, variabel 'i' bisa disimpan di alamat 10033, dst. Alamat memory inilah yang disimpan ke dalam tipe data pointer.
Pembahasan tentang pointer dan alamat memory ini sangat luas jika dibahas. Di jurusan ilmu komputer / teknik informatika, terdapat mata kuliah 'struktur data' yang secara khusus akan membahas cara penyimpanan data di dalam memory komputer, yang semuanya akan menggunakan pointer.
Cara Penggunaan Tipe Data Pointer Pascal
Sekarang, kita akan masuk ke praktek cara penggunaan tipe data pointer di dalam pascal.
Untuk dapat membuat pointer, di dalam pascal kita harus menyesuaikannya dengan variabel yang ingin diakses. Maksudnya seperti ini, jika saya mendeklarasikan sebuah variabel 'angka':
1 2 | var angka: integer ; |
Disini variabel 'angka' disiapkan untuk menampung tipe data integer.
Untuk bisa menampung alamat memory dari variabel 'angka' ini, saya harus membuat pointer yang juga di-set untuk menampung tipe data pointer integer. Berikut cara penulisannya:
1 2 | var pointer_angka : ^ integer ; |
Perhatikan tanda 'topi' atau 'caret'. Inilah cara pendeklarasian tipe data pointer di dalam pascal. ^integer berarti saya mempersiapkan sebuah pointer untuk variabel integer.
Jika kita butuh pointer ke tipe data lain, penulisannya juga akan berbeda. Misalnya, untuk membuat pointer ke alamat variabel yang bertipe data char, bisa ditulis sebagai berikut:
1 2 | var pointer_kata : ^ char ; |
Baiklah, setelah deklarasi tipe data pointer selesai, lalu bagaimana cara penggunaannya?
Di dalam pascal, kita butuh karakter '@' yang berfungsi untuk menampilkan alamat memory sebuah variabel.
Perhatikan potongan kode program pascal berikut ini:
1 2 3 4 5 | var angka: integer ; pointer_angka : ^ integer ; begin pointer_angka:= @angka; |
Baris terakhir: pointer_angka:= @angka adalah kode yang 'mengaitkan' kedua variabel ini. Sekarang, variabel pointer_angka akan berisi alamat memory dari variabel 'angka'. Silahkan anda pahami sebentar maksud kalimat ini.
Apabila di tampilkan, variabel pointer_angka akan berisi: 40960. Inilah alamat memory yang dipergunakan pascal untuk menyimpan variabel 'angka'. Alamat ini sepenuhnya ditentukan oleh pascal, terserah akan menyimpan di alamat memory mana.
Baiklah, jika sekarang variabel pointer_angka sudah berisi '40960', lalu bagaimana cara menampilkan isi dari alamat memory ini?
Jika saya menggunakan perintah:
1 | writeln (pointer_angka); |
Yang akan ditampilkan adalah alamat memory, bukan isi dari alamat memory tersebut. Untuk hal ini kita kembali harus menggunakan karakter topi '^' tetapi letaknya di akhir variabel, seperti berikut:
1 | writeln (pointer_angka^); |
Kali ini, perintah diatas akan menampilkan isi dari alamat memory yang ada di alamat '40960'.
Huff… anda masih bersama saya? Sebelum terlanjur ngantuk, mari kita langsung masuk ke contoh kode program pascal:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | program tipe_pointer; uses crt; var angka: integer ; pointer_angka : ^ integer ; begin clrscr; angka:= 99 ; writeln ( 'Variabel angka berisi: ' ,angka); pointer_angka:= @angka; writeln ( 'Variabel pointer merujuk ke nilai: ' ,pointer_angka^); angka:= 74 ; writeln ( 'Variabel pointer merujuk ke nilai: ' ,pointer_angka^); readln; end . |
Setelah penjelasan panjang sebelumnya, dapatkah anda memahami maksud kode program ini?
Dalam kode program tersebut, saya membuat 2 buah variabel: angka dan pointer_angka. Variabel pertama bertipe integer, sedangkan variabel kedua bertipe pointer integer. Selanjutnya, saya memberikan nilai 99 kedalam variabel angka.
Dapatkah anda menebak apa fungsi dari kode program berikut?
1 | pointer_angka:= @angka; |
Yup, kode diatas akan membuat variabel pointer_angka berisi alamat memory dari variabel angka.
Jika saya menulis kode:
1 | writeln (pointer_angka^) |
Hasilnya adalah 99. Sekali lagi, dapatkah anda memahami dari mana angka 99 ini berasal?
Perintah diatas berarti saya memerintahkan pascal untuk menampilkan isi dari variabel yang berada di alamat memory pointer_angka (perhatikan penambahan karakter 'topi').
Sampai disini, kedua variabel telah saling terhubung. Untuk memastikannya, saya mengubah nilai variabel angka menjadi 74. Dan, seperti yang bisa ditebak, hasil dari perintah writeln(pointer_angka^), juga akan ikut berubah.
Jika pada contoh diatas masih membuat anda bingung, mari kita masuk ke contoh kedua:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | program tipe_pointer; uses crt; var nama: string [ 20 ] ; pointer : ^ string ; begin clrscr; nama:= 'Unyil' ; writeln ( 'Variabel nama berisi: ' ,nama); pointer := @nama; writeln ( 'Variabel pointer merujuk ke nilai: ' , pointer ^); nama:= 'Alex' ; writeln ( 'Variabel pointer merujuk ke nilai: ' , pointer ^); pointer ^:= 'Joni' ; writeln ( 'Variabel nama berisi: ' ,nama); readln; end . |
Contoh diatas mirip dengan contoh sebelumnya, tapi kali ini saya menggunakan tipe data string. Perhatikan bahwa ketika saya mengubah isi dari variabel 'nama', nilai dari variabel pointer juga akan mengikuti. Dengan kata lain, variabel nama dan variabel pointer merujuk kepada nilai yang sama di alamat memory komputer.
Cara Menampilkan Alamat Memory dari Pointer
Untuk menampilkan alamat memory yang tersimpan di dalam pointer, kita harus menggunakan perintah khusus. Jika anda langsung menggunakan perintah:
1 | writeln ( 'pointer_angka' ); |
Pascal akan mengeluarkan error.
Untuk dapat menampilkan alamat memory ini, kita harus mengubahnya ke dalam tipe data word (termasuk kedalam kelompok tipe data integer), dan menggunakan fungsi addr().
Berikut contohnya:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | program tipe_pointer; uses crt; var angka: integer ; pointer : ^ integer ; i : ^ word ; begin clrscr; angka:= 99 ; writeln ( 'Variabel angka berisi: ' ,angka); pointer := @angka; writeln ( 'Variabel pointer merujuk ke nilai: ' , pointer ^); i:= addr ( pointer ); writeln ( 'Alamat memory yang digunakan adalah: ' ,i^); readln; end . |
Dalam program diatas, saya menyiapkan sebuah variabel i dengan tipe data word. Untuk menampilkan alamat memory dari tipe data pointer, saya harus menggunakan perintah:
1 | i:= addr ( pointer ); |
Dan untuk menampilkannya juga diakses dengan tanda 'i^'.
Tipe data pointer yang dibahas disini memang cukup rumit, terutama untuk pemula. Tapi saya sangat sarankan agar anda bisa memahami konsep pointer ini. Karena di berbagai bahasa pemrograman lain, konsep pointer juga sering dibahas.
Bang andre. Pas di build compile success. Tp pas di run exitcode 216. Ane baca penjelasanya sih dereferencing nil pointer. itu ada problem solvingnya bijimana ya? Ane hampir frustrasi nih
Pakai compiler apa gan? Turbo Pascal atau Free Pascal?
Barusan saya coba lagi di Free Pascal g ada masalah tuh… Coba di exit dulu programnya, atau kalau perlu restart komputer, lalu dicoba lagi.
Kalau tetap g bisa, dilompati saja dulu gan. Pointer ini relatif jarang dipakai untuk pembuatan program sehari2.
jadi gini gan, lu pasti begini kan code nya :
ptr^:=@nama;
harusnya lu isi ptr:=@nama;
tanpa tanda ^
klo lu kasih tanda ^ 216 nanti error
saya pake FPC bang. ane lagi nyontek orang rusia bang. dia pake unit sdl. udah berulang kali ane exitcode 216. abis itu ane ulang lagi. ntar exitcode lagi. hahahaha. ane pernah liat dia(orang rusianya) exitcode 216 sekali abis itu dia 'step over'lah 'breakpoint'lah 'watches'lah ujung ujungnya dia cuman ganti 1 angka abis itu di run langsung berhasil. *di videonya ga ada suaranya soalnya*
Oh, kalau pakai kode program lain saya juga g tau dimana errornya gan, hehe.. paling pas tanya ke yang buat, atau bisa juga karena dia pakai aplikasi yang berbeda (misalnya OSnya versi lama, sedangkan kita pakai yang baru).
oiya stepover watches sama breakpoint gunanya buat apa ya bang? ane kaga ngarti
Diabaikan saja dulu gan, itu fungsinya untuk proses debugging (pencarian kesalahan), terutama jika kode programnya sudah rumit dan sudah terdiri dari ratusan baris kode program.
Sangat mudah di pahami, makasih bang andre
i:= addr(pointer);
writeln('Alamat memory yang digunakan adalah: ',i^);
kok di atas tampilnya malah 40960 alamat memori yang digunakannya?
itu angka alamat dpt drimana?
Alamat memory akan selalu berubah2, itu diambil dari lokasi memory RAM komputer. RAM sendiri singkatan dari Random Access Memory, jadi alamatnya acak dan akan beda2.