Anda di halaman 1dari 11

Pointer

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.

Alamat Lokasi Memori


0
1
2 A
3 B
.
. .
. .
. .
. .
. .

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

Gambar 1.2 Letak variabel dalam memori

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

Potongan program berikut ini juga memperlihatkan tentang pemakaian pointer :


int jumlah =100;
int *Pjumlah; //pointer ke integer
Pjumlah = &jumlah; //pointer Pjumlah diisi alamat variabel jumlah;
Jika kita melihat keadaan memori ketika program ini dijalankan maka akan terlihat seperti
gambar 1.4. Variabel ju mlah menempati lokasi memori dengan alamat 400 dan 401. Dimana
data yang mengisi lokasi tersebut adalah 100. Sedangkan pointer P ju mla h menempati lokasi
700. Dan isi dari lokasi tersebut adalah 400 yang menunjukkan alamat dari variabel jumlah.
Alamat Lokasi Memori
. .
. .
. variabel
.
400 jumlah
100
401

Z
Z

701 400 Pjumlah


. .
. .
. .
. .

Gambar 1.4 Penunjukan alamat oleh Pointer

1.3 Mengakses Nilai Yang Ditunjuk Pointer


Kita dapat mengakses dan memanipulasi nilai yang tersimpan dalam variabel yang
ditunjuk oleh pointer. Adapun cara yang bisa kita gunakan adalah dengan memakai operator ’*’
di depan nama pointer. Untuk lebih jelasnya maka perhatikanlah potongan program berikut ini :
int jumlah = 100;
int *Pjumlah ;
Pjumlah = &jumlah;
*Pjumlah = 200; //Memanipulasi isi dari variabel jumlah menjadi 200

Dari potongan program tersebut diatas maka setelah pernyataan :


*Pjumlah = 200;
dieksekusi maka isi data dari variabel ju mlah akan berubah menjadi 200. Contoh program
berikut ini merupakan contoh tentang pengaksesan nilai yang ditunjuk oleh variabel pointer.
include <iostream.h>
void main()
{
int a= 10;
int *Pa;
cout<<” Isi dari variabel a mula-mula = ”<<a;

Pemrograman Komputer
4
Lanjut
Pointer

cout<<endl;
Pa = &a;
*Pa = 100;
cout<<”Isi dari variabel a sekarang = ” <<*Pa;
cout<<endl;
}

Jika program tersebut dieksekusi maka hasilnya adalah :

Isi dari variabel a mula-mula = 10


Isi dari variabel a sekarang = 100
1.4 Array dan Pointer
Array adalah sebuah pointer khusus. Metode penyimpanan data dari array hampir sama
dengan pointer. Nama array adalah pointer ke elemen pertama dari array. Misalkan kita
mempunyai sebuah array :
int nilai[] = {70,50,60,80,90};
elemen dari array nilai ini adalah :
nilai[0]=70;
nilai[1]=50;
nilai[2]=60;
nilai[3]=80;
nilai[4]=90;
Jadi array nilai menyimpan 5 buah nilai. Namun sebenarnya array nilai menyimpan 6 buah nilai.
Seperti telah disebutkan sebelumnya nama array merupakan pointer ke elemen pertama dari
array. Jadi nama array nilai menyimpan alamat elemen pertama dari array nilai tersebut.
Adapun elemen pertama dari array nilai adalah nilai[0]. Jadi nama array nilai menyimpan alamat
nilai[0]. Gambar 1.5 memperlihatkan kondisi memori ketika kita mendefinisikan variabel array
nilai.

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]
. .
. .
. .
. .

Gambar 1.5 Array nilai dalam memori

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;

atau jika memakai notasi pointer :


for (n=0;n<=4;n++)
cout <<”nilai[”<<n<<”] = ” <<*(nilai+n)<<endl;

1.5 Pointer ke karakter


Pointer ke karakater maksudnya adalah bagaimana kita membuat sebuah pointer yang
menunjuk ke alamat variabel lain yang bertipe data k a r a k t e r (char). Seperti kita sudah ketahui
bahwa satu-satunya variabel yang dapat menampung data string (deretan karakter) adalah array
karakter. Pernyataan berikut ini adalah sebuah pernyataan untuk mendeklarasikan sebuah
variabel bertipe karakter yang bernama k a l i m a t .
char kalimat[] = ”I like you”;
Variabel k a l i m a t menunjuk ke alamat elemen yang pertama dimana isinya adalah “I”. Untuk
mengubah isi dari variabel k a l i m a t maka kita dapat melakukannya dengan 2 cara yaitu :
• Dengan memakai fungsi string strcpy();
strcpy(kalimat,”I love you”);

