Thursday, 1 October 2015

Pointer Dalam C++

Pointer adalah built-in type di C dan C++, dimana C++ mengambil konsep pointer dari C. Pointer sebenarnya sangat terkait dengan "Abstract C Machine", yaitu model mesin abstrak dimana program C bekerja. Abstract C Machine adalahmesin abstrak dimana mesin tersebut memiliki prosesor untuk menginterpretasikan stream of instruction, dan addressable memory yang terbagi kedalam 3 bagian : automatic memory, static memory dan free memory. Addressable memory adalah memory yang konten-nya dapat diambil jika diketahui alamatnya. Lebih jauh lagi, terdapat asumsi bahwa konten memori dapat di ambil dengan waktu konstan, tidak peduli berapa nilai alamat. Hal ini disebut dengan Random Access Memory. Pointer (variabel penunjuk) juga sering di defenisikan sebagai suatu variabel yang berisi alamat me­mo­ri dari suatu variabel lain. Alamat ini merupakan lokasi dari obyek lain (bia­sanya variabel lain) di dalam memori. Contoh, jika sebuah variabel berisi alamat da­ri variabel lain, variabel pertama dikatakan menunjuk ke variabel kedua.

Bagaimana Cara Menggunakan Pointer ?
Ada 2 operator pointer yang dikenal secara luas, yaitu operator & dan operator *.
Operator & 


Operator & merupakan operator alamat. Pada saat pendeklarasian variable, user tidak diharuskan menentukan lokasi sesungguhnya pada memory, hal ini akan dilakukan secara otomatis oleh kompiler dan operating sysem pada saat run-time. Jika ingin mengetahui dimana suatu variable akan disimpan, dapat dilakukan dengan memberikan tanda ampersand(&) didepan variable , yang berarti "address of". Contoh :

ted = &andy;

Penulisan tersebut berarti akan memberikan variable ted alamat dari variable andy. Karena variabel andy diberi awalan karakter ampersand (&), maka yang menjadi pokok disini adalah alamat dalam memory, bukan isi variable. Misalkanandy diletakkan pada alamat 1776 kemudian dituliskan instruksi sbb :
andy = 25;
fred = andy;
ted = &andy;

Maka hasilnya :
Operator *
Operator * merupakan operator reference. Dengan menggunakan po­inter, kita dapat mengakses nilai yang tersimpan secara langsung dengan mem­berikan awalan operator asterisk (*) pada identifier pointer, yang ber­arti "value pointed by". Contoh :


beth = *ted;

(dapat dikatakan:"beth sama dengan nilai yang ditunjuk oleh ted") beth = 25, karena ted dialamat 1776, dan nilai yang berada pada alamat 1776 adalah 25.
Ekspresi dibawah ini semuanya benar, perhatikan :

andy = 25;
&andy = 1776;
ted = 1776;
*ted = 25;

Ekspresi pertama merupakan assignation bahwa andy = 25;. Ke­dua, meng­­gunakan operator alamat (address/derefence operator (&)), se­hing­ga akan meng­embalikan alamat dari variabel andy. Ketiga bernilai be­nar karena as­signation untukted adalah ted = &andy;. Keempat meng­gu­nakan reference ope­ra­tor (*) yang berarti nilai yang ada pada alamat yang di­­tunjuk oleh ted, yaitu 25. Maka ekspresi dibawah ini pun akan bernilai be­nar : *ted = andy;


Alasan Mengapa Menggunakan Pointer

Adapun alas an penggunaan pointer pada C++ adalah sebagai berikut :
Mengirimkan “Parameter yang berupa variabel” ke dalam fungsi, artinya nilai variabel bisa diubah di dalam fungsi.int nama fungsi (int *b) {
*b = *b + 1;
}
main () {
int x=1;
nama_fungsi (&x);
printf (”%d”, x); // output :2, karena x diubah di dalam fungsi menjadi x=x+1;
}

