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.
Input
:
#include<iostream>
using
namespace std;
int main()
{
int alif = 5;
float ba = 7.5;
double ta = 17.777;
cout<<" Isi Variabel =
"<<endl;
cout<<" alif = "<<alif<<endl;
cout<<" ba = "<<ba<<endl;
cout<<" ta = "<<ta<<endl;
cout<<endl;
cout<<" Isi Variabel =
"<<endl;
cout<<" alif =
"<<&alif<<endl;
cout<<" ba =
"<<&ba<<endl;
cout<<" ta =
"<<&ta<<endl;
return 0;
}
|
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.
Input :
#include<iostream>
using
namespace std;
int
main()
{
int vint = 55;
int *pint;
pint = &vint;
cout<<"Alamat Vint =
"<<&vint<<endl;
cout<<"pint =
"<<pint<<endl;
return 0;
}
|
Output :
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”.
Input
:
#include<iostream>
using
namespace std;
int
main()
{
int vint = 55;
int *pint;
cout<<"Isi vint semula =
"<<vint<<endl;
pint = &vint;
*pint = 77;
cout<<"Isi Vint sekarang =
"<<vint<<endl;
return 0;
}
|
Output :
6. POINTER VOID
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 :
Input :
#include<iostream>
using
namespace std;
int main()
{
void *ptr;
int vint = 50;
cout<<"Isi vint semula =
"<<vint<<endl;
ptr = &vint;
*(int *) ptr = 77;
cout<<"Isi Vint sekarang =
"<<vint<<endl;
return 0;
}
|
Output :
7. POINTER DAN ARRAY
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 :
#include<iostream>
using
namespace std;
int
main()
{
int tgl_lahir [] = {24,6,1965};
int *ptgl;
ptgl = tgl_lahir;
cout<<"Nilai yang ditunjuk
ptgl = "
<<*ptgl<<endl;
cout<<"Nilai tgl_lahir[0] = "
<<tgl_lahir[0]<<endl;
return 0;}
|
Output :
8. POINTER DAN STRING
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 :
#include<iostream>
using
namespace std;
int main()
{
char tokoh[] = "GatotKaca";
char *ptokoh = "GatotKaca";
cout<<" Tokoh = " <<tokoh<<endl;
cout<<" ptokoh = " <<ptokoh<<endl;
ptokoh++;
cout<<" ptokoh = " <<ptokoh<<endl;
return 0;
}
|
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 :
#include<iostream>
using
namespace std;
int
main()
{
int i;
string namahari[7] =
{
"senin","selasa","Rabu","Kamis",
"Jum'at","Sabtu","Minggu"
};
string *phari[7];
for (i=0; i<7; i++)
phari[i] = &namahari[i];
for (i=0; i<7; i++)
cout<<*phari[i]<<endl;
return 0;
}
|
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 :
#include<iostream>
using
namespace std;
int main()
{
int var_x = 273;
int *ptr1, **ptr2;
cout<<"var_x =
"<<var_x<<endl;
//penugasan alamat
ptr1 = &var_x;
ptr2 = &ptr1;
cout<<"*ptr1 = "<<*ptr1<<endl;
cout<<"**ptr2 =
"<<**ptr2<<endl;
return 0;
}
|
Output :
11. POINTER DAN FUNGSI
a.
Pointer Sebagai
Argumen Fungsi
Input
:
#include<iostream>
using
namespace std;
void
ubah_nilai(int &pinokio);
int
main()
{
int pinokio = 80;
cout<<"Nilai Pinokio
Semula = "
<<pinokio<<endl;
ubah_nilai(pinokio);
cout<<"Nilai Pinokio
sekarang = "
<<pinokio<<endl;
return 0;
}
void
ubah_nilai(int &x)
{
x = 95;
}
|
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.
a.
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.
char
*nama_bulan(int n)
{
static
char bulan[13][17] =
{
"kode
bulan salah",“januari",
"februari","maret","april",
"mei","juni","juli","agustus",
"september","oktober","november",
"desember"};
return
((n<1 || n>12) ?bulan[0] : bulan[n]);
}
|
Pada definisi fungsi diatas, char *nama_bulan(int n) menyatakan
bahwa nilai balik fungsi nama_bulan() berupa pointer yang menunjuk ke data bertipe string yang berakhir dengan null. Pada fungsi nama_bulan(),
mula-mula array bernama bulan
dideklarasikan secara statis(supaya dideklarasikan sekali saja) dan sekaligus
diberi nilai awal. Dibagian akhir fungsi, pernyataan :
return ((n<1 || n>12) ?bulan[0] : bulan[n]);
menyatakan
bahwa nilai balik fungsi berupa pointer
yang menunjuk ke :
·
String”kode
bulan salah”(bulan [0]), jika argument fungsi bernilai kurang dari 1 atau lebih
besar daripada 12;
·
Bulan[n],
kalau n bernilai antara 1 sampai 12.
Input :
#include<iostream>
using
namespace std;
char
*nama_bulan(int n);
int
main()
{
int kode;
cout<<" Bulan (1...12) =
";
cin>>kode;
cout<<" "
<<nama_bulan(kode)
<<endl;
return 0;
}
char
*nama_bulan(int n)
{
static char bulan[13][17] =
{
"kode
bulan salah","januari",
"februari",
"maret","april","mei","juni", "juli","agustus","september","oktober","november","desember"};
return ((n<1 || n>12) ?bulan[0] :
bulan[n]);
}
|
Output :
b.
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 }
12. POINTER KONSTAN
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 :
#include<iostream>
using namespace std;
int main()
{
char bahasa[] =
"C++";
char pemrograman[] =
"Pemrograman C++";
char * ptr = bahasa;
cout<<"ptr
= " <<ptr<<endl;
ptr = pemrograman ;
cout<<"ptr
= "<<ptr<<endl;
return 0;
}
|
Output :
Tidak ada komentar:
Posting Komentar