Anda di halaman 1dari 29

SAYA

Selasa, 10 November 2015

POINTER DALAM STRUKTUR DATA


POINTER
Pointer adalah suatu variabel penunjuk yang menunjuk pada suatu alamat memori komputer tertentu.
Pointer merupakan variabel level rendah yang dapat digunakan untuk menunjuk nilai integer,
character, float, double, atau single, dan bahkan tipe-tipe data lain yang didukung oleh bahasa C.
Variabel biasa, sifatnya statis dan sudah pasti, sedangkan pada pointer sifatnya dinamis dan dapat lebih
fleksibel. Variabel pointer yang tidak menunjuk pada nilai apapun berarti memiliki nilai NULL, dan
disebut sebagai dangling pointer karena nilainya tidak diinisialisasi dan tidak dapat diprediksi.
Contoh umum dari pointer adalah start pointer, end pointer, dan stack pointer. Pointer dapat
menjadi absolute (alamat fisik yang sebenarnya atau alamat virtual di memori virtual)
atau relative (sebuah offset dari alamat awal absolute ("dasar") yang biasanya menggunakan bit yang lebih
sedikit dari pada alamat lengkap, tetapi biasanya juga akan membutuhkan satu tambahan operasi
aritmatika untuk menyelesaikannya). Dua byte offset, berisi 16-bit unsigned integer, dapat digunakan
untuk menyediakan pengalamatan relative sampai dengan 64 kilobyte struktur data. Pointer digunakan
dalam mengontrol tabel. Kontrol tabel yang digunakan untuk mengontrol aliran program (program flow),
biasanya membuat ekstensif menggunakan pointer. Pointer biasanya tertanam dalam sebuah entry tabel.
Misalnya, digunakan untuk menyimpan entry point bagi subrutin yang akan dijalankan, dan berdasarkan
kondisi tertentu yang didefinisikan dalam entri tabel yang sama.

Namun pointer hanya dapat berupa indeks untuk memisahkan data yang lain tetapi terikat, tabel terdiri
dari suatu array dari alamat yang aktual atau alamat sendiri (tergantung pada konstruksi bahasa
pemrograman yang tersedia).

Pointer juga dapat digunakan untuk titik (kembali) ke entri tabel sebelumnya (seperti dalam pengolahan
loop) atau maju melewatibeberapa entri tabel (seperti pada switch atau "awal" keluar dari loop).
Pointer juga dapat digunakan untuk mengalokasikan atau DEALLOCATE variabel dinamis dan array dalam
memori. Karena variable akan sering menjadikan memori penuh setelah selasai ngerjakan sebuah perintah,
itu bisa menjadi pemborosan memori bila kita menyimpannya, dan oleh karena itu praktik yang baik untuk
DEALLOCATE itu (menggunakan referensi pointer asli) ketika tidak lagi diperlukan. Kegagalan untuk
melakukannya dapat mengakibatkan kehabisan memori (di mana memori bebas yang tersedia akan secara
bertahap berkurang atau dalam kasus yang parah dengan secara cepat akan penuh).
Menurut Frieyadie. 2007. Edisi Revisi Buku Pemrograman C++ dengan Borland C++ 5.02.
Pointer adalah sebuah variabel yang berisi alamat lain. Suatu pointer dimaksudkan untuk menunjukan ke
suatu alamat memori sehingga alamat dari suatu variabel dapat diketahui dengan mudah.
Contoh Program:
#include <stdio.h> //Mengakses file pada library stdio.h
#include <stdlib.h> //Mengakses file pada library stdlib.h
int main (void){ //Fungsi main yang harus ada dalam sebuah program C
int A = 5, H;
int *ptrA, *ptrH; //Deklarasi pointer sebagai integer
ptrA = &A; //Alamat lokasi memori dari variabel A disimpan pada ptrA
H = *ptrA; //Nilai data yang alamat lokasi memorinya disimpan pada ptrA,
disimpan di variabel H
ptrH = &H; //Alamat lokasi memori dari variabel H disimpan pada ptrH
// %x menampilkan nilai hexa
printf("A=%d\n &A=%x \n ptrA=%x \n *ptrA=%d", A, &A, ptrA, *ptrA);
printf("\n\nH=%d\n &H=%X\n ptrH=%X\n *ptrH=%d\n\n", H, &H, ptrH,*ptrH);
system ("pause"); //File yang terdapat pada stdlib.h
return (0); //Nilai balikan fungsi main() adalah 0
}

Pendeklarasian variabel biasa dan pointer:


//variabel biasa
int nilai1 = 4;
float nilai2 = 3.5;
char nama[10] = “anton”; //array of char (string)

//variabel pointer
int *nilai_p1; //dangling pointer
int *nilai_p2 = &nilai1; //menunjuk ke tipe data int
char *nilai_p3 = nama; //menunjuk ke tipe data array of char
char *nilai_p4 = &nama[0];

Ilustrasi Pointer:

Contoh program untuk dicoba:


#include
#include

int main(){
int nilai1 = 4;
int nilai2 = 5;
float nilai3 = 3.5;
char nama[11] = "abcdefghij";

int *nilai_p1 = &nilai1;


int *nilai_p2 = &nilai2;
char *nilai_p4 = nama;
float *nilai_p3= &nilai3;

printf("nilai 1 = %d, alamat1 = %p, ukuran %d\n",*nilai_p1,&nilai_p1,sizeof(nilai1));


printf("nilai 2 = %d, alamat2 = %p, ukuran %d\n",*nilai_p2,&nilai_p2,sizeof(nilai2));
printf("nilai 3 = %f, alamat3 = %p, ukuran %d\n",*nilai_p3,&nilai_p3,sizeof(nilai3));
printf("nilai 4 = %s, alamat4 = %p, ukuran %d\n",nama,&nilai_p4,sizeof(nama));
getch();
return 0;
}

Operasi pointer:
1. Operasi Pemberian nilai

#include
#include

int main(){
float nilai,*p1,*p2;
nilai = 14.54;
printf("nilai = %2.2f, alamatnya %p\n",nilai,&nilai);
p1 = &nilai;
printf("nilai p1 = %2.2f, p1 menunjuk alamat %p\n",*p1,p1);
//pada awalnya p2 masih dangling pointer
printf("mula-mula nilai p2 = %2.2f, p2 menunjuk alamat %p\n",*p2,p2);
p2 = p1; //operasi pemberian nilai, berarti alamat x2 sama dengan x1
printf("sekarang nilai p2 = %2.2f, p2 menunjuk alamat %p\n",*p2,p2);
getch();
}

Contoh 2:
#include
#include

int main(){
int *p,a=25,b;
//p masih dangling
printf("nilai a = %d di alamat a = %p,\n",a,&a);
printf("nilai p di alamat = %p\n",p);
p = &a;
printf("nilai p = %d di alamat %p\n",*p,p);
//b diisi dengan nilai yang berasal dari nilai
//variabel a yang ditunjuk oleh pointer p
b = *p;
printf("nilai b = %d di alamat %p\n",b,&b);
getch();
}
Contoh 3:
#include
#include

int main(){
int a=25,b=12,t;
int *p,*q;
p = &a;
q = &b;
printf("nilai yang ditunjuk p = %d di alamat %p\n",*p,p);
printf("nilai yang ditunjuk q = %d di alamat %p\n",*q,q);
//Contoh kasus, penukaran nilai 2 variabel dengan pointer
t = *p;
*p = *q;
*q = t;
printf("nilai yang ditunjuk p sekarang = %d di alamat %p\n",*p,p);
printf("nilai yang ditunjuk q sekarang = %d di alamat %p\n",*q,q);
getch();
}
Contoh 4:
#include
#include

int main(){
int a,*p;
p=&a;
*p=25;
printf("nilai a = %d",a);
}
2. Operasi Aritmatika
#include
#include

int main(){
int a,b=10,*p,*q;
p=&a;
*p=25;
printf("nilai a = %d\n",a);
printf("alamat p = %p\n",p);
q=&b;
printf("alamat q = %p\n",q);
printf("nilai a + b = %d\n",(*p+*q));
//posisi alamat p menjadi bergeser, nilai berubah
p=p+1;
printf("nilai p = %d, alamat = %p\n",*p,&p);
q=q-1;
printf("nilai q = %d, alamat = %p\n",*q,&q);
getch();
}

Pointer pada array 1 dimensi:


#include
#include

int main(){
char S[] = "anton";
char *p;
//cara 1
//langsung menunjuk nama array.
p=S;
for(int i=0;i<5;i++){ printf("%c",*p); p++; } printf("\n"); //cara 2 p=&S[0]; for(int i=0;i<5;i++){
printf("%c",*p); p++; } printf("\n"); //Membalik kalimat p--; for(int i=0;i<5;i++){ printf("%c",*p); p--; }
printf("\n"); getch(); } Pointer pada Struct: #include
#include

typedef struct{
int nim;
int umur;
float ipk;
} Mahasiswa;
Mahasiswa m;
Mahasiswa *p = &m;

int main(){
//struct biasa
m.nim=123;
m.ipk=3.2;
m.umur=23;
printf("nim = %d\n",m.nim);
printf("ipk = %f\n",m.ipk);
printf("umur = %d\n",m.umur);

//struct pointer
p->ipk = 3.5;
p->nim = 321;
p->umur = 32;
printf("nim = %d\n",p->nim);
printf("ipk = %f\n",p->ipk);
printf("umur = %d\n",p->umur);

//mengacu pada variabel aslinya


printf("nim = %d\n",m.nim);
printf("ipk = %f\n",m.ipk);
printf("umur = %d\n",m.umur);
getch();
}

DEKLARASI POINTER
Seperti halnya variabel yang lainnya, variabel pointer juga harus dideklarasikan terlebih dahulu
sebelum digunakan.

Bentuk Umum :
Tipe_data *nama_pointer;

//Contoh
int *px;
char *sh;
Contoh Program :

#include “IOSTREAM.h”
#include “conio.h”
void main()
{ int x, y; /* x dan y bertipe int */
int *px; /* px pointer yang menunjuk objek */
clrscr();
x = 87;
px = &x; /* px berisi alamat dari x */
y = *px; /* y berisi nilai yang ditunjuk px */
cout<<“Alamat x =”<<&x <<\n”;
cout<<“Isi px = \n”, px);
cout<<“Isi x = \n”, x);
cout<<“Nilai yang ditunjuk oleh px = \n”, *px);
cout<<“Nilai y = \n”, y);
getch();
}

OPERASI-0perasi POINTER
1. Operasi Penugasan
Suatu variabel pointer seperti halnya variabel yang lain, juga bisa mengalami operasi penugasan. Nilai sari
suatu variabel pointer dapat disalin ke variabel pointer yang lain.

//Contoh
#include "iostream.h"
#include "conio.h"
void main()
{ float *x1,y, *x2;
clrscr();
y = 13.45;
x1 = &y; /* Alamat dari y disalin ke variabel x1 */
x2 = x1; /* Isi variabel x1 disalin ke variabel x2 */
cout<<"Nilai variabel y = "<<y<< " ada di alamat "<< x1<<"\n";
cout<<"Nilai variabel y = "<<y<< " ada di alamat "<< x2<<"\n";
getch();
}

2. Operasi Aritmatika