• Dengan mengubah karakter demi karakter;


kalimat[3]=’o’;
kalimat[4]=’v’;
kalimat[5]=’e’; //mengubah ”like” menjadi ”love”
Tapi kita tidak bisa mengubah isi variabel kalimat dengan pernyataan berikut :
kalimat = ”I love you”;
Tampak bahwa untuk mengubah isi dari variabel karakter sangat membosankan. Bayangkan
kalau kalimatnya panjang tentu kode program menjadi sangat panjang kalau kita menggunakan
cara yang kedua. Untuk mengatasi hal itu maka kita bisa membuat sebuah pointer yang
menunjuk ke variabel bertipe karakter seperti berikut :
char *Pkalimat = ”I like you”;
Di sini kita membuat pointer yang bernama P k a l i m a t yang menunjuk ke elemen pertama
yaitu, I. Tapi kalau kita ingin mengubah isi dari variabel pointer P k a l i m a t ini maka caranya
adalah :
Pkalimat = ”I love you”;
Jadi cara yang dipakai untuk mengubah isi dari pointer karakter jauh lebih sederhana
dibandingkan dengan cara dari variabel array karakter. Berikut ini akan diberikan contoh
program tentang pemakaian pointer ke karakter.

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;
}

1.6 Array Pointer


Jika kita memerlukan banyak pointer maka kita dapat mendefinisikan sebuah array
pointer. Pointer berisi alamat dari suatu lokasi memori. Jika kita memiliki sebuah array pointer
berarti kita mempunyai banyak array yang masing-masing elemennya menunjuk ke lokasi lain
dalam memori. Jika kita ingin membuat sebuah array pointer maka caranya adalah :
int *Parray[5];
artinya kita membuat sebuah array pointer yang bernama Parray dengan 5 elemen.Masing-
elemen ini menunjuk ke lokasi lain yang bertipe integer. Untuk lebih jelasnya lihatlah gambar
1.6.
Parray

. .
. .
. .
Parray[0]
Parray[1] Masing-masing elemen
Parray[2] menunjuk ke lokasi lain
Parray[3] dalam memori
Parray[4]
. .
. .
. .
. .

Gambar 1.6 Array pointer Parray 5 elemen

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;
}

1.7 Pointer void


Kita dapat membuat pointer yang dapat menunjuk ke beberapa tipe data. Pointer ini
dapat menunjuk ke sembarang tipe data. Untuk membuat pointer seperti ini maka caranya adalah
dengan menambahkan kata kunci void di depan nama pointer. Adapun format atau sintak untuk
mendeklarasikan pointer ini adalah :
void *namapointer;
contoh :
void *data;

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;
}

Dalam program diatas kita melihat pernyataan :


*(int *)data
*(float *)data

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;

dimanakah letak kesalahan program tersebut?


5.Andaikan kita punya potongan program seperti di bawah ini :
int tgl[]={31,3,1970};
int *ptgl;
ptgl=tgl;
cout<<*ptgl<<endl;
cout<<tgl[0];
apakah keluaran dari program tersebut.
6.Buatlah sebuah variabel array dengan tipe double dengan nama nilai. Selanjutnya tampilkan isi
dari variabel tersebut dengan perintah cout. Tampilan cout yang pertama memakai notasi
subscript dan tampilan yang kedua memakai notasi pointer.
7.Tulislah sebuah program untuk menyimpan judul-judul sinetron TV yang anda sukai dengan
menggunakan array pointer ke karakter (char).Program dapat memasukkan(cin) judul sinetron
dan selanjutnya menampilkannya(cout).
8.Tulislah sebuah program untuk mencatat 15 nilai tes dengan menggunakan array pointer ke
float. Program dapat memasukkan nilai test (dengan perintah cin), mencari nilai tertinggi dan
terendah, serta nilai rata-rata.Kemudian menampilkannya dengan perintah cout.

Pemrograman Komputer
11
Lanjut

Anda mungkin juga menyukai