Pe
n dipelaj ar
ngaplikasian
agai cont oh
ebuah var
an dit unj uk
KTAT MATA
Pointe
oint er adala
an suat u n
angkan. Sa
endukung
g harus dipe
m enggunaka
erasi m enj a
nggunakan
am program
ointer
et ahui, sat
at m em ori
ak perlu m e
rena com p
iabelnya ke
program dim
ada sebua
iabel var po
k oleh point
A KULIAH P
BAB X
POINTE
er
ah sebuah v
nilai. Seben
alah sat u k
sepenuhn
erhat ikan d
an point er
et ika progra
m aksudkan
ah variabel
oint yang
m ak a gam
PEMROGRA
XI
ER
variabel y a
narnya k on
elebihan ba
nya unt uk
dalam m em
dengan c
rusak) . Ole
dari yang p
dalam m e
uah v ariab
n alam at m
a ot om at is
am dij alank
n unt uk m e
bernam a p
akan bert i
m barannya a
AMAN I
ng m enyim
nsep dari p
ahasa C/ C+
k pem anip
m pelaj ari po
ara y ang
eh sebab it
paling dasa
em ori akan
el akan dis
m em ori yang
akan m e
k an.
nunj uk sua
point yang
gai berikut :
Me
erat or alam
iabel bert ip
uk lebih j el
t lah progra
1
an variabel
t Suatu
bagai cont o
m at ny a ada
m.
gunakan
h suat u
15 16 17 18 19 20
printf("Alamat variabel x : 0x%p\n\n",&x); printf("Isi variabel y : %f\n",y);
printf("Alamat variabel y : 0x%p\n\n",&y); system("PAUSE");
return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/*
Program 11.1
Nama File : Lat-11.1.cpp
Programmer : Adam Mukharil Bachtiar, S.Kom. */
#include <cstdlib> #include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
int x=5;
float y=10.5;
cout<<"Isi variabel x : "<<x<<endl;
cout<<"Alamat variabel x : "<<&x<<endl<<endl; cout<<"Isi variabel y : "<<y<<endl;
cout<<"Alamat variabel y : "<<&y<<endl<<endl; system("PAUSE");
return EXIT_SUCCESS; }
Hasil eksekusi:
Mendeklarasikan Variabel Pointer
Sebenarny a variabel point er t idak t erlalu j auh berbeda dengan variabel pada
um um nya. Per bedaannya hanya t erlet ak dari apa yang disim pannya. Bent uk um um
pendeklarasian v ariabel point er adalah sebagai berikut :
t ipe _ da t a * n a m a _ va r ia be l; a t a u
t ipe _ da t a * n a m a _ v a r ia be l;
Bent uk um um di at as m enggam barkan bahwa point er yang dideklarasikan
akan dit em pat i oleh dat a dengan t ipe y ang disebut kan ket ik a pendeklarasian.
Sebagai cont oh unt uk m endeklarasikan variabel point er y ang akan m enam pung
m enunj uk t ipe dat a int eger digunakan perint ah sebagai berikut :
in t * n a m a _ va r ia be l;
Cat at an Tipe dat a pada pendeklarasian variabel point er harus sam a dengan
t ipe dat a variabel y ang dit unj uk. Pem berian nam a variabel point er
disarankan m enggunakan awalan p unt uk m em perm udah
m em bedakan ant ara variabel point er dengan variabel biasa.
Penugasan Variabel Pointer
Set elah didek larasik an, v ariabel point er harus dit ugask an unt uk m enunj uk
variabel. Hal ini dilakukan supaya variabel point er dapat m enunj uk variabel lain yang
bersangk ut an. Bent uk um um penugasan v ariabel point er adalah sebagai berikut :
va r ia be l_ point e r = & v a r ia be l_ ya n g_ dit u n j u k ;
Pernyat aan di at as berart i var iabel point er diisi dengan alam at dar i variabel
yang dit unj uk. Unt uk dapat m engakses alam at dari variabel yang dit unj uk point er
t inggal m enyebut kan nam a variabel point erny a saj a sedangkan unt uk m engakses
nilai dari variabel yang dit unj uk oleh point er harus m enyebut kan nam a variabel
1
Programmer : Adam Mukharil Bachtiar, S.Kom. */
#include <stdio.h> #include <stdlib.h>
int main(int argc, char *argv[]) {
int v; int *pv;
printf("Masukkan nilai v : ");scanf("%i",&v); printf("\n");
//penugasan pointer pv=&v;
printf("Hasil tanpa pointer:\n"); printf("Nilai v : %i\n",v);
printf("Alamat v : 0x%p\n\n",&v); printf("Hasil tanpa pointer:\n"); printf("Nilai v : %i\n",*pv); printf("Alamat v : 0x%p\n\n",pv); system("PAUSE");
Programmer : Adam Mukharil Bachtiar, S.Kom. */
#include <cstdlib> #include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
int v; int *pv;
cout<<"Masukkan nilai v : ";cin>>v; cout<<endl;
//penugasan pointer pv=&v;
21 22 23 24 25 26 27 28
cout<<"Nilai v : "<<v<<endl;
cout<<"Alamat v : "<<&v<<endl<<endl; cout<<"Hasil tanpa pointer:"<<endl; cout<<"Nilai v : "<<*pv<<endl;
cout<<"Alamat v : "<<pv<<endl<<endl; system("PAUSE");
return EXIT_SUCCESS; }
Hasil eksekusi:
Gam bar 11.3 Hasil eksekusi program Lat 11.2
Cat at an Hasil eksekusi m engunakan bahasa C akan berbeda dengan hasil
eksekusi m enggunakan bahasa C+ + . Perbedaan t erlet ak di dalam
m enam pilkan alam at m em ori. Bahasa C akan m enyebut kan alam at
m em ori dengan dua nol di depan alam at m em ori ( cont oh: 0022ff44)
sedangkan C+ + t idak ( cont oh: 22ff44) .
Pointer Tidak Bertipe (Pointer Void)
Pada sub bab sebelum nya t elah disebut kan bahw a unt uk m endeklarasikan
variabel point er dibut uhk an t ipe dat a yang sam a dengan t ipe dat a variabel yang
akan dit unj uk. Akan t et api di dalam bahasa C/ C+ + bisa m endeklarasikan var iabel
ini dilakukan agar sat u point er dapat m enunj uk variabel yang berbeda t ipe dat a.
Bent uk um um pendeklarasian point er t ak bert ipe adalah sebagai berikut : :
void * n a m a _ poin t e r ;
Tet api t et ap dalam pem anggilan alam at dan pem anggilan nilainya, variabel point er
harus disert ai dengan t ipe dat any a. Bent uk um um pem anggilan point er t ak bert ipe
adalah sebagai berikut :
/ / pe m a n ggila n a la m a t ( t ipe _ da t a * ) na m a _ poin t e r ; / / pe m a n ggila n n ila i
* ( t ipe _ da t a * ) n a m a _ poin t e r ;
Unt uk lebih j elasny a buat lah program berik ut ini:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
/*
Program 11.3
Nama File : Lat-11.3.c
Programmer : Adam Mukharil Bachtiar, S.Kom. */
#include <stdio.h> #include <stdlib.h>
int main(int argc, char *argv[]) {
void *p; int x; float y;
printf("Masukkan nilai x : ");scanf("%i",&x); printf("Masukkan nilai y : ");scanf("%f",&y); p=&x;
printf("\n");
printf("Nilai x = %i\n",*(int *)p); printf("Alamat x = 0x%p\n\n",(int *)p); p=&y;
printf("Nilai y = %f\n",*(float *)p); printf("Alamat y = 0x%p\n\n",(float *)p); system("PAUSE");
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
26 27 28
/*
Program 11.3
Nama File : Lat-11.3.cpp
Programmer : Adam Mukharil Bachtiar, S.Kom. */
#include <cstdlib> #include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
void *p; int x; float y;
cout<<"Masukkan nilai x : ";cin>>x; cout<<"Masukkan nilai y : ";cin>>y; p=&x;
cout<<endl;
cout<<"Nilai x = "<<*(int *)p<<endl;
cout<<"Alamat x = "<<(int *)p<<endl<<endl; p=&y;
cout<<"Nilai y = "<<*(float *)p<<endl; cout<<"Alamat y = "<<(float *)p
<<endl<<endl; system("PAUSE"); return EXIT_SUCCESS; }
Hasil eksekusi:
Pointer dan Array
Point er dan array m em iliki hubungan yang dekat . Secara int ernal array pun
m enyat akan alam at . Sebagai cont oh didefinisikan sebuah array yang m enyim pan
lim a bilangan bulat sebagai ber ikut :
in t bil_ bu la t [ ] = { 0 ,1 ,2 ,3 ,4 } ;
Dan sebuah point er yang ak an m enunj uk array t ersebut sebagai berikut :
in t * pbil_ bu la t ;
Maka penugasan point er t erhadap v ariabel arrayny a adalah sebagai berikut :
pbil_ bu la t = bil_ bu la t ; a t a u
pbil_ bu la t = & bil_ bu la t [ in de k s] ;
Terlihat dalam penugasan point er di at as t erdapat pernyat aan yang t idak
m enggunakan t anda &. Hal ini disebabkan karena nam a array sebenarnya sudah m enunj uk suat u alam at sehingga t anda & t idak lagi dibut uhk an. Unt uk lebih j elasnya buat lah program berikut ini:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
19 /*
Program 11.4
Nama File : Lat-11.4.c
Programmer : Adam Mukharil Bachtiar, S.Kom. */
#include <stdio.h> #include <stdlib.h>
int main(int argc, char *argv[]) {
int bil_bulat[]={0,1,2,3,4}; int *pbil,i;
//penugasan array pbil=bil_bulat; for(i=0;i<5;i++) {
printf("Nilai yang ditunjuk [%i] : %i\n", i+1,*pbil);
20 21 22 23 24
pbil++; }
system("PAUSE"); return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
21
22 23 24 25 26
/*
Program 11.4
Nama File : Lat-11.4.cpp
Programmer : Adam Mukharil Bachtiar, S.Kom. */
#include <cstdlib> #include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
int bil_bulat[]={0,1,2,3,4}; int *pbil,i;
//penugasan array pbil=bil_bulat; for(i=0;i<5;i++) {
cout<<"Nilai yang ditunjuk ["<<i+1<<"] : "<<*pbil <<endl;
cout<<"Alamat yang ditunjuk ["<<i+1<<"] : "<<pbil <<endl<<endl;
pbil++; }
Hasil eksekusi:
Gam bar 11.5 Hasil eksekusi program Lat 11.4
Di dalam program ini ada pernyat aan pbil+ +. Pernyat aan ini digunakan agar point er array t ersebut bergerak unt uk m enunj uk dat a berikut nya di dalam array.
Sebenarnya ada cara lain unt uk m engak ses seluruh isi seluruh elem en array.
Carany a adalah sebagai berikut :
/ / pe nga k se sa n nila i a r r a y
for ( v a r = 0 ;va r < m a k s_ a r r a y;va r + + ) {
/ / pe r in t a h out pu t diik ut i * ( n a m a _ a r r a y+ va r ) ; }
/ / pe nga k se sa n a la m a t
for ( v a r = 0 ;va r < m a k s_ a r r a y;va r + + ) {
Unt uk lebih j elasny a buat lah program berik ut :
Programmer : Adam Mukharil Bachtiar, S.Kom. */
#include <stdio.h> #include <stdlib.h>
int main(int argc, char *argv[]) {
int bil_bulat[]={0,1,2,3,4}; int *pbil,i;
//penugasan array pbil=bil_bulat; for(i=0;i<5;i++) {
printf("Nilai yang ditunjuk [%i] : %i\n",i+1, *(pbil+i));
printf("Alamat yang ditunjuk [%i] : 0x%p\n\n",i+1, (pbil+i));
Programmer : Adam Mukharil Bachtiar, S.Kom. */
#include <cstdlib> #include <iostream>
using namespace std;
20
21
22 23 24 25
cout<<"Nilai yang ditunjuk ["<<i+1<<"] : " <<*(pbil+i)<<endl;
cout<<"Alamat yang ditunjuk ["<<i+1<<"] : " <<(pbil+i)<<endl<<endl;
}
system("PAUSE"); return EXIT_SUCCESS; }
Hasil eksekusi:
Gam bar 11.6 Hasil eksekusi program Lat 11.5
Pointer dan String
Point er bisa digunakan unt uk m enunj uk variabel bert ipe st ring. Unt uk
m enggam bark an hubungan point er dengan st ring buat lah program berikut ini:
1 2 3 4 5 6 7 8 9 10 11
/*
Program 11.6
Nama File : Lat-11.6.c
Programmer : Adam Mukharil Bachtiar, S.Kom. */
#include <stdio.h> #include <stdlib.h>
12 13 14 15 16 17
char *pstring="UNIKOM";
printf("Nilai string = %s\n",pstring);
printf("Alamat string = 0x%p\n\n",&pstring); system("PAUSE");
return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/*
Program 11.6
Nama File : Lat-11.6.cpp
Programmer : Adam Mukharil Bachtiar, S.Kom. */
#include <cstdlib> #include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
char *pstring="UNIKOM";
cout<<"Nilai string = "<<pstring<<endl;
cout<<"Alamat string = "<<&pstring<<endl<<endl; system("PAUSE");
return EXIT_SUCCESS; }
Hasil eksekusi:
Pointer Menunjuk Pointer
Selain unt uk m enunj uk variabel biasa, point er j uga bisa digunakan unt uk
m enunj uk variabel point er yang lain. Mungkin unt uk beberapa program m er pem ula,
kasus ini m em bingungkan. Tet api apabila sudah m em pelaj ari st rukt ur dat a ( bab
linked list ) m ak a sub bab ini m enj adi ber guna. Bent uk um um point er m enunj uk
point er adalah sebagai berikut :
/ / pe n de k la r a sia n
t ipe _ da t a na m a _ va r ia be l;
t ipe _ da t a * poin t e r 1 ;/ / m e n u n j uk k e va r ia be l t ipe _ da t a * * poin t e r 2 ;/ / m e n u nj u k k e poin t e r / / pe n u ga sa n
point e r 1 = & n a m a _ v a r ia be l; point e r 2 = & poin t e r 1 ;
/ / pe m a n ggila n n ila i
pe r int a h ou t put diik u t i * * poin t e r 2 / / pe m a n gila n a la m a t
pe r int a h ou t put diik u t i * point e r 2
Unt uk lebih j elasny a buat lah program berik ut :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/*
Program 11.7
Nama File : Lat-11.7.c
Programmer : Adam Mukharil Bachtiar, S.Kom. */
#include <stdio.h> #include <stdlib.h>
int main(int argc, char *argv[]) {
17
printf("Hasil menggunakan 1 pointer\n"); printf("Nilai x = %i\n",*px1);
printf("Alamat x = %p\n",px1); printf("Alamat px1 = %p\n\n",&px1);
printf("Hasil menggunakan pointer ke pointer\n"); printf("Nilai x = %i\n",**px2);
printf("Alamat x = %p\n",*px2); printf("Alamat px1 = %p\n\n",px2); system("PAUSE");
Programmer : Adam Mukharil Bachtiar, S.Kom. */
#include <cstdlib> #include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
cout<<"Hasil menggunakan 1 pointer"<<endl; cout<<"Nilai x = "<<*px1<<endl;
cout<<"Alamat x = "<<px1<<endl;
cout<<"Alamat px1 = "<<&px1<<endl<<endl;
cout<<"Hasil menggunakan pointer ke pointer"<<endl; cout<<"Nilai x = "<<**px2<<endl;
cout<<"Alamat x = "<<*px2<<endl;
cout<<"Alamat px1 = "<<px2<<endl<<endl; system("PAUSE");
Hasil eksekusi:
Gam bar 11.8 Hasil eksekusi program Lat 11.7
Manajemen Memori Dinamis
Salah sat u pengaplikasian point er adalah unt uk m anaj em en m em ori dinam is.
Maksudny a seorang program m er bisa m em esan m em ori unt uk variabelnya ket ika
program sedang dij alankan. Ada dua pasang perint ah yang bisa digunakan yait u:
1. Malloc dan free
2. New dan delet e.
Malloc dan Free
Malloc adalah per int ah unt uk m engalokasikan m em ori k et ika program sedang
berj alan sedangkan free adalah perint ah unt uk m endealok asikan m em ori ket ika
program sedang berj alan. Bent uk um um dari m alloc dan free adalah sebagai berikut :
/ / m a lloc
poin t e r = ( t ipe _ da t a * ) m a lloc( siz e of( t ipe _ da t a ) * j u m la h _ da t a ; / / fr e e
Unt uk lebih j elasny a buat lah program berik ut ini:
Programmer : Adam Mukharil Bachtiar, S.Kom. */
#include <stdio.h> #include <stdlib.h>
int main(int argc, char *argv[]) {
int *bil;
int i,jumlah_bil;
printf("Masukkan jumlah data : "); scanf("%i",&jumlah_bil);
//penugasan pointer dan alokasi memori bil=(int *)malloc(sizeof(int)*jumlah_bil);
//input data printf("\n");
for(i=0;i<jumlah_bil;i++) {
printf("Bilangan ke-%i : ",i+1);scanf("%i",(bil+i)); }
//output data printf("\n");
for(i=0;i<jumlah_bil;i++) {
printf("Bilangan ke-%i = %i\n",i+1,*(bil+i)); }
printf("\n\n");
//dealokasi memori free(bil);
system("PAUSE"); return 0;
1
Programmer : Adam Mukharil Bachtiar, S.Kom. */
#include <cstdlib> #include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
int *bil;
int i,jumlah_bil;
cout<<"Masukkan jumlah data : ";cin>>jumlah_bil;
//penugasan pointer dan alokasi memori bil=(int *)malloc(sizeof(int)*jumlah_bil);
//input data cout<<endl;
for(i=0;i<jumlah_bil;i++) {
cout<<"Bilangan ke-"<<i+1<<" : ";cin>>*(bil+i); }
//output data cout<<endl;
for(i=0;i<jumlah_bil;i++) {
cout<<"Bilangan ke-"<<i+1<<" = "<<*(bil+i)<<endl; }
Hasil eksekusi:
Gam bar 11.9 Hasil eksekusi program Lat 11.8
Cat at an Ada sat u perbedaan di dalam bahasa c dan c+ + yait u t erlet ak di
perint ah input dat a dinam is. Di dalam bahasa c+ + perint ah cin> >
harus diikut i dengan * nam a_point er sedangkan dalam bahasa c
t idak perlu.
New dan Delete
Sam a seper t i m alloc dan fr ee, new digunakan unt uk m engalokasikan m em ori
sedangk an delet e unt uk dealokasi m em ori. Tet api perint ah ini punya sat u kelem ahan
yait u harus m enyert akan file header cst dlib yang hanya ada di bahasa C+ +. Bent uk um um new dan delet e adalah sebagai berikut : :
/ / n e w
poin t e r = n e w t ipe _ da t a _ poin t e r ;/ / sa t u m e m or i a t a u
poin t e r = n e w t ipe _ da t a _ poin t e r [ j u m la h_ da t a ] ; / / de le t e
Unt uk lebih j elasny a buat lah program berik ut ini:
Programmer : Adam Mukharil Bachtiar, S.Kom. */
#include <cstdlib> #include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
int *bil;
int i,jumlah_bil;
cout<<"Masukkan jumlah data : ";cin>>jumlah_bil;
for(i=0;i<jumlah_bil;i++) {
cout<<"Bilangan ke-"<<i+1<<" : ";cin>>*(bil+i); }
//output data cout<<endl;
for(i=0;i<jumlah_bil;i++) {
Hasil eksekusi: