Saturday, May 28, 2011

Apa itu Pointer: Perspektif Lain

Pointer itu biasanya sulit dimengerti orang yang baru belajar C atau C++. Pernah ditanya juga ama sodara apa itu pointer. Jadi tertarik untuk menjelaskan definisi pointer yang gw anut.

Prerequisite: Paham variable scope, Paham array, paham shortcut icon desktop

Apa sih pointer itu?
Jujur tak sanggup menjelaskan pointer langsung, jadi pake analogi sederhana aja. Lets take a little detour. Nilai dari variabel pada program itu disimpan pada memori komputer. Memori laptop saat ini umumnya 1-4 Gigabyte, artinya terdapat lebih dari 1 milyar tempat penyimpanan. Ini bisa dianalogikan dengan satu jalanan yang panjang dimana terdapat 1 milyar rumah sepanjang jalan. Jika nilai variabel diibaratkan dengan isi rumah, maka pointer adalah alamat rumah tersebut. Hal ini kadang membingungkan orang, namun seharusnya tidak, karena biasanya orang tidak sampai salah menulis surat yang ditujukan kepada "Tuan Jl Dipati Ukur No. 135" yang tinggal  di "Riza Ramadan" misalnya.

Contoh lain lagi, jika memory adalah array yang elementnya adalah bytes, maka pointer adalah index-nya. Misalnya ada:
int* j = (int) malloc(4); /*asumsi 1 integer ukurannya 4 bytes*/

kode diatas bisa dianalogikan dengan:
memory_as_array[j] = (int) malloc(4);

ketika kita printf('%d',j); maka yang kita print adalah index-nya, sedangkan jika printf('%d',*j); maka yang kita print adalah isi dari memory_array[j].

Dasarnya kira-kira begitu, tapi karena memory itu beda dengan array biasa, things got complicated. bedanya antara lain:

  • Jika array of sesuatu isinya bertype sama sehingga setiap elemen ukurannya tetap, memory tidak

masing-masing element memori bisa memiliki ukuran yang berbeda-beda. bisa jadi memory_as_array[0] panjangnya 1 byte, memory_as_array[1] panjangnya 5 bytes, memory_as_array[6] panjangnya 3 bytes.


  • Meskipun bisa berbeda ukuran elementnya, Memory itu array 1 dimensi

Perhatikan bahwa contoh diatas setelah index 0 adalah 1, sedangkan setelah index 1 adalah 6, bukan 2,3 dst, ini ada maksudnya, yaitu karena ukuran element di memory_as_array[1] adalah 5, sehingga element ke 2,3 sampai 5 adalah milik element 1. Jadi element selanjutnya yang bisa diisi adalah 6. Ada Warnings disini, meskipun element di index 2 itu bagian dari element di index 1, kita tetep bisa akses element ke 2. Disini bahayanya, karena bisa dikira element tersebut adalah element yang di 6, padahal masih bagian dari element 1.


  • Suatu element dari memory bisa dibuat mengacu element lain, analoginya seperti shortcut icon 

Umumnya di desktop ada shortcut program bukan? yang kalo kita click akan ngejalanin program tersebut?. Pertanyaannya, apakah shortcut icon itu programnya? jawabannya bukan, programnya letaknya bukan di desktop, tapi entah dimana. Shortcut itu mempercepat akses terhadap program sehingga user tidak perlu repot-repot buka explorer untuk masuk ke folder tempat program.exe berada.
Demikian juga dengan pointer, element B bisa diisi dengan element A, sehingga element B seolah olah merupakan 'shortcut' terhadap A. Bedanya antara pointer dengan analogi diatas, pointer berlaku dua arah, jika kita mengubah 'isi' dari element A, maka 'isi' B akan ikut berubah dan sebaliknya.

  • Element di memory bisa invalid

This is the reason why pointer can be nasty. Ambil contoh memory_as_array diatas yang index-nya terisi di 0,1 dan 5. Katakan memory_as_array[1] kita hapus, dengan free kalo c, atau delete kalo c++. element di 0 dan dan 5 akan tetap baik-baik saja, namun ketika kita pengen akses 'isi' element 1, bam, error.


  • Element di memory kebal akan scope, tapi index ke element tersebut tidak

beda dengan suatu variable yang hilang kalo scope-nya abis, element di memory akan tetep ada meski udah keluar scope. Sayangnya index untuk akses element tersebut tidak. Inilah kenapa ada istilah memory leak, karena index yang bisa dipake untuk ngacu elementnya udah ga ada. #:'kan bisa tinggal delete memory_as_array[1] aja bukan?' #:teorinya begitu, kalo tau emang di element ke 1. Sayangnya jarang kita tau nilai index-nya, hampir ga pernah kita bisa tau kalo yang perlu didelete itu element ke 1. #'kenapa?' #:penjelasan selanjutnya.


  • Umumnya kita tidak menentukan index memory-nya dari element yang kita buat

ambil contoh: int* j = (int) malloc(4); printf('%d',j); Outputnya tidak akan selalu sama, bisa kadang sama, kadang berbeda. Intinya bisa kita pastikan bahwa j tidak konsisten di suatu nilai.

Nah, kira-kira demikian definisi pointer menurut gw. Merasa definisi diatas salah atau kurang tepat? mohon masukkannya ya, terima kasih.

Semoga bermanfaat.

4 comments:

  1. @pebbie
    sudikah master pebbie memberikan pencerahan agar penjelasannya tidak membingungkan?

    ReplyDelete
  2. udah nggak ngerti lagi gw ja.. makanya pengen baca :D

    ReplyDelete
  3. @pebbie wk wk wk, pebbie ga ngerti pointer itu kayak programmer ga bisa pake text editor, unbelievable!

    ReplyDelete