Suatu variabel pointer hanya dapat dilakukan operasi aritmatika dengan nilai integer saja. Operasi yang
biasa dilakukan adalah operasi penambahan dan pengurangan. Operasi penambahan dengan suatu nilai
menunjukkan lokasi data berikutnya (index
selanjutnya) dalam memori. Begitu juga operasi pengurangan.

//Contoh Operasi aritmatika


#include <iostream.h>
#include <conio.h>
void main()
{ int nilai[3], *penunjuk;
clrscr();
nilai[0] = 125;
nilai[1] = 345;
nilai[2] = 750;
penunjuk = &nilai[0];
cout<<"Nilai "<<*penunjuk <<" ada di alamat memori " <<penunjuk<<"\n";
cout<<"Nilai "<<*(penunjuk+1) <<" ada di alamat memori " <<penunjuk+1<<"\n";
cout<<"Nilai "<<*(penunjuk+2) <<" ada di alamat memori " <<penunjuk+2<<"\n";
getch();
}

3. Operasi Logika
Operasi logika juga dapat dilakukan pada sebuah variabel pointer.

//Contoh
#include<iostream.h>
#include "conio.h"
void main()
{ int a = 100, b = 200, *pa, *pb;
clrscr();
pa = &a;
pb = &b;
cout<<"nilai pa= "<<pa<< " nilai pb= "<<pb<<"\n";
if(pa < pb)
cout<<"pa menunjuk ke memori lebih rendah dari pb\n";
if(pa == pb)
cout<<"pa menunjuk ke memori yang sama dengan pb\n";
if(pa > pb)
cout<<"pa menunjuk ke memori lebih tinggi dari pb\n";
getch();}

OPERATOR POINTER
Ada beberapa operator yang bisa digunakan dalam pointer. Operator tersebut adalah operator
alamat (yang dilambangkan dengan simbol &) dan operator unary yang mengembalikan alamat
dari operandnya.

Sebagai contoh, diasumsikan deklarasi sebagai berikut :


Int y = 5;
Int *yPtr;

Maka pernyataan :
YPtr = &y;
Pernyataan ini mengandung arti bahwa alamat dari variabel y ditujukan kepada variabel pointer
yPtr.

Contoh lain :
Int balance, value;
Int *balptr;
Balance = 3200; // step 1
Balptr=&balance; // step 2
Value=*balptr; // step 3

Contoh diagram :

Step 1 Step 2 Step 3

12 Balptr 12 100 Balptr 12 100 Balptr

100 3200 Balance 100 3200 Balance 100 3200 Balance

130 value 130 value 130 3200 value

Contoh lainya :

//Program:pointer3.cpp
#include <iostream.h>

int main()
{
int *ptr, num; // Step 1
ptr = &num; // Step 2
*ptr = 100; // Step 3
cout << num << " ";
(*ptr)++; // Step 4
cout << num << " ";
(*ptr)*=2; // Step 5
cout << num << "\n";
return 0;
}

Bila program dijalankan :


100 101 202

Contoh diagram :
Step 1 Step Step Step Step
2 3 4 5

12 *int Ptr 12 50 Ptr 12 50 Ptr 12 50 Ptr 12 50 Ptr

50 int num 50 int num 50 100 num 50 101 num 50 202 num

... ... ... ... ...

Pointer Aritmatika
Ada 4 operator aritmatik dapat digunakan pada pointer ++, = =, +, dan -. Asumsi integer 32
Contoh :
Int *p1;
p1++;
p1--;

Contoh lain:

//Program:pointer4.cpp
#include <iostream.h>

int main()
{
int i[10], *i_ptr;
double f[10], *f_ptr;
int x;
i_ptr = i; // i_ptr points to first element of i
f_ptr = f; // f_ptr points to first element of f
for(x=0; x<10; x++)
cout << i_ptr+x << " " << f_ptr+x << "\n";
return 0;
}

Bila program dijalankan :


0xeffffd9c 0xeffffd48
0xeffffda0 0xeffffd50
0xeffffda4 0xeffffd58
0xeffffda8 0xeffffd60
... ...

Pointer Perbandingan
Pointer dapat dibandingkan dengan menggunakan operator hubungan, seperti !=, ==, <, dan >.
Contoh :

//Program:pointer5.cpp
#include <iostream.h>

int main()
{
int num[10];
int *start, *end;
start = num;
end = &num[9];
while(start != end) {
cout << "Masukkan bilangan sebanyak 9 data : ";
cin >> *start;
start++;
}
return 0;
}

Catatan :Data yang akan dimasukkan sebanyak 9 buah data dan program tidak akan berhenti
apabila belum sampai 9 buah data.

POINTER VERSUS ARRAY


Array dan pointer adalah dua struktur data yang saling berkaitan satu dengan yang lain
dalam C, dan dapat saling dipertukarkan penggunaannya. Karena array dapat didefinisikan
sebagai pointer.

Contoh :
int *bPtr, b[5];

Dapat dibuat menjadi :


bPtr = b;
bPtr = &b[0];

Berarti bPtr ditugaskan untuk menunjukkan ke alamat elemen pertama dari array b atau b[0].
Elemen array b[3] dapat ditulis :
* (bPtr + 3)
Alamat &b[3] dapat ditulis :
bPtr +3
Deklarasi suatu variabel array x[] yang berisi nilai int dapat ditulis :
int *x;
Variabel array ganda dapat ditulis :
int y [ ] [ ];
int *y [ ];
int *( *y);
Penggunaan pointer dan array untuk deklarasi variabel array ganda untuk menyimpan empat
buah elemen yang masing-masing bertipe string (array dari karakter).
char *suit [4] = { “Hearts”, “Diamonds”, “Clubs”, “Spades” };

Contoh :
//Program:pointer6.cpp
#include <iostream.h>
#include <stdio.h>

int main()
{
char str[80];
char token[80];
char *str_ptr, *tk_ptr;
cout << "Masukkan sebuah kalimat : ";
gets(str);
str_ptr = str;

while(*str_ptr) {
tk_ptr = token;

while( *str_ptr != ' ' && *str_ptr ) {


*tk_ptr = *str_ptr;
tk_ptr++;
str_ptr++;
}
if(*str_ptr) str_ptr++;
*tk_ptr = '\0';
cout << token << endl;
}
return 0; }

//Program:pointer7.cpp
#include <iostream.h>
#include <stdio.h>

int main()
{
char str[80];
char token[80];
int i, j;
cout << "Masukkan sebuah kalimat: ";
gets(str);

for(i=0; ; i++) {
for(j=0; str[i] != ' ' && str[i]; j++, i++)
token[j] = str[i];
token[j] = '\0';
cout << token << '\n';
if(!str[i]) break;
}
return 0;
}

Pada contoh program pointer 6 adalah program dengan pointer, sedangkan contoh
program pointer 7 dengan menggunakan array. Hasil dari kedua program tersebut sama.

POINTER INDEX
Pointer tidak hanya dapat digunakan untuk mengakses elemen array, tetapi pointer
juga dapat diindex seperti pada array.

Contoh :

//Program:pointer8.cpp
#include <iostream.h>
#include <ctype.h>

int main()
{
char str[20] = "hello tom";
char *p;
int i;
p = str;
for(i=0; p[i]; i++)
p[i] = toupper(p[i]);
cout << p;
return 0;
}

Bila program diatas dijalankan, maka hasilnya adalah sebagai berikut :


HELLO TOM

Proses pengindexan pointer dapat dilihat pada variabel p yang menunjuk pada variabel str yang
berisi data nama dengan panjang 20. Fungsi toupper memperjelas proses pengindexan.

KONSTANTA STRING DAN POINTER

Konstanta string terlihat dalam program teks dan disimpan dalam tabel string serta setiap entry
dalam tabel string, pointer string dibangkitkan.

Contoh :

//Program:pointer9.cpp
#include <iostream.h>
int main()
{
char *s;
s = "Pointers are fun to use.\n";
cout << s;
return 0;
}

Bila program diatas dijalankan, maka hasilnya adalah sebagai berikut :


Pointers are fun to use.

ARRAY POINTER

Pointer dapat diarraykan seperti tipe data yang lain dalam C++. Untuk menyatakan
sebuah array pi dari pointer sebanyak 10 buah data yang bertipe 10 integer, dapat
ditulis :
int *pi [10];
Untuk menentukan alamat dari variabel integer disebut var ke elemen ketiga dari
pointer array, dapat ditulis :
int var;
pi [2] = &var

Contoh :

//Program:point10.cpp
#include <iostream.h>

int main ()
{
int numbers[5];
int *p;
p = numbers; *p = 10;
p++; *p = 20;
p = &numbers[2]; *p = 30;
p = numbers + 3; *p = 40;
p = numbers; *(p+4) = 50;
for (int n=0; n<5; n++)
cout << numbers[n] << ", ";
return 0;
}

Bila program diatas dijalankan, maka hasilnya adalah sebagai berikut :


10, 20, 30, 40, 50,

Pointer Pada Record


contoh:

Deklarasi
Type DataMhs : record < NIM : integer, Nama : String, IPK : Real>
PMhs : Pointer to DataMhs

Maka :
PMhs↑.NIM : menunjuk ke field yang bertipe integer
PMhs↑.Nama : menunjuk ke field yang bertipe string
PMhs↑.IPK : menunjuk ke field yang bertipe real

Deskripsi
Mhs.NIM ← 2011110001
Mhs.Nama ← ‘Dhanny Chandra’
Mhs.IPK ← 3.2
PMhs ← @Mhs
write(Mhs↑.NIM)
write(Mhs↑.Nama)
write(Mhs↑.IPK)

Alokasi Penyimpanan Dinamis


Tipe pointer memungkinkan pengalokasian memori secara dinamis. Artinya ruang memori untuk
elemen yang diacu oleh nama bertipe pointer baru dialokasikan pada saat diminta, dan memori
yang dipakai dapat dikembalikan ke sistem bila tidak diperlukan lagi.
Berikut ini terdapat prosedur dan fungsi yang dianggap sudah tersedia untuk pengalokasian
memori dan dealokasi memori.

procedure AlokMem(output P : Alamat) { prosedur pengalokasian


ruang memori }
procedure DeAlokMem(input P : Alamat) { prosedur mengembalikan
ruang memori ke sistem }

Contoh
Deklarasi
Type DataMhs : record < NIM : integer, Nama : String, IPK : Real>
PMhs : Pointer to DataMhs
PX : Pointer to integer
Deskripsi
{ Contoh Pengalokasi memori untuk PX }
AlokMem(PX)
read(PX↑)
proses(PX↑)
...
DeAlokMem(PX)
{ Contoh Pengalokasi memori untuk PMhs }
AlokMem(PMhs)
PMhs↑.NIM ← 2011110001
PMhs↑.Nama ← ‘Dhanny Chandra’
PMhs↑.IPK ← 3.2
Proses(PMhs↑)
...
DeAlokMem(PMhs

Dalam Delphi Pascal:


1. Prosedur pengalokasian memori = New(pointer)
2. Prosedur pengalokasian memori = Dispose(pointer)

POINTER
Pointer adalah suatu variabel penunjuk yang menunjuk pada suatu alamat memori komputer tertentu.
Pointer merupakan variabel level rendah yang dapat digunakan untuk menunjuk nilai integer,
character, float, double, atau single, dan bahkan tipe-tipe data lain yang didukung oleh bahasa C.
Variabel biasa, sifatnya statis dan sudah pasti, sedangkan pada pointer sifatnya dinamis dan dapat lebih
fleksibel. Variabel pointer yang tidak menunjuk pada nilai apapun berarti memiliki nilai NULL, dan
disebut sebagai dangling pointer karena nilainya tidak diinisialisasi dan tidak dapat diprediksi.
Contoh umum dari pointer adalah start pointer, end pointer, dan stack pointer. Pointer dapat
menjadi absolute (alamat fisik yang sebenarnya atau alamat virtual di memori virtual)
atau relative (sebuah offset dari alamat awal absolute ("dasar") yang biasanya menggunakan bit yang lebih
sedikit dari pada alamat lengkap, tetapi biasanya juga akan membutuhkan satu tambahan operasi
aritmatika untuk menyelesaikannya). Dua byte offset, berisi 16-bit unsigned integer, dapat digunakan
untuk menyediakan pengalamatan relative sampai dengan 64 kilobyte struktur data. Pointer digunakan
dalam mengontrol tabel. Kontrol tabel yang digunakan untuk mengontrol aliran program (program flow),
biasanya membuat ekstensif menggunakan pointer. Pointer biasanya tertanam dalam sebuah entry tabel.
Misalnya, digunakan untuk menyimpan entry point bagi subrutin yang akan dijalankan, dan berdasarkan
kondisi tertentu yang didefinisikan dalam entri tabel yang sama.

Namun pointer hanya dapat berupa indeks untuk memisahkan data yang lain tetapi terikat, tabel terdiri
dari suatu array dari alamat yang aktual atau alamat sendiri (tergantung pada konstruksi bahasa
pemrograman yang tersedia).

Pointer juga dapat digunakan untuk titik (kembali) ke entri tabel sebelumnya (seperti dalam pengolahan
loop) atau maju melewatibeberapa entri tabel (seperti pada switch atau "awal" keluar dari loop).
Pointer juga dapat digunakan untuk mengalokasikan atau DEALLOCATE variabel dinamis dan array dalam
memori. Karena variable akan sering menjadikan memori penuh setelah selasai ngerjakan sebuah perintah,
itu bisa menjadi pemborosan memori bila kita menyimpannya, dan oleh karena itu praktik yang baik untuk
DEALLOCATE itu (menggunakan referensi pointer asli) ketika tidak lagi diperlukan. Kegagalan untuk
melakukannya dapat mengakibatkan kehabisan memori (di mana memori bebas yang tersedia akan secara
bertahap berkurang atau dalam kasus yang parah dengan secara cepat akan penuh).
Menurut Frieyadie. 2007. Edisi Revisi Buku Pemrograman C++ dengan Borland C++ 5.02.
Pointer adalah sebuah variabel yang berisi alamat lain. Suatu pointer dimaksudkan untuk menunjukan ke
suatu alamat memori sehingga alamat dari suatu variabel dapat diketahui dengan mudah.
Contoh Program:
#include <stdio.h> //Mengakses file pada library stdio.h
#include <stdlib.h> //Mengakses file pada library stdlib.h
int main (void){ //Fungsi main yang harus ada dalam sebuah program C
int A = 5, H;
int *ptrA, *ptrH; //Deklarasi pointer sebagai integer
ptrA = &A; //Alamat lokasi memori dari variabel A disimpan pada ptrA
H = *ptrA; //Nilai data yang alamat lokasi memorinya disimpan pada ptrA,
disimpan di variabel H
ptrH = &H; //Alamat lokasi memori dari variabel H disimpan pada ptrH
// %x menampilkan nilai hexa
printf("A=%d\n &A=%x \n ptrA=%x \n *ptrA=%d", A, &A, ptrA, *ptrA);
printf("\n\nH=%d\n &H=%X\n ptrH=%X\n *ptrH=%d\n\n", H, &H, ptrH,*ptrH);
system ("pause"); //File yang terdapat pada stdlib.h
return (0); //Nilai balikan fungsi main() adalah 0
}

Pendeklarasian variabel biasa dan pointer:


//variabel biasa
int nilai1 = 4;
float nilai2 = 3.5;
char nama[10] = “anton”; //array of char (string)

//variabel pointer
int *nilai_p1; //dangling pointer
int *nilai_p2 = &nilai1; //menunjuk ke tipe data int
char *nilai_p3 = nama; //menunjuk ke tipe data array of char
char *nilai_p4 = &nama[0];

Ilustrasi Pointer:

Contoh program untuk dicoba:


#include
#include

int main(){
int nilai1 = 4;
int nilai2 = 5;
float nilai3 = 3.5;
char nama[11] = "abcdefghij";

int *nilai_p1 = &nilai1;


int *nilai_p2 = &nilai2;
char *nilai_p4 = nama;
float *nilai_p3= &nilai3;

printf("nilai 1 = %d, alamat1 = %p, ukuran %d\n",*nilai_p1,&nilai_p1,sizeof(nilai1));


printf("nilai 2 = %d, alamat2 = %p, ukuran %d\n",*nilai_p2,&nilai_p2,sizeof(nilai2));
printf("nilai 3 = %f, alamat3 = %p, ukuran %d\n",*nilai_p3,&nilai_p3,sizeof(nilai3));
printf("nilai 4 = %s, alamat4 = %p, ukuran %d\n",nama,&nilai_p4,sizeof(nama));
getch();
return 0;
}

Operasi pointer:
1. Operasi Pemberian nilai

#include
#include

int main(){
float nilai,*p1,*p2;
nilai = 14.54;
printf("nilai = %2.2f, alamatnya %p\n",nilai,&nilai);
p1 = &nilai;
printf("nilai p1 = %2.2f, p1 menunjuk alamat %p\n",*p1,p1);
//pada awalnya p2 masih dangling pointer
printf("mula-mula nilai p2 = %2.2f, p2 menunjuk alamat %p\n",*p2,p2);
p2 = p1; //operasi pemberian nilai, berarti alamat x2 sama dengan x1
printf("sekarang nilai p2 = %2.2f, p2 menunjuk alamat %p\n",*p2,p2);
getch();
}

Contoh 2:
#include
#include

int main(){
int *p,a=25,b;
//p masih dangling
printf("nilai a = %d di alamat a = %p,\n",a,&a);
printf("nilai p di alamat = %p\n",p);
p = &a;
printf("nilai p = %d di alamat %p\n",*p,p);
//b diisi dengan nilai yang berasal dari nilai
//variabel a yang ditunjuk oleh pointer p
b = *p;
printf("nilai b = %d di alamat %p\n",b,&b);
getch();
}
Contoh 3:
#include
#include

int main(){
int a=25,b=12,t;
int *p,*q;
p = &a;
q = &b;
printf("nilai yang ditunjuk p = %d di alamat %p\n",*p,p);
printf("nilai yang ditunjuk q = %d di alamat %p\n",*q,q);
//Contoh kasus, penukaran nilai 2 variabel dengan pointer
t = *p;
*p = *q;
*q = t;
printf("nilai yang ditunjuk p sekarang = %d di alamat %p\n",*p,p);
printf("nilai yang ditunjuk q sekarang = %d di alamat %p\n",*q,q);
getch();
}
Contoh 4:
#include
#include

int main(){
int a,*p;
p=&a;
*p=25;
printf("nilai a = %d",a);
}
2. Operasi Aritmatika
#include
#include

int main(){
int a,b=10,*p,*q;
p=&a;
*p=25;
printf("nilai a = %d\n",a);
printf("alamat p = %p\n",p);
q=&b;
printf("alamat q = %p\n",q);
printf("nilai a + b = %d\n",(*p+*q));
//posisi alamat p menjadi bergeser, nilai berubah
p=p+1;
printf("nilai p = %d, alamat = %p\n",*p,&p);
q=q-1;
printf("nilai q = %d, alamat = %p\n",*q,&q);
getch();
}

Pointer pada array 1 dimensi:


#include
#include

int main(){
char S[] = "anton";
char *p;
//cara 1
//langsung menunjuk nama array.
p=S;
for(int i=0;i<5;i++){ printf("%c",*p); p++; } printf("\n"); //cara 2 p=&S[0]; for(int i=0;i<5;i++){
printf("%c",*p); p++; } printf("\n"); //Membalik kalimat p--; for(int i=0;i<5;i++){ printf("%c",*p); p--; }
printf("\n"); getch(); } Pointer pada Struct: #include
#include

typedef struct{
int nim;
int umur;
float ipk;
} Mahasiswa;

Mahasiswa m;
Mahasiswa *p = &m;

int main(){
//struct biasa
m.nim=123;
m.ipk=3.2;
m.umur=23;
printf("nim = %d\n",m.nim);
printf("ipk = %f\n",m.ipk);
printf("umur = %d\n",m.umur);
//struct pointer
p->ipk = 3.5;
p->nim = 321;
p->umur = 32;
printf("nim = %d\n",p->nim);
printf("ipk = %f\n",p->ipk);
printf("umur = %d\n",p->umur);

//mengacu pada variabel aslinya


printf("nim = %d\n",m.nim);
printf("ipk = %f\n",m.ipk);
printf("umur = %d\n",m.umur);
getch();
}

DEKLARASI POINTER
Seperti halnya variabel yang lainnya, variabel pointer juga harus dideklarasikan terlebih dahulu
sebelum digunakan.

Bentuk Umum :
Tipe_data *nama_pointer;

//Contoh
int *px;
char *sh;
Contoh Program :

#include “IOSTREAM.h”
#include “conio.h”
void main()
{ int x, y; /* x dan y bertipe int */
int *px; /* px pointer yang menunjuk objek */
clrscr();
x = 87;
px = &x; /* px berisi alamat dari x */
y = *px; /* y berisi nilai yang ditunjuk px */
cout<<“Alamat x =”<<&x <<\n”;
cout<<“Isi px = \n”, px);
cout<<“Isi x = \n”, x);
cout<<“Nilai yang ditunjuk oleh px = \n”, *px);
cout<<“Nilai y = \n”, y);
getch();
}

OPERASI-0perasi POINTER
1. Operasi Penugasan
Suatu variabel pointer seperti halnya variabel yang lain, juga bisa mengalami operasi penugasan. Nilai sari
suatu variabel pointer dapat disalin ke variabel pointer yang lain.

//Contoh
#include "iostream.h"
#include "conio.h"
void main()
{ float *x1,y, *x2;
clrscr();
y = 13.45;
x1 = &y; /* Alamat dari y disalin ke variabel x1 */
x2 = x1; /* Isi variabel x1 disalin ke variabel x2 */
cout<<"Nilai variabel y = "<<y<< " ada di alamat "<< x1<<"\n";
cout<<"Nilai variabel y = "<<y<< " ada di alamat "<< x2<<"\n";
getch();
}

2. Operasi Aritmatika

Suatu variabel pointer hanya dapat dilakukan operasi aritmatika dengan nilai integer saja. Operasi yang
biasa dilakukan adalah operasi penambahan dan pengurangan. Operasi penambahan dengan suatu nilai
menunjukkan lokasi data berikutnya (index
selanjutnya) dalam memori. Begitu juga operasi pengurangan.

//Contoh Operasi aritmatika