Penggunaan pointer dapat meningkatkan kinerja untuk operasi yang dilakukan secara berulang.
Contoh program yang menggunakan pointer ada di bawah (contohnya menggunakan pointer terhadap parameter yang di-pass ke aplikasi ie. argv)Code:

  1. /**
  2. * pointer.c - contoh penggunaan pointer
  3. * coded by void ;)
  4. */
  5. #include
  6. #include

  7. int main(int argc, char **argv)
  8. {
  9. if (argc < style=""> /* prks prmtr yg dbrkn */
  10. printf("aturan pakai: %s \n", argv[0]); /*jk prmtr tra pngl help */
  11. exit(1); /* keluar */
  12. }
  13. printf("hello %s :)\n", argv[1]); /* tmpl psn & prmetr */
  14. return 0; /* keluar */
  15. }

Contoh penggunaannya
Code:
bash-4.0$ # compile source codenya
bash-4.0$ gcc -s -o pointer pointer.c
bash-4.0$ # jalankan aplikasinya tanpa parameter
bash-4.0$ ./pointer
aturan pakai: ./pointer
bash-4.0$ # jalankan aplikasinya dengan parameter
bash-4.0$ ./pointer "sandra dewi"
hello sandra dewi :)
bash-4.0$
Penjelasannya adalah kira-kira sebagai berikut :
argc adalah jumlah argumen / parameter pada command line. jumlah minimalnya adalah 1, yaitu aplikasi yang sedang dieksekusi, dan nama aplikasi yang dieksekusi tersebut disimpan pada variabel argv, tepatnya argv[0]
Seperti yang saya jelaskan di atas, variabel argv menampung parameter yang berada pada command line. kira2 seperti ini
Code:
bash-4.0$ killall enemy
argc = 2
argv[0] = killall
argv[1] = enemy
Kalau masih bingung soal argc dan argv, mungkin bisa membuka lagi buku2 pemrograman C/C++ soalnya saya juga masih newbie soal pemrograman. kalau bisa, cari buku yang judulnya "C For Scientist and Engineers", sampai sekarang saya masih belajar dari buku itu.
Nah, berikut ini sample kode serta penggunaannya untuk mengetahui nilai argc dan argv
Code:
  1. #include

  2. int main(int argc, char **argv)
  3. {
  4. static int i;

  5. printf("nilai argc: %lu\n", argc);
  6. for (i = 0; i <>
  7. printf("argv[%lu] -> %s\n", i, argv[i]);
  8. }
  9. return 0;
  10. }
  11. Jika dieksekusi, maka contohnya seperti ini
  12. Code:
  13. bash-4.0$ ./test
  14. nilai argc: 1
  15. argv[0] -> ./test
  16. bash-4.0$ ./test satu dua tiga empat capedeh
  17. nilai argc: 6
  18. argv[0] -> ./test
  19. argv[1] -> satu
  20. argv[2] -> dua
  21. argv[3] -> tiga
  22. argv[4] -> empat
  23. argv[5] -> capedeh

Syarat Membuat Pointer

Variabel statis adalah variabel yang dideklarasikan dan dinamai pada saat penulisan program. Memori yang dipakai oleh variabel ini akan tetap ada (dianggap terpakai) selama program dimana variabel tersebut dideklarasikan sedang dijalankan.

Variabel dinamis adalah variabel yang dibuat (dan mungkin juga dihapus/dirusak) selama eksekusi progam. Karena variabel dinamis belum nyata ada pada
saat program dikompilasi (ia nyata-nyata ada pada saat dibuat yaitu pada saat program dieksekusi), maka variabel seperti ini tidak dapat dinamai pada saat program dibuat/ditulis.

Satu-satunya cara untuk mengakses variabel dinamis adalah dengan menggunakan pointer. Saat suatu variabel dinamis dibuat, ia belum berisi data dan harus memiliki suatu tipe tertentu seperti halnya variabel biasa.
Sebaliknya variabel statis tidak dapat dibuat ataupun dihapus pada saat eksekusi program dan variabel pointer tidak dapat digunakan untuk menunjuk kepada variabel statis. Variabel statis dapat diakses hanya dengan menggunakan namanya dan bila kita ingin menunjuk pada suatu posisi dalam array maka kita dapat melakukannya dengan menggunakanindeks/variabel yang bertipe seperti indeks dari array.


Type Data Yang Dapat Menggunakan Pointer
Pointer Bertipe Void
Pada C++ terdapat pointer yang dapat menunjuk ke tipe data apapun, po­inter semacam ini dideklarasikan dengan tipe voidsehingga sering dikenal de­ngan is­ti­lah Void Pointer. Berikut ini contoh listing program yang meng­gu­na­kan void po­inter. 


Hasilnya adalah :

Dari hasil yang diberikan oleh program di atas terlihat bahwa sebuah po­inter yang bertipe void dapat digunakan untuk menunjuk tipe data int, double, dan char
Melewatkan Array Menggunakan Pointer
Selain yang telah disebutkan di atas, pointer juga dapat berfungsi untuk me­le­watkan variabel yang bertipe array di dalam sebuah fungsi. Berikut ini
itu­lis­kan dua buah contoh program yang dapat menjelaskan pernyataan ini.Program yang ditulis tanpa menggunakan pointer


Hasilnya adalah :

Program yang ditulis menggunakan pointer


Hasilnya adalah :


Pointer Aritmetika
Elemen-elemen array biasanya diakses melalui indeksnya, sebenarnya ada cara lain yang lebih efisien, yaitu dengan menggunakan pointer. Pointer sema­cam ini disebut dengan istilah pointer aritmetika. Konsep dasar dari pointer arit­me­tika ini adalah melakukan operasi aritmetika terhadap variabel yang bertipe po­int­er. Misalnya kita mempunyai 5 buah data bertipe int yang disimpan dalam ben­tuk array dengan nama A dan digambarkan sebagai berikut :

Jika kita mempunyai pointer p, maka kita dapat mengakses elemen-ele­me­n array di atas dengan cara melakukan operasi terhadap p. Berikut contoh pro­gram yang akan mengilustrasikan kasus tersebut.


Hasilnya adalah :


Tipe ReferencePada pembahasan pointer terdapat sebuah tipe data yang kerap kali digunakan, ya­i­tu tipe reference. Tipe reference sebenarnya merupakan alias (julukan/ nama lain) dari variabel yang dideklarasikan dengan menggunakan tipe data tertentu. Misal­nya kita mendeklarasikan sebuah variabel x yang bertipe int dan kita akan mem­bu­at alias (dengan nama n) dari variabel tersebut, maka hal yang harus dilakukan ada­lah mendeklarasikan alias tersebut menggunakan tipe reference yang ditulis­kan dengan int&. Berikut ini sintak yang menjelaskan contoh di atas.


Int x; //mendeklarasikan variabel x dengan int
Int& n = x; //mendeklarasikan n (yang merupakan alias x) dengan tipe reference//(int&)


Alias n dibuat dengan cara mengakses alamat yang ditempati oleh varia­bel x, yaitu dengan menggunakan tanda &. Oleh karena n merupakan alias dari x, ma­ka x dan n akan mempunyai nilai yang sama atau dengan kata lain keduanya akan saling mempengaruhi.


Pointer NULLPada saat program dijalankan, pointer akan menunjuk ke alamat acak pa­da memori, sehingga diperlukan inisialisasi agar hal tersebut tidak terjadi. Dalam C++ terdapat sebuah cara untuk membuat pointer tidak menunjuk ke alamat ma­na­pun, yaitu dengan mengisikan ponter tersebut dengan nilai NULL. Karena hal inilah maka pointer tersebut sering dinamakan pointer NULL (NULL Pointer). Se­bagai contoh kita mempunyai pointer p, dan kita ingin melakukan inisialisasi pada pointer tersebut dengan nilai NULL, maka sintaknya adalah sebagai berikut.



Referensi :
Devid Harya Lesmana, Azhar Ahmad, Lilik Emi Rahayu, Bian Dwi Pamungkas : Bahasa Pemograman Terstruktur.
http://www.gamedevid.org/forum/showthread.php?t=5075
http://www.khabib.staff.ugm.ac.id/index.php?option=com_content&task=view&id=85&Itemid=33
http://www.ansav.com/forum/showthread.php?t=130
http://rizqtech.net/2008/05/11/pointer-dalam-bahasa-c/
http://alextomasoa..com

No comments:

Post a Comment