Pointer (Part 1)
Alamat dan Pointer Konsep pointer sebenarnya cukup sederhana. Pointer sesungguhnya berisi alamat dari suatu data, bukan data sebagaimana variabel yang telah anda kenal.
Alamat dan Pointer Setiap byte di dalam memori komputer memiliki sebuah alamat. Di dalam memori inilah variabel disimpan. Tetapi tentu saja pemrogram tidak perlu menyebutkan alamat dari suatu variabel secara explisit. Pada saat program dimuat di dalam memori, variabel akan diletakkan dengan sendirinya pada alamat tertentu.
Alamat dan Pointer Suatu pointer di dalam program dimaksudkan untuk menunjuk suatu alamat memori. Misalnya kalau pint adalah pointer, dan vint adalah variabel yang terletak di memori beralamat 0xfff2, pointer pint dapat diatur agar menunjuk ke variabel vint.
Alamat dan Pointer
Mengetahui Alamat Suatu Variabel Alamat suatu variabel dapat diketahui dengan mudah, caranya tambahkan operator alamat, berupa simbol & di depan nama variabel. Dengan mengirimkan ke cout, alamat dari suatu variabel akan ditampilkan ke layar.
Mengetahui Alamat Suatu Variabel #include <iostream.h> #include <conio.h> void main() { int bil1 = 5; float bil2 = 7.5; double bil3 = 17.777; cout<<"Isi variabel : "<<endl; cout<<"bil1 = "<<bil1<<endl; cout<<"bil2 = "<<bil2<<endl; cout<<"bil3 = "<<bil3<<endl; cout<<endl; cout<<"Alamat variabel : "<<endl; cout<<"bil1 = "<<&bil1<<endl; cout<<"bil2 = "<<&bil2<<endl; cout<<"bil3 = "<<&bil3<<endl; getch(); } Mengetahui Alamat Suatu Variabel
Mengetahui Alamat Suatu Variabel Perlu diketahui, notasi 0x pada hasil program di depan menyatakan notasi heksadesimal. Pada C++, tanda & juga dipakai untuk referensi (alias dari suatu variabel).
Mendefinisikan Variabel Pointer Format : tipe_data dapat berupa sembarang tipe data seperti halnya variabel bukan pointer. nama_variabel adalah variabel pointer. tipe_data *nama_variabel
Mengisi Variabel Pointer Supaya variabel pointer menunjuk ke variabel lain, mula-mula harus diisi dengan alamat dari variabel yang hendak ditunjuk. Misalnya terdapat pendefinisian seperti berikut : Variabel pint dapat diatur agar menunjuk ke vint dengan cara sebagai berikut : Pernyataan diatas berarti : “pint diisi dengan alamat dari vint”. int vint = 55; int *pint; pint = &vint;
#include <iostream.h> #include <conio.h> void main() { int vint = 55; int *pint; pint = &vint; //pointer menunjuk ke vint cout<<"Alamat vint = "<<&vint<<endl; cout<<"Isi pint = "<<pint<<endl; getch(); }
Mengisi Variabel Pointer Pada contoh di depan : Baris tersebut ternyata menampilkan isi dari pointer itu sendiri, bukan isi dari variabel vint. cout<<"pint = "<<pint<<endl;
Mengakses Nilai Yang Ditunjuk Pointer Berdasarkan contoh di depan, nilai dari vint dapat diakses melalui pint setelah pernyataan dibawah ini dijalankan. Cara mengaksesnya adalah dengan melibatkan operator “tak langsung” yang berupa simbol * dan diletakkan di depan nama variabel pointer. Contoh : Berarti “nilai yang ditunjuk oleh pint”. pint = &vint; *pint;
#include <iostream.h> #include <conio.h> void main() { int vint = 55; int *pint; pint = &vint; //pointer menunjuk ke vint cout<<"Isi vint = "<<vint<<endl; cout<<"Alamat vint = "<<&vint<<endl; cout<<"Isi pint = "<<pint<<endl; cout<<"Nilai yang ditunjuk oleh pint : "<<*pint<<endl; getch(); }
Mengakses Nilai Yang Ditunjuk Pointer Program di depan menunjukkan pengaksesan terhadap vint dapat dilakukan melalui *pint. Contoh berikut menunjukkan isi vint diubah melalui *pint.
#include <iostream.h> #include <conio.h> void main() { int vint = 55; int *pint; pint = &vint; //pointer menunjuk ke vint cout<<"Isi vint semula = "<<vint<<endl; *pint = 77; cout<<"Isi vint sekarang = "<<vint<<endl; getch(); }
Pointer Void Pada contoh-contoh program di depan telah ditunjukkan pointer yang menunjuk ke tipe data tertentu. Sebenarnya juga dimungkinkan untuk membuat pointer tak bertipe. Caranya yakni dengan meletakkan kata kunci void di bagian penentu tipe pointer. Contoh : Suatu pointer void seperti contoh diatas dapat digunakan untuk menunjuk ke sembarang tipe data. void *ptr;
#include <iostream.h> #include <conio.h> void main() { int bil1 = 55; float bil2 = 33.45; void *ptr; ptr = &bil1; //bisa menunjuk ke int cout<<"Nilai yang ditunjuk ptr : "<<*(int*)ptr<<endl; ptr = &bil2; //bisa menunjuk ke float cout<<"Nilai yang ditunjuk ptr : "<<*(float*)ptr<<endl; getch(); }
Pointer Void Pada program di depan, bentuk berikut perlu diberikan : Ini disebabkan C++ tidak tahu maksud *ptr mengingat ptr adalah pointer void. Cara ini bukan hanya berlaku jika kita bermaksud mengambil nilai yang ditunjuk oleh ptr tapi juga ketika kita mengubahnya. Seperti contoh program berikut : *(int*)ptr *(float*)ptr
#include <iostream.h> #include <conio.h> void main() { int bilangan = 55; void *ptr; ptr = &bilangan; cout<<"bilangan semula : "<<bilangan<<endl; *(int*)ptr = 77;//mengubah nilai bilangan melalui ptr cout<<"bilangan sekarang : "<<bilangan<<endl; getch(); }
Pointer (Part 2)
Pointer dan Array ptgl = tgl_lahir; int tgl_lahir[] = {24, 6, 1965}; Pointer dan array memiliki hubungan yang dekat. Secara internal array juga menyatakan alamat. Misalnya, didefinisikan : Agar ptgl menunjuk ke array, diperlukan pernyataan berupa : Perhatikan tidak ada tanda & di depan tgl_lahir. Ini disebabkan nama array sebenarnya sudah menyatakan alamat. Oleh karena itu tanda & tidak diperlukan. int tgl_lahir[] = {24, 6, 1965}; int *ptgl; ptgl = tgl_lahir;
Pointer dan Array Pernyataan seperti : Dimana ptgl adalah pointer dan tgl_lahir adalah array, identik dengan : ptgl = tgl_lahir; ptgl = &tgl_lahir[0];
#include <iostream.h> #include <conio.h> void main() { int tgl_lahir[] = {24, 6, 1965}; int *ptgl; ptgl = tgl_lahir; //ptgl menunjuk ke array cout<<"Nilai yang ditunjuk oleh ptgl : "; cout<<*ptgl<<endl; cout<<"Nilai dari tgl_lahir[0] : "; cout<<tgl_lahir[0]<<endl; getch(); }
Pointer dan Array Seluruh elemen array dapat ditampilkan dengan pernyataan : Bentuk tgl_lahir[i] dapat diubah menjadi notasi pointer seperti berikut : Contoh program : for(int i=0; i<3; i++) cout<<tgl_lahir[i]<<endl; for(int i=0; i<3; i++) cout<<*(ptgl + i)<<endl;
#include <iostream.h> #include <conio.h> void main() { int tgl_lahir[] = {24, 6, 1965}; int *ptgl; ptgl = tgl_lahir; //ptgl menunjuk ke array for(int i=0; i<3; i++) cout<<*(ptgl + i)<<endl; getch(); }
Pointer dan Array Perlu diketahui, pada notasi seperti : *(ptgl + i) tgl_lahir + i tidak berarti : Tetapi dengan bijaksana dapat mengetahui bahwa tgl_lahir + i berarti : *(ptgl + i) ptgl + (i byte) ptgl + (ukuran tipe elemen ptgl)*i
Pengaksesan Array Melalui Pointer
Pointer dan Array Seluruh elemen array juga dapat diakses melalui variabel pointer. Salah satu caranya yaitu dengan mengubah isi variabel pointer sesuai dengan alamat masing-masing elemen array.
#include <iostream.h> #include <conio.h> void main() { int tgl_lahir[] = {24, 6, 1965}; int *ptgl; ptgl = tgl_lahir; for(int i=0; i<3; i++) cout<<"ptgl = "<<ptgl<<endl; cout<<"*ptgl = "<<*ptgl<<endl; ptgl++; } getch();
Pointer (Part 3)
Pointer dan String #include <iostream.h> Contoh hubungan pointer dan string : #include <iostream.h> #include <conio.h> void main() { char *ptokoh = "gatotkaca"; cout<<ptokoh<<endl; getch(); }
Pointer dan String Pada contoh diatas : Akan menyebabkan C++ : Mengalokasikan ptokoh sebagai variabel pointer yang menunjuk ke data bertipe char dan menempatkan konstanta string “gatotkaca” ke suatu lokasi di memori komputer. Kemudian ptokoh akan menunjuk ke lokasi string “gatotkaca”. char *ptokoh = “gatotkaca”;
Pointer dan String Pernyataan didepan menyerupai pernyataan : Perbedaannya : ptokoh adalah pointer yang dengan mudah dapat diatur agar menunjuk ke data string. tokoh adalah array yang menyatakan alamat yang konstan, tidak dapat diubah. Yang dapat diubah adalah elemen array-nya. Perbedaannya ditunjukkan oleh program berikut : char tokoh[] = “gatotkaca”;
#include <iostream.h> #include <conio.h> void main() { char tokoh[] = "gatotkaca"; char *ptokoh = "gatotkaca"; cout<<"tokoh = "<<tokoh<<endl; cout<<"ptokoh = "<<ptokoh<<endl; //tokoh++; //tidak diperkenankan ptokoh++; //diperkenankan getch(); }
Array Pointer Suatu array bisa digunakan untuk menyimpan sejumlah pointer. Contoh : Merupakan pernyataan untuk mendefinisikan array namahari yang berisi 7 buah elemen berupa pointer. Pointer ini menunjuk ke data bertipe char. char *namahari[7];
#include <iostream.h> #include <conio.h> void main() { char *namahari[7] = {"senin", "selasa", "rabu", "kamis", "jum'at", "sabtu", "minggu"}; for(int i=0; i<7; i++) cout<<namahari[i]<<endl; } getch();
Pointer Menunjuk Pointer Suatu pointer bisa saja menunjuk pointer yang lain. Untuk itu diperlukan pendefinisian sebagai berikut : int var_x; int *ptr1; //satu tanda * di depan ptr1 int **ptr2; //dua tanda * di depan ptr2
Pointer Menunjuk Pointer Pada pendefinisian diatas : var_x adalah variabel bertipe int. ptr1 adalah variabel pointer yang menunjuk ke data bertipe int. ptr2 adalah varibel pointer yang menunjuk ke pointer int. Agar ptr1 menunjuk ke var_x dan ptr2 menunjuk ke ptr1, maka diperlukan perintah : ptr1 = &var_x; ptr2 = &ptr1;
#include <iostream.h> #include <conio.h> void main() { int var_x = 273; int *ptr1; int **ptr2; cout<<"var_x = "<<var_x<<endl; ptr1 = &var_x; ptr2 = &ptr1; //mengakses nilai var_x melalui ptr1 cout<<"*ptr1 = "<<*ptr1<<endl; //mengakses nilai var_x melalui ptr2 cout<<"**ptr1 = "<<**ptr2<<endl; getch(); }