Hewan Peliharaan

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


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 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)