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();
}
#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 =
#
// 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 2
|
Step 3
|
Step 4
|
Step 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();
}
#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 =
#
// 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 2
|
Step 3
|
Step 4
|
Step 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)