POINTER


Penjelasan untuk pointer adalah sangat singkat: “Pointer adalah penunjuk kesuatu lokasi memori”.

Penunjuk?

Ya! Hanya penunjuk!


Tapi kenapa begitu menghebohkan (memusingkan) programer C?

Karena penunjuk ke memori ini-lah yang dapat menyebabkan program bisa “tersesat” hingga menimbulkan segmentation fault dan menyebabkan system abnormal (hang). Namun dapat pula menyebabkan program menjadi lebih efisien.

Suatu variabel, array, struct dsb pada saat pendefinisiannya dalam program, sesungguhnya adalah pemesanan suatu alamat memori oleh kompiler, jadi kompiler akan mengalokasikan suatu alamat di memori untuk variabel, array, struct dsb tersebut. Besarnya tergantung dari jumlah dan tipe data yang kita definisikan.

Untuk mengakses alamat variabel, array atau struct diatas kita gunakan pointer yang akan menunjuk ke alamatnya.

Cara penulisan:

tipe_pointer *nama_pointer;

contoh pointer p dengan tipe integer:


int *p;


bagaimana mendapatkan alamat dari variabel yang akan kita tunjuk (to-point)?

Gunakan operator &:

&nama_variabel;

contoh bila kita telah meng inisialisasi variabel X yang bertipe integer :

int X;

maka alamat dari variabel X telah dialokasikan oleh kompiler, dan dapat kita lihat posisinya dengan:

&X;

Bagaimana agar pointer menunjuk ke suatu alamat ?

Gunakan:

alamat_pointer = alamat_variabel;

dari contoh diatas, dengan pointer *p akan menunjuk variabel X, maka ditulis:

p = &X;

alamat pointer *p tidak ditulis dengan &(*p) adalah karena kita tidak diijinkan melakukan lvalue assignment !

Apa yang dimaksud lvalue assignment?

Sebelum menjawab pertanyaan diatas, saya jelaskan sedikit tentang lvalue dan rvalue:

lvalue adalah alamat memori tempat variabel, pointer, struct, array atau unsur data lain berada. Jadi lvalue adalah alamat.

rvalue adalah data yang diisikan pada alamat di lvalue tersebut. Jadi rvalue adalah data.

Sederhananya lvalue adalah tempat, rvalue adalah isi.

Dan kita tidak diijinkan untuk langsung memberikan/mengisi suatu nilai pada pada lvalue (lvalue assignment) hal ini dapat dianalogikan mengakui dan menempati rumah orang lain sebagai milik kita, bisa menyebabkan crash!

Kenapa perlu pointer?

Seperti penjelasan diatas, kita dilarang melakukan lvalue assignment.

Untuk lebih memperjelas, coba (harus dicoba, untuk lebih memahami) program berikut ini:


#include

int main()

{

int k, *p;

printf("======================================\n");

printf(" Sebelum pemberian nilai pada pointer \n");

printf("======================================\n");

printf(" p = %p\n", p);

printf(" *p = %p\n", *p);

printf("\n");

*p = 123;


printf("======================================\n");

printf(" Pemberian Nilai pada pointer \n");

printf(" *p = %p \n",*p);

printf("======================================\n");

printf(" p = %p\n", p);

printf(" *p = %p\n", *p);

printf(" &k = %p\n", &k);

printf(" k = %p\n", k);

printf("\n");


k = 10;

p = &k;

printf("======================================\n");

printf(" Penunjukan pointer \n");

printf(" k = %p\n",k);

printf(" p = &k \n");

printf("======================================\n");


printf(" p = %p\n", p);

printf(" *p = %p\n", *p);

printf(" &k = %p\n", &k);

printf(" k = %p\n", k);

return 0;

}

saat di jalankan hasilnya:


======================================

Sebelum pemberian nilai pada pointer

======================================

p = 0xb7f90ff4

*p = 0x13dd9c

======================================

Pemberian Nilai pada pointer

*p = 0x7b

======================================

p = 0xb7f90ff4

*p = 0x7b

&k = 0xbf9ad540

k = 0xb7fbeb90

*(&k) = 0xb7fbeb90

======================================

Penunjukan pointer

k = 0xa

p = &k

======================================

p = 0xbf9ad540

*p = 0xa

&k = 0xbf9ad540

k = 0xa

*(&k) = 0xa


ket:

123 desimal = 7b Hexa atau 0x7b

10 desimal = a Hexa atau 0xa


Dari program diatas, bila kita cermati, *p adalah seperti variabel biasa, bisa dilakukan operasi data didalamnya, namun penulisan alamat untuk *p tidaklah sama dengan penulisan alamat pada variabel lain. Alamat dari pointer *p dituliskan p sedangkan alamat dari variabel k dituliskan &k.

Kita lihat sebelum penunjukan ke alamat suatu variabel, variabel pointer *p menempati alamat 0xb7f90ff4, dan variabel k menempati alamat 0xbf9ad540.

Setelah penunjukan:

p = &k;

alamat pointer p menunjuk ke alamat 0xbf9ad540 atau alamat dari variabel k, sehingga semua operasi pada variabel k akan mempengaruhi *p, karena data operasi tersebut adalah pada alamat 0xbf9ad540 yang ditunjuk oleh variabel k dan pointer *p.

Sehingga pointer *p seolah-olah adalah alias (nama lain) dari variabel k.


Kenapa tidak menggunakan variabel lain (bukan pointer untuk menunjuk k)?

pertanyaan diatas, dapat diilustrasikan:

variabel_lain = k;

ilustrasi diatas sebenarnya adalah hanya meng-copy-kan rvalue dari alamat k ke alamat variabel_lain.

Bagaimana bila langsung mengcopykan alamat dari variabel k ke alamat variabel_lain sehingga alamat dari variabel_lain mempunyai alamat yang sesuai dengan variabel k?

alamat_ variabel_lain = &variabel_lain

alamat _ k = &k

dan: &variabel_lain = &k

adalah lvalue assignment, yang diharamkan!



1 komentar: