Pointer pada C++
1. Alamat
Dan Pointer
Pointer
adalah variabel yang berisi alamat dari
variabel yang memiliki nilai tertentu. Konsep dari pointer sebenarnya tidak sekompleks yang diduga oleh beberapa
orang. Pointer sesungguhnya berisi
alamat suatu data, bukan data sebagaimana pada variable yang telah dikenal.
Seperti diketahui, setiap byte di dalam memori computer memiliki alamat. Alamat memori dimulai dari 0. Didalam memori
inilah variable disimpan. Namun, tentu saja program tidak perlu
menyebutkan alamat suatu variable
secara eksplisit. Pada saat program dimuat didalam memori, variable akan diletakkan dengan sendirinya pada alamat tertentu.
Suatu pointer didalam program dimaksudkan untuk menunjuk ke suatu alamat
memori. Sebagai contoh pada gambar di bawah ini, kalau pint adalah pointer, dan
vint adalah variable yang terletak
didalam memori beralamat 0x28fee8, pointer pint dapat
diatur agar menunjuk ke variable vint.
2. Mengetahui
Alamat Suatu Variabel
Alamat suatu variable dapat diketahui dengan mudah. Caranya ialah dengan
menambahkan operator alamat, berupa simbol &, didepan nama variable. Dengan mengirimkan ke cout,
alamat suatu variable akan
ditampilkan ke layar.
Program alifbata.cpp memperlihatkan adanya tiga deklarasi variable bernama alif, ba dan ta. Alamat
ketiga variable ini ditampilkan
melalui satu cout. Alamat diperoleh
dengan menambahkan tanda & didepan nama variable.
Contoh-1
Input :
Output :
3. Deklarasi Variabel Pointer
Suatu variable pointer dideklarasikan dengan bentuk seperti berikut :
tipe_data
nama_variabel
Dalam hal ini:
·
tipe_data dapat berupa sembarang tipe
seperti halnya pada deklarasi variable
bukan pointer;
·
nama_variabel adalah nama variable pointer
Beberapa contoh deklarasi variable pointer :
int *pint; //pointer ke int
char *pch; //pointer ke char
float *pfl; //pointer ke float
Beberapa variable
pointer dapat dideklarasikan dengan sebuah pernyataan.
Contoh :
char
*pch1, pch2;
Mendeklarasikan :
·
pch1 : pointer yang menunjuk ke data bertipe char.
·
Pch2 : pointer yang menunjuk ke data bertipe char.
4. Mengisi Variable Pointer
Supaya suatu variabel pointer menunjuk ke variabel lain,
mula-mula harus diisi dengan alamat variabel yang hendak ditunjuk. Sebagai
contoh, terdapat deklarasi seperti berikut :
Int vint = 35;
Int *pint;
Variabel pointer pint dapat diatur agar menunjuk ke vint dengan cara seperti
berikut :
pint
= &vint;
Pernyataan diatas berarti : *pint diisi
dengan alamat vint”. Operator &
menyatakan “alamat dari”. Sekarang, lihatlah program berikut yang
mendeklarasikan variabel pointer,
mengisinya dengan alamat suatu variabel, dan menampilkan isi pointer.
Contoh-2
Input :
Output :
Pada contoh diatas,
cout<<"pint
= "<<pint<<endl;
terlihat menampilkan isi pointer itu sendiri, bukan isi variabel vint.
5.
Mengakses
Nilai Yang Ditunjuk Pointer
Berdasarkan contoh pada program
sebelumnya, alamat vint dapat diakses melalui pint setelah pernyataan : pint
=&vint; dijalankan. Persoalan berikutnya adalah, “Bagaimana nilai vint
dapat diakses melalui pint ?”. Nah hal itu dilaksanakan dengan melibatkan
operator “tak langsung”. Operator ini berupa symbol * dan diletakkan didepan
nama variabel pointer.
Contoh : *pint berarti “nilai yang ditunjuk
oleh pint”.
Contoh-3
Input :
Output :
Hasil diatas menunjukkan bahwa pengaksesan terhadap vint
dapat dilakukan melalui *pint.
Program berikut menunjukkan , nilai vint
diubah melalui pint :
Contoh-4
Input
:
Output :
Pada program sebelumnya diberikan contoh beberapa variabel pointer yang menunjuk ke tipe data
tertentu. Namun, sebenarnya dimungkinkan untuk membuat pointer yang tidak bertipe. Caranya adalah dengan meletakkan kunci
void pada bagian penentu tipe pointer.
Contoh :
void
*ptr;
Merupakan pernyataan untuk mendeklarasikan ptr sebagai
variabel pointer void. Suatu pointer void adalah pointer yang dapat menunjuk keseberang tipe data. Sebagai contoh,
anda dapat mengatur agar pointer ini
menunjuk ke tipe data int, tetapi di saat lain diperlukan untuk menunjuk data
bertipe float.
Berikut program yang menunjukkan operasi pada pointer void :
Contoh-5
Input :
Output :
Tampak bahwa variable pointer ptr dapat menunjuk ke tipe int atau float.
Seandainya terdapat deklarasi
int *ptr;
float vfl = 51.5;
Penugasan seperti
ptr
= &vfl;
Tidak diperkenankan. Penyebabnya, tipe data yang
ditunjuk oleh ptr dan tipe data vfl berbeda. Berbeda halnya kalau ptr
dideklarasikan sebagai :
void *ptr;
pada program diatas, pernyataan :
cout<<"Nilai yang ditunjuk ptr = "
<<*(int *) ptr<<endl;
cout<<"Nilai yang ditunjuk ptr = "
<<*(float *) ptr<<endl;
mungkin kelihatan aneh. Bentuk seperti :
*(int
*) ptr
*(float
*)
Perlu diberikan. Hal ini disebabkan C++
tidak tahu maksud seperti: *ptr
mengingat ptr adalah pointer void. Oleh karena itu, anda harus
menyebutkan tipe data yang akan diakses melalui type cast. Contoh : *(int *)ptr
menyatakan bahwa data yang diakses bertipe int
cara seperti ini berlaku tidak saja kalau anda bermaksud mengambil nilai
yang ditunjuk oleh ptr, tetapi juga kalau mau mengubahnya.
Berikut program yang menunjukkan
pengubahan variabel yang ditunjuk oleh pointer
void.
Contoh-6
Input :
Output :
Pointer
dan array
mempunyai hubungan yang dekat. Secara internal,
array juga menyatakan alamat. Sebagai
contoh dideklarasikan : int tgl_lahir [] = {24,6,1965};
dan int *ptgl;
Agar ptgl menunjuk ke array, diperlukan pernyataan berupa : ptgl
= tgl_lahir;
Perhatikan dengan seksama pernyataan
diatas. Tidak ada tanda & didepan tgl_lahir. Padahal, beberapa contoh sebelumnya
menggunakan format : ptr = &variabel ,bila variabel bukan merupakan array. Hal ini disebabkan nama array sebenarnya sudah menyatakan
alamat. Oleh karena itu tanda & tidak diperlukan.
Input :
Output :
Setelah penugasan : ptgl
= tgl_lahir;
Maka ptgl akan menunjuk ke elemen
pertama array tgl_lahir. Itulah
sebabnya :
cout<<"Nilai yang
ditunjuk ptgl = "
<<*ptgl<<endl;
Menampilkan nilai pertama pada
tgl_lahir. Seluruh elemen array
tgl_lahir dapat ditampilkan melalui pernyataan :
for (i=0; i<3); i++)
cout<<"
"<<tgl_lahir[i]<<endl;
bentuk seperti tgl_lahir[i] dapat
diubah dalam notasi seperti berikut :
for (i=0; i<3); i++)
cout<<"
"<<*(tgl_lahir + 1)<<endl;
Input :
Output :
Perlu diketahui, pada notasi seperti : *(tgl_lahir
+ 1) ungkapan tersebut tidak berarti tgl_lahir + (1 byte).
Namun, C++ dengan bijaksana dapat mengetahui bahwa tgl_lahir
+ 1 berarti : “tgl_lahir +(ukuran tipe
elemen tgl_lahir)* l”
Seluruh elemen array
juga dapat diakses melalui variabel pointer.
Salah satu caranya adalah dengan mengubah isi variabel pointer sesuai dengan alamat setiap elemen array.
Input :
Output :
Tampak bahwa sebelum for,ptgl berisi alamat tgl_array.
Kemudian, secara berurutan alamat yang ditunjuk ptgl dinaikkan sebesar 4
(sesuai dengan data int).
8.
Pointer
Dan String
Input
:
Output :
Pada contoh diatas : char
*ptokoh = "GatotKaca"; akan menyebabkan C++ :
·
Mengalokasikan ptokoh sebagai variabel
pointer yang merujuk ke data bertipe char dan menempatkan kostanta string “Gatotkaca”
kesuatu lokasi di memori komputer;
·
Kemudian ptokoh akan menunjuk kelokasi
string “Gatotkaca”.
Pernyataan diatas menyerupai pernyataan : char
tokoh[] = “Gatotkaca”; perbedaannya :
·
ptokoh adalah pointer yang dengan mudah dapat diatur agar menunjuk ke data
string;
·
ptokoh adalah array yang menyatakan alamat yang konstan, tidak dapat diubah.
Bagian yang dapat diubah adalah elemen array-nya.
Perbedaanya ditunjukkan pada program berikut :
Input :
Output :
Tampak bahwa pointer
dengan mudah dapat diubah (misalnya ptokoh++).
Dengan cara seperti itu, kalau semula ptokoh menunjuk “Gatotkaca”, kini
menunjuk “atotkaca”
9. Array
Pointer
Satu array bisa digunakan untuk menyimpan sejumlah pointer. Contoh : string *namahari[7];
merupakan pernyataan untuk mendeklarasikan array
namahari yang berisi tujuh elemen berupa pointer.
Pointer tersebut menunjuk ke data
bertipe string. Program berikut memperlihatkan contoh pembuatan array pointer dan cara
menginisialisasinya. Kemudian, nilai yang ditunjuk oleh elemen-elemen pointer ini di tampilkan ke layar.
Input :
Output :
Pada contoh diatas, setiap nilai yang
ditunjuk oleh elemen pointer array
namahari dapat diakses melalui namahari[i]. Program diatas memperlihatkan array pointer setelah perintah berikut
dijalankan:
for (i=0; i<7; i++)
phari[i] = &namahari[i];
10. Pointer Menunjuk Pointer
Untuk membentuk rantai pointer, diperlukan deklarasi seperti berikut :
int var_x = 273;
int *ptr1;
//satu tanda * didepan ptr1
int **ptr2; // dua tanda * didepan ptr2
pada deklarasi diatas :
·
Var_x
adalah variabel bertipe int.
·
Ptr1
adalah variabel pointer yang menunjuk
ke data bertipe ptr1.
·
Ptr2
adalah variabel pointer yang menujuk
ke pointer int.
Agar ptr1 menunjuk
ke variabel var_x,
perintah yang diperlukan berupa :
Ptr1=var_x;
Supaya ptr2
menunjuk ke ptr1,
diperlukan perintah berupa :
Ptr2 = &ptr1;
Contoh program yang memberikan gambaran pengaksesan
nilai pada var_x melalui pointer ptr1 dan ptr2
adalah berikut :
Input :
Output :
a. Pointer Sebagai Argumen Fungsi
Input :
Output :
Dengan menuliskan & didepan argumen
pada pendefinisian fungsi (dan juga tentu saja pada prototype fungsi), nilai argument dapat diubah didalam fungsi. Hal
serupa dapat diimpelementasikan dengan pointer.
Input :
Output :
Hasil eksekusi dari program diatas sama
seperti pada program sebelumnya.
Perbedaanya adalah :
·
Fungsi ubah_nilai() didefinisikan
dengan judul fungsi berupa : void ubah_nilai (int *x)
·
Pada saat fungsi dipanggil ,argumen
perlu ditulis dengan awalan &
(perhatikan : &pinokio);
·
Prototype
fungsi disesuaikan dengan definisi fungsi : void
ubah_nilai (int *x);
·
Didalam fungsi ubah_nilai(), tanda *
perlu diberikan didepan nama argument *x = 95;
b.
Pointer Sebagai Keluaran Fungsi
Suatu fungsi dapat dibuat agar
keluarannya berupa pointer. Sebagai
contoh, suatu fungsi menghasilkan nilai
balik berupa pointer yang merujuk ke
string nama bulan.
Input :
Output :
c.
String
Sebagai Argumen
Argument berupa string biasa dinyatakan
dengan pointer (pointer yang menunjuk ke tipe char) dan bukan menggunakan array karakter. Contoh :
Void strkiri(char hasil[], char
st[],int n)
{
Int
I;
For
(i=0; i<n; i++)
Hasil[i]
= st [i];
Hasil[i]
= ‘\0’ ; //karakter null
}
Bagian seperti char hasil[] (argumen string) biasa
dinyatakan dalam bentuk : char *hasil(pointer ke char)
Definisi fungsi berikut seperti diatas dapat ditulis
menjadi :
Void strkiri(char hasil[], char
st[],int n)
{
Int
I;
For
(i=0; i<n; i++)
*(hasil+1)
= *(st +1);
*(hasil+1)
= ‘\0’ ; //karakter null
}
Pointer
konstan berlaku seperti variabel konstan (konstanta bernama). Isinya tidak
dapat diubah. Contoh : char bahasa[] = “C++”; char *const
ptr = bahasa;
Pada contoh diatas, ptr berlaku sebagai
pointer konstan yang menunjuk ke bahasa.
Input :
Output :
·
Isi yang ditunjuk ptr bisa diubah.
Input :
Output :
·
Program untuk menampilkan alamat suatu variabel
Input :
Output :
Sumber :
Saputri, S. (2016). Modul Alpro 2-1. Pointer, 1-32.
Komentar
Posting Komentar