#include <iostream.h>
#include <conio.h>
void main()
{ int nilai[3], *penunjuk;
clrscr();
nilai[0] = 125;
nilai[1] = 345;
nilai[2] = 750;
penunjuk = &nilai[0];
cout<<"Nilai "<<*penunjuk <<" ada di alamat memori " <<penunjuk<<"\n";
cout<<"Nilai "<<*(penunjuk+1) <<" ada di alamat memori " <<penunjuk+1<<"\n";
cout<<"Nilai "<<*(penunjuk+2) <<" ada di alamat memori " <<penunjuk+2<<"\n";
getch();
}
3. Operasi Logika
Operasi logika juga dapat dilakukan pada sebuah variabel pointer.

//Contoh
#include<iostream.h>
#include "conio.h"
void main()
{ int a = 100, b = 200, *pa, *pb;
clrscr();
pa = &a;
pb = &b;
cout<<"nilai pa= "<<pa<< " nilai pb= "<<pb<<"\n";
if(pa < pb)
cout<<"pa menunjuk ke memori lebih rendah dari pb\n";
if(pa == pb)
cout<<"pa menunjuk ke memori yang sama dengan pb\n";
if(pa > pb)
cout<<"pa menunjuk ke memori lebih tinggi dari pb\n";
getch();}

OPERATOR POINTER
Ada beberapa operator yang bisa digunakan dalam pointer. Operator tersebut adalah operator
alamat (yang dilambangkan dengan simbol &) dan operator unary yang mengembalikan alamat
dari operandnya.

Sebagai contoh, diasumsikan deklarasi sebagai berikut :


Int y = 5;
Int *yPtr;

Maka pernyataan :
YPtr = &y;

Pernyataan ini mengandung arti bahwa alamat dari variabel y ditujukan kepada variabel pointer
yPtr.

Contoh lain :
Int balance, value;
Int *balptr;
Balance = 3200; // step 1
Balptr=&balance; // step 2
Value=*balptr; // step 3
Contoh diagram :

Step 1 Step 2 Step 3

12 Balptr 12 100 Balptr 12 100 Balptr

100 3200 Balance 100 3200 Balance 100 3200 Balance

130 value 130 value 130 3200 value

Contoh lainya :

//Program:pointer3.cpp
#include <iostream.h>

int main()
{
int *ptr, num; // Step 1
ptr = &num; // Step 2
*ptr = 100; // Step 3
cout << num << " ";
(*ptr)++; // Step 4
cout << num << " ";
(*ptr)*=2; // Step 5
cout << num << "\n";
return 0;
}

Bila program dijalankan :


100 101 202

Contoh diagram :

Step 1 Step Step Step Step


2 3 4 5

12 *int Ptr 12 50 Ptr 12 50 Ptr 12 50 Ptr 12 50 Ptr

50 int num 50 int num 50 100 num 50 101 num 50 202 num

... ... ... ... ...


Pointer Aritmatika
Ada 4 operator aritmatik dapat digunakan pada pointer ++, = =, +, dan -. Asumsi integer 32
Contoh :
Int *p1;
p1++;
p1--;

Contoh lain:

//Program:pointer4.cpp
#include <iostream.h>

int main()
{
int i[10], *i_ptr;
double f[10], *f_ptr;
int x;
i_ptr = i; // i_ptr points to first element of i
f_ptr = f; // f_ptr points to first element of f
for(x=0; x<10; x++)
cout << i_ptr+x << " " << f_ptr+x << "\n";
return 0;
}

Bila program dijalankan :


0xeffffd9c 0xeffffd48
0xeffffda0 0xeffffd50
0xeffffda4 0xeffffd58
0xeffffda8 0xeffffd60
... ...

Pointer Perbandingan
Pointer dapat dibandingkan dengan menggunakan operator hubungan, seperti !=, ==, <, dan >.
Contoh :

//Program:pointer5.cpp
#include <iostream.h>

int main()
{
int num[10];
int *start, *end;
start = num;
end = &num[9];
while(start != end) {
cout << "Masukkan bilangan sebanyak 9 data : ";
cin >> *start;
start++;
}
return 0;
}

Catatan :Data yang akan dimasukkan sebanyak 9 buah data dan program tidak akan berhenti
apabila belum sampai 9 buah data.

POINTER VERSUS ARRAY


Array dan pointer adalah dua struktur data yang saling berkaitan satu dengan yang lain
dalam C, dan dapat saling dipertukarkan penggunaannya. Karena array dapat didefinisikan
sebagai pointer.

Contoh :
int *bPtr, b[5];

Dapat dibuat menjadi :


bPtr = b;
bPtr = &b[0];

Berarti bPtr ditugaskan untuk menunjukkan ke alamat elemen pertama dari array b atau b[0].
Elemen array b[3] dapat ditulis :
* (bPtr + 3)
Alamat &b[3] dapat ditulis :
bPtr +3
Deklarasi suatu variabel array x[] yang berisi nilai int dapat ditulis :
int *x;
Variabel array ganda dapat ditulis :
int y [ ] [ ];
int *y [ ];
int *( *y);
Penggunaan pointer dan array untuk deklarasi variabel array ganda untuk menyimpan empat
buah elemen yang masing-masing bertipe string (array dari karakter).
char *suit [4] = { “Hearts”, “Diamonds”, “Clubs”, “Spades” };

Contoh :

//Program:pointer6.cpp
#include <iostream.h>
#include <stdio.h>

int main()
{
char str[80];
char token[80];
char *str_ptr, *tk_ptr;
cout << "Masukkan sebuah kalimat : ";
gets(str);
str_ptr = str;

while(*str_ptr) {
tk_ptr = token;

while( *str_ptr != ' ' && *str_ptr ) {


*tk_ptr = *str_ptr;
tk_ptr++;
str_ptr++;
}
if(*str_ptr) str_ptr++;
*tk_ptr = '\0';
cout << token << endl;
}
return 0; }

//Program:pointer7.cpp
#include <iostream.h>
#include <stdio.h>

int main()
{
char str[80];
char token[80];
int i, j;
cout << "Masukkan sebuah kalimat: ";
gets(str);

for(i=0; ; i++) {
for(j=0; str[i] != ' ' && str[i]; j++, i++)
token[j] = str[i];
token[j] = '\0';
cout << token << '\n';
if(!str[i]) break;
}
return 0;
}

Pada contoh program pointer 6 adalah program dengan pointer, sedangkan contoh
program pointer 7 dengan menggunakan array. Hasil dari kedua program tersebut sama.

POINTER INDEX
Pointer tidak hanya dapat digunakan untuk mengakses elemen array, tetapi pointer
juga dapat diindex seperti pada array.

Contoh :
//Program:pointer8.cpp
#include <iostream.h>
#include <ctype.h>

int main()
{
char str[20] = "hello tom";
char *p;
int i;
p = str;
for(i=0; p[i]; i++)
p[i] = toupper(p[i]);
cout << p;
return 0;
}

Bila program diatas dijalankan, maka hasilnya adalah sebagai berikut :


HELLO TOM

Proses pengindexan pointer dapat dilihat pada variabel p yang menunjuk pada variabel str yang
berisi data nama dengan panjang 20. Fungsi toupper memperjelas proses pengindexan.

KONSTANTA STRING DAN POINTER

Konstanta string terlihat dalam program teks dan disimpan dalam tabel string serta setiap entry
dalam tabel string, pointer string dibangkitkan.

Contoh :

//Program:pointer9.cpp
#include <iostream.h>
int main()
{
char *s;
s = "Pointers are fun to use.\n";
cout << s;
return 0;
}

Bila program diatas dijalankan, maka hasilnya adalah sebagai berikut :


Pointers are fun to use.

ARRAY POINTER
Pointer dapat diarraykan seperti tipe data yang lain dalam C++. Untuk menyatakan
sebuah array pi dari pointer sebanyak 10 buah data yang bertipe 10 integer, dapat
ditulis :
int *pi [10];
Untuk menentukan alamat dari variabel integer disebut var ke elemen ketiga dari
pointer array, dapat ditulis :
int var;
pi [2] = &var

Contoh :

//Program:point10.cpp
#include <iostream.h>

int main ()
{
int numbers[5];
int *p;
p = numbers; *p = 10;
p++; *p = 20;
p = &numbers[2]; *p = 30;
p = numbers + 3; *p = 40;
p = numbers; *(p+4) = 50;
for (int n=0; n<5; n++)
cout << numbers[n] << ", ";
return 0;
}

Bila program diatas dijalankan, maka hasilnya adalah sebagai berikut :


10, 20, 30, 40, 50,

Pointer Pada Record


contoh:

Deklarasi
Type DataMhs : record < NIM : integer, Nama : String, IPK : Real>
PMhs : Pointer to DataMhs

Maka :
PMhs↑.NIM : menunjuk ke field yang bertipe integer
PMhs↑.Nama : menunjuk ke field yang bertipe string
PMhs↑.IPK : menunjuk ke field yang bertipe real

Deskripsi
Mhs.NIM ← 2011110001
Mhs.Nama ← ‘Dhanny Chandra’
Mhs.IPK ← 3.2
PMhs ← @Mhs
write(Mhs↑.NIM)
write(Mhs↑.Nama)
write(Mhs↑.IPK)

Alokasi Penyimpanan Dinamis


Tipe pointer memungkinkan pengalokasian memori secara dinamis. Artinya ruang memori untuk
elemen yang diacu oleh nama bertipe pointer baru dialokasikan pada saat diminta, dan memori
yang dipakai dapat dikembalikan ke sistem bila tidak diperlukan lagi.
Berikut ini terdapat prosedur dan fungsi yang dianggap sudah tersedia untuk pengalokasian
memori dan dealokasi memori.

procedure AlokMem(output P : Alamat) { prosedur pengalokasian


ruang memori }
procedure DeAlokMem(input P : Alamat) { prosedur mengembalikan
ruang memori ke sistem }

Contoh
Deklarasi
Type DataMhs : record < NIM : integer, Nama : String, IPK : Real>
PMhs : Pointer to DataMhs
PX : Pointer to integer
Deskripsi
{ Contoh Pengalokasi memori untuk PX }
AlokMem(PX)
read(PX↑)
proses(PX↑)
...
DeAlokMem(PX)
{ Contoh Pengalokasi memori untuk PMhs }
AlokMem(PMhs)
PMhs↑.NIM ← 2011110001
PMhs↑.Nama ← ‘Dhanny Chandra’
PMhs↑.IPK ← 3.2
Proses(PMhs↑)
...
DeAlokMem(PMhs

Dalam Delphi Pascal:


1. Prosedur pengalokasian memori = New(pointer)
2. Prosedur pengalokasian memori = Dispose(pointer)
Diposting oleh diana simanjuntak di 18.56
Kirimkan Ini lewat EmailBlogThis!Berbagi ke TwitterBerbagi ke FacebookBagikan ke Pinterest

Tidak ada komentar:


Posting Komentar
Posting LamaBeranda

Langganan: Posting Komentar (Atom)


Calender
TIME

Mengenai Saya

diana simanjuntak
Lihat profil lengkapku

Arsip Blog

 ▼ 2015 (3)
o ▼ November (1)
 POINTER DALAM STRUKTUR DATA
o ► Januari (2)
 ► 2014 (8)

Tema Sederhana. Diberdayakan oleh Blogger.

Anda mungkin juga menyukai