1
1P OINTER
Pointer biasanya diartikan sebagai penunjuk yaitu penunjuk alamat memori. Pointer
adalah sebuah variabel khusus yang berbeda dengan variabel biasa yang sudah kita kenal selama
ini . Jika variabel biasa maka begitu dia dideklarasikan maka langsung akan menempati sebuah
lokasi dalam memori (RAM) dan variabel ini berfungsi untuk menyimpan data. Sedangkan
variabel pointer ketika dideklarasikan akan menempati sebuah lokasi atau tempat dalam memori
akan tetapi tidak berfungsi untuk menyimpan data namun hanya menyimpan alamat variabel
lain. Pointer hanya menyimpan data alamat variabel lain. Jadi pointer hanya menunjuk alamat
variabel lain. Variabel pointer sering disingkat dengan pointer saja. Pengertian tentang lokasi dan
alamat memori akan dibahas secara rinci dalam sub bab berikut ini.
1.1 Struktur Memori
Untuk memahami konsep tentang pointer maka kita harus memahami tentang struktur
dari memori komputer. Berikut ini akan diuraikan tentang struktur memori komputer. Sebagai
ilustrasi andaikan sebuah komputer memiliki memori yang kapasitas penyimpanannya sebesar 1
Kbyte seperti diperlihatkan dalam gambar 1.1. Dalam gambar terlihat setiap lokasi memori
memiliki sebuah alamat. Dan setiap lokasi memori dapat menyimpan data yang besarnya 1 byte.
Kita mengetahui bahwa 1 Kbyte sama dengan 1024 byte. Sehingga dapat dilihat alamat memori
dimulai dari 0 sampai 1023. Tampak dalam gambar bahwa pada lokasi memori dengan alamat 2
dan 3 sudah berisi data karakter secara berurutan yaitu : A dan B. Sedangkan lokasi yang lain
masih kosong.
1022
1023
Gambar 1.1 Struktur memori (RAM)
Pemrograman Komputer
1
Lanjut
Pointer
Jika kita mendeklarasikan variabel seperti diperlihatkan dalam potongan program berikut ini :
void ma in ()
{
int A = 100;
char B = ’W’;
float C = ’Z’;
}
Maka setelah potongan program ini dieksekusi maka kondisi memori adalah seperti diperlihatkan
dalam gambar 1.2.
Alamat Lokasi Memori
.
. variabel
.
509 100 A
510
511 W B
. .
. .
. .
. .
.
1022 z C
1023
Dalam gambar 1.2 terlihat variabel A menempati alamat 509 dan 510. Variabel A menempati 2
lokasi karena tipe datanya adalah int (integer). Hal ini disebabkan oleh karena tipe data integer
panjangnya 2 byte sehingga memerlukan 2 lokasi memori. Isi data dari lokasi memori 509 dan
510 adalah 100. Sementara itu variabel B menempati alamat 511 dan variabel C berada pada
alamat 1022. Kedua variabel ini bertipe char (character) . Isi dari lokasi memori 511 adalah
W sedangkan isi dari lokasi 1022 adalah z. Dimana tipe data char memiliki panjang 1 byte
sehingga hanya memerlukan 1 lokasi memori. Penempatan variabel dalam memori tidak selalu
berada pada alamat-alamat tersebut tetapi tergantung kondisi memori saat itu. Pengaturan atau
penempatan lokasi variabel-variabel dalam memori diatur oleh sistem operasi.
1.2 Mendefinisikan Variabel Pointer
Kalau kita mendefinisikan variabel biasa dimana tipe datanya berupa integer maka
bentuk programnya adalah :
int A;
Definisi diatas berarti kita membuat variabel yang bernama A dengan tipe datanya adalah
integer. Untuk mendefinisikan variabel pointer maka kita harus menambahkan simbul tambahan
berupa tanda ’*’ sebelum nama variabel :
Pemrograman Komputer
2
Lanjut
Pointer
int *A;
tanda ’*’ disebut sebagai operator dereferensi. Jika kita tidak menyertakan tanda ’*’ maka
kompiler akan menganggap variabel A sebagai variabel biasa yang bertipe integer.
Seperti sudah dijelaskan sebelumnya bahwa variabel pointer adalah variabel yang
menunjuk alamat variabel lain. Saat pointer dideklarasikan maka kita harus menentukan tipe data
yang akan ditunjuk oleh pointer tersebut. Seperti contoh deklarasi sebelumnya bahwa pointer A
adalah pointer ke data integer. Berikut adalah contoh pointer ke data pecahan (floating point) :
float *B;
Anda dapat membuat variabel pointer untuk semua tipe data yang ada. Kita dapat memberikan
variabel pointer dengan nama apa saja sama seperti variabel biasa.
Setelah kita mendefinisikan variabel pointer maka selanjutnya kita harus
menginisialisasi variabel tersebut dengan nilai. Perlu diingat bahwa nilai yang disimpan oleh
variabel pointer adalah alamat variabel lain. Jadi pointer tidak menampung data. Data yang
ditampung oleh pointer hanyalah berupa alamat. Untuk menyimpan alamat variabel lain kita
memerlukan sebuah operator alamat yaitu : &. Operator ini berfungsi untuk mengembalikan
alamat suatu variabel. Untuk lebih jelasnya lihatlah potongan program berikut ini :
int a;
float b;
int *Pa; //deklarasi pointer ke integer
float *Pb; //deklarasi pointer ke floating point
Pa = &a; //pointer Pa diisi alamat variabel a.
Pb = &b; //pointer Pb diisi alamat variabel b;
Dari potongan program tersebut pertama terlihat bahwa kita mendeklarasikan 2 buah variabel
biasa (bukan pointer) yaitu : a dan b. Disamping itu kita juga mendeklarasikan 2 buah variabel
pointer yaitu Pa dan Pb. Setelah itu pointer Pa diisi dengan alamat variabel a. Demikian juga
pointer Pb diisi dengan alamat variabel b. Gambaran kondisi memori saat potongan program
tersebut dieksekusi diperlihatkan dalam gambar 1.3 berikut ini.
Alamat Lokasi Memori
.
.
. .
. . variabel
509 a
510
511 b
512 Z
513 Z
514
801 509 Pa
802 511 Pb
. .
. .
. .
Gambar 1.3 Penunjukan alamat oleh Pointer
Pemrograman Komputer
3
Lanjut
Pointer
Z
Z
Pemrograman Komputer
4
Lanjut
Pointer
cout<<endl;
Pa = &a;
*Pa = 100;
cout<<”Isi dari variabel a sekarang = ” <<*Pa;
cout<<endl;
}
Alamat Memori
variabel
100 400
nilai
. .
. .
. .
400 70 nilai[0]
402 50 nilai[1]
404 60 nilai[2]
406 80 nilai[3]
408 90 nilai[4]
. .
. .
. .
. .
Pemrograman Komputer
5
Lanjut
Pointer
Dalam gambar 1.5 dapat dilihat array nilai menempati alamat 100 dan isi dari lokasi memori
tersebut adalah 400. Dimana hal ini berarti menunjuk pada alamat dari lokasi memori elemen
pertama array nilai yaitu nilai[0] . Pernyataan berikut ini adalah untuk menampilkan elemen
pertama dari array nilai :
cout <<”elemen pertama adalah : ”<<nilai[0];
cout <<”elemen pertama adalah : ”<<*nilai;
Dan jika kita ingin mengubah isi dari elemen pertama array maka kita dapat melakukan dengan
pernyataan :
nilai[0] = 75;
atau bisa juga dengan pernyataan :
*nilai = 75;
Perlu diingat bahwa kita tidak dapat mengubah nilai yang ditunjuk oleh nama array. Nilai yang
ditunjuk oleh nama array bersifat konstan. Nilai ini selalu berisi alamat elemen pertama dari
array tersebut. Untuk lebih jelasnya perhatikan potongan program berikut ini :
int i = 5;
int j = 10;
int *P= &i;
int Q[]; //array
Pernyataan berikut ini adalah benar :
P = &j;
Sedangkan pernyataan di bawah ini salah :
Q = &j;
Array Q harus selalu menunjuk ke alamat elemen pertamanya dan tidak boleh menunjuk ke
alamat yang lain. Singkatnya nama array tidak boleh diubah sehingga nama array tidak boleh
muncul sebelah kiri tanda sama dengan.
Untuk mengakses elemen-elemen array kita bisa menggunakan notasi array seperti
yang sudah biasa kita pakai seperti diperlihatkan oleh potongan program berikut ini :
cout <<”nilai[0] = ” <<nilai[0];
cout <<”nilai[1] = ” <<nilai[1];
cout <<”nilai[2] = ” <<nilai[2];
cout <<”nilai[3] = ” <<nilai[3];
cout <<”nilai[4] = ” <<nilai[4];
Disamping menggunakan cara tersebut untuk mengakses elemen array maka kita juga bisa
menggunakan notasi pointer seperti potongan program di bawah ini :
cout <<”nilai[0] = ” <<*(nilai+0);
cout <<”nilai[1] = ” <<*(nilai+1);
cout <<”nilai[2] = ” <<*(nilai+2);
cout <<”nilai[3] = ” <<*(nilai+3);
cout <<”nilai[4] = ” <<*(nilai+4);
Pemrograman Komputer
6
Lanjut
Pointer
Agar kode program lebih efisien maka kita bisa memakai pernyataan pengulangan (looping)
yaitu seperti : for .
for (n=0;n<=4;n++)
cout <<”nilai[”<<n<<”] = ” <<nilai[n]<<endl;
Pemrograman Komputer
7
Lanjut
Pointer
#include <iostream.h>
#include<string.h>
void main()
{
char *Pkal0; //menunjuk ke sembarang lokasi memori dan panjang sembarang
char *Pkal1=”abcd”; //menunjuk ke alamat elemen pertama, “a” sepanjang 5 byte
char *Pkal2=”Programming”; //menunjuk ke alamat elemen pertama, ”P” sepanjang 12 byte
Pkal0=”Belajar variabel pointer”;
cout<<Pkal0;
Pkal0=”Selamat belajar variabel pointer”;
cout <<Pkal0;
cout<<”Masukkan kalimat 1 (Maksimum 5 karakter) : ”;
cin.get(Pkal1,5);
cout<<”Kalimat 1 adalah : ”<<Pkal1;
cout<<”Masukkan kalimat 2 (Maksimum 12 Karakter) : ”;
cin.get(Pkal2,12);
cout<<”Kalimat 2 adalah : ”<<Pkal2;
}
. .
. .
. .
Parray[0]
Parray[1] Masing-masing elemen
Parray[2] menunjuk ke lokasi lain
Parray[3] dalam memori
Parray[4]
. .
. .
. .
. .
Dalam gambar 1.6 tampak bahwa sebuah array pointer Parray memiliki 5 buah elemen yang
masing-masing elemen adalah pointer ke integer. Setiap elemen menunjuk ke lokasi lain dalam
Pemrograman Komputer
8
Lanjut
Pointer
memori. Sebagai perbandingan jika kita tidak menggunakan array maka untuk membuat 5 buah
pointer maka kita akan membuat pernyataan yaitu :
int *Parray0, *Parray1, *Parray2, *Parray3, *Parray4;
Jadi dapat dilihat bahwa array pointer jauh lebih efisien dibandingkan dengan membuat 5 buah
pointer secara terpisah. Berikut ini adalah contoh sebuah array pointer yang elemen-elemennya
menunjuk ke alamat yang bertipe karakter.
char *kota[5];
berarti kita membuat sebuah array pointer yang bernama kota yang memiliki 5 elemen. Dimana
masing-masing elemen menunjuk ke data karakter. Dan jika kita ingin menginisialisasi array ini
maka :
char *kota[5] = {”Bandung”, ”Jakarta”, ”Jogya”, ”Solo”,”Denpasar”};
Program di bawah ini merupakan sebuah contoh tentang penyimpanan dan penampilan data
dalam sebuah variabel array pointer.
#include <iostream.h>
void main()
{
int i;
char *kota[5] = {”Bandung”, ”Jakarta”, ”Jogya”, ”Solo”,”Denpasar”};
cout <<”Nama-nama kota : ”;
for (i=0;i<=4;i++)
{
cout<<kota[i]<<endl;
}
kota[0] = ”Medan”;
kota[1] = ”Makasar”;
kota[2] = ”Surabaya”;
kota[3] = ”Larantuka”;
kota[4] = ”Menado”;
cout <<”Nama – nama kota sekarang : ”<<endl;
for (i=0;i<=4;i++)
{
cout<<*(kota+i)<<endl;
}
Pemrograman Komputer
9
Lanjut
Pointer
Dengan pointer void maka kita dapat mengatur agar pointer ini bisa menunjuk ke tipe data int,
dan di saat yang lain dapat menunjuk tipe data float, double,atau yang lainnya.
Program berikut ini merupakan contoh pemakaian pointer void.
#include <iostream.h>
void main()
{
void *data;
int bulat = 100;
float pecah = 55.5;
data = &bulat;
cout <<”nilai yang ditunjuk oleh pointer data : ”<<*(int*)data<<endl;
data = &pecah;
cout <<”nilai yang ditunjuk oleh pointer data : ”<< *(float*)data <<endl;
}
Pernyataan ini dimaksudkan untuk menyebutkan tipe data yang akan ditunjuk oleh pointer void
apakah dia akan menunjuk int atau float. Jadi kita harus menyebutkan tipe data yang akan
ditunjuk oleh pointer tersebut. Penunjukan tipe seperti ini disebut dengan istilah type cast.
Disamping kita bisa mengambil nilai yang ditunjuk oleh pointer void maka sebaliknya kita juga
bisa mengubahnya. Hal ini akan diperlihatkan dalam contoh program berikut ini :
#include <iostream.h>
void main()
{
void *data;
int bulat = 100;
data = &bulat;
cout <<”nilai variabel bulat adalah : ”<<bulat<<endl;
*(int*)data = 50;
cout <<”nilai variabel bulat sekarang adalah: ”<< bulat <<endl;
}
Latihan :
1.Andaikan iary adalah array integer dan iptr adalah pointer integer yang menunjuk ke awal
array maka yang manakah dari berikut ini yang ekivalen:
a.iary dan iptr
b.iary[3] dan iptr+3
c.iary[2] dan *iptr+2
d.*iary dan iptr[0]
e.iary[5] dan (iptr+4)[1]
2.Jika kita mempunyai variabel array bertipe float dan pointer ke float seperti di bawah ini :
float fara[]={1.1,2.2,3.3,4.4,5.5}
Pemrograman Komputer
10
Lanjut
Pointer
float *fptr1,*fptr2;
yang manakah dari pernyataan berikut yang diperbolehkan :
a.fptr1 = fara;
b.fptr2 =fptr1=&fara[2];
c.fara=19.45;
d.*(fptr2+2)=19.45;
3.Apakah isi variabel i setelah potongan program berikut ini dijalankan?
int i = 10;
int *pi = &i;
*pi = 100;
4.Diberikan potongan program seperti di bawah ini :
int i;
long int j;
int *pi1;
int *pi2;
pi1=&j;
pi2=&i;
Pemrograman Komputer
11
Lanjut