Pengertian Pointer
Dalam ilmu komputer, pointer adalah tipe data bahasa pemrograman
yang nilainya mengacu untuk menunjuk langsung nilai lain yang tersimpan
di tempat lain dalam suatu memori komputer menggunakan alamat yang ada.
Untuk bahasa pemrograman tingkat tinggi, pointer secara efektif dapat
mengambil tempat pada general purpose registers di bahasa tingkat rendah
seperti bahasa assembly atau kode mesin, tetapi bila memori tersedia.
Pointer adalah implementasi sederhana, lebih konkret tentang tipe
data referensi yang lebih abstrak. Beberapa bahasa mendukung beberapa
jenis pointer, walaupun ada yang memiliki lebih banyak pembatasan
penggunaannya dari pada yang lain. Sebagai analogi, sebuah nomor halaman
dalam buku dapat dianggap sebagai pointer ke halaman yang sesuai;
dereferencing seperti pointer akan dilakukan dengan membalik ke halaman
dengan nomor halaman yang diberikan.
Pointer dapat meningkatkan kinerja data secara signifikan agar
operasi berulang seperti traversing string, tabel lookup, tabel kontrol
dan struktur pohon. Secara khusus, sering jauh lebih efisien dalam waktu
dan space untuk pointer dari pada menggunakan variable tipe data biasa.
Pointer juga digunakan untuk menyimpan alamat dari titik masuk
untuk memanggil subrutin dalam pemrograman prosedural dan untuk run-time
penghubung ke dynamic link libraries (DLL). Dalam pemrograman
berorientasi objek, pointer ke fungsi yang digunakan untuk
mengikat/menjilid method, ini sering disebut tabel method virtual.
Sementara “pointer” telah digunakan untuk merujuk pada referensi
yang ada pada umumnya, hal ini berlaku lebih baik bagi struktur data
yang secara eksplisit memungkinkan antarmuka (interface) pointer untuk
dimanipulasi (secara aritmetik melalui aritmetik pointer) sebagai alamat
memori. Karena pointer memungkinkan akses yang baik dilindungi maupun
tidak dilindungi ke memori yang dituju.
Pointer primitif adalah pointer sering disimpan dalam format yang
sama dengan integer. Namun, mencoba untuk dereference atau “mencari”
pointer yang nilainya tidak pernah menjadi alamat memori yang valid akan
menyebabkan program menjadi crash.
Deskripsi Formal:
Dalam ilmu komputer, pointer adalah macam referensi. Sebuah data primitive (primitive) adalah setiap datum yang dapat dibaca dari atau ditulis ke memori komputer menggunakan satu akses memori (misalnya, kedua byte dan kata (word) yang primitif).
Sebuah data agregat (aggregate) adalah sekelompok data primitif
yang logis berdekatan di memori dan yang dipandang secara kolektif
sebagai satu datum (misalnya, agregat bisa saja 3 byte logis berdekatan,
maka nilai-nilai itu lah yang mewakili 3 koordinat titik di dalam ruang
memori), ketika seluruh agregat yang terdiri dari jenis primitive yang
sama, agregat dapat disebut sabagai sebuah array, dalam arti, multi-byte
primitif adalah array dari byte.
Dalam konteks definisi ini, byte adalah primitif terkecil,
masing-masing menentukan alamat memori byte yang berbeda. Alamat memori
dari byte pertama pada sebuah datum dianggap sebagai alamat memori (atau
base alamat memori) dari seluruh datum.
Sebuah pointer memori adalah primitive, nilai yang dimaksudkan
untuk digunakan sebagai alamat memori itu disebut sebagai pointer
petunjuk ke alamat memori. Hal ini juga disebut bahwa pointer menunjuk
ke datum [dalam memori] ketika nilai pointer berupa alamat memori datum
itu.
Secara lebih umumnya, pointer adalah jenis data referensi, dan agar
memperoleh pointer dereference maka datum pointer disimpan di lokasi
yang berbeda di dalam memori. Fitur yang membedakan pointer dengan jenis
referensi lain adalah nilai pointer yang dimaksud agar ditafsirkan
sebagai alamat memori, yang merupakan konsep ‘tingkat rendah’.
Saat membuat struktur data seperti daftar, deret dan percabangan,
perlu memiliki pointer untuk membantu mengelola bagaimana struktur dapat
diimplementasikan dan dikendalikan. Contoh umum dari pointer adalah
start pointer, end pointer, dan stack pointer. Pointer ini 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. Secara umum, meskipun, skema seperti itu banyak masalah,
dan untuk kemudahan bagi programmer maka ruang alamat datar biasanya
lebih disukai.
Sebuah byte offset, seperti nilai ASCII karakter heksadesimal dapat
digunakan untuk menunjuk nilai integer alternatif dalam array. Dengan
cara ini, karakter dapat sangat efisien diterjemahkan dari ‘data mentah’
ke indeks sekuensial dapat digunakan dan kemudian ke alamat absolut
tanpa menggunakan tabel lookup.
Digunakan dalam mengontrol tabel
Kontrol tabel 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).
Abstraksi pointer yang sangat tipis di atas merupakan kemampuan
pengalamatan yang dikembangkan dengan arsitektur paling modern. Dalam
skema sederhana, alamat atau indeks numerik, ditugaskan bagi setiap unit
memori dalam sistem, di mana unit ini biasanya baik byte atau kata
(word), secara efektif dapat mengubah semua memori ke array yang sangat
besar. Kemudian, jika kita memiliki suatu alamat, sistem itu menyediakan
operasi untuk mengambil nilai yang tersimpan dalam unit memori pada
alamat (biasanya menggunakan register tujuan umum didalam mesin yang
digunakan).
Dalam kasus biasa, pointer itu cukup besar untuk menampung alamat
lebih dari beberapa unit memori yang berada di dalam sistem. Ini
memperkenalkan kemungkinan bahwa program mungkin berusaha untuk
mengakses alamat bila tidak ada unit memori, baik karena memori tidak
cukup dipasang (yaitu di luar jangkauan memori yang tersedia) atau
arsitektur tidak mendukung alamat tersebut. Kasus pertama mungkin, dalam
platform tertentu seperti arsitektur Intel x86, disebut kesalahan
segmentasi (segfault). Kasus kedua adalah mungkin dalam implementasi
pada AMD64, di mana pointer yang memiliki panjang 64 bit dan alamat
hanya memperpanjang sampai 48 bit. Disini pointer harus sesuai dengan
aturan-aturan tertentu (alamat kanonik), jadi jika pointer nonkanonik
adalah dereferenced, akan berakibat prosesor melakukan kesalahan
perlindungan umum (general protection fault).
Di sisi lain, beberapa sistem memiliki lebih banyak unit memori
dari pada alamat. Dalam hal ini, skema yang lebih kompleks seperti
segmentasi memori atau paging dikelola untuk menggunakan bagian yang
berbeda dari memori pada waktu yang berbeda pula. Inkarnasi terakhir
dari arsitektur x86 mendukung hingga 36 bit dari alamat memori fisik,
yang dipetakan ke ruang alamat 32-bit linear melalui mekanisme paging
PAE. Jadi, hanya 1 / 16 dari total memori yang mungkin dapat diakses
pada suatu waktu. Contoh lain dalam kelompok komputer yang sama adalah
16-bit dalam keadaan terlindungi dari prosesor 80286 yang meskipun
mempunyai 16 MiB memori fisik, dapat mengakses hingga 1 GB dari memori
virtual, namun kombinasi dari 16-bit alamat dan segmen register dapat
mengakses lebih dari 64 KiB dalam satu struktur data rumit. Beberapa
pembatasan aritmetik pointer ANSI mungkin memiliki model memori
tersegmentasi dari kelompok prosesor ini.
Dalam rangka untuk mengembangkan interface yang konsisten, beberapa
arsitektur menyediakan I / O yang dipetakan ke dalam memori, yang
memungkinkan beberapa alamat untuk menuju ke unit memori sementara yang
lain mengacu pada register perangkat perangkat lain di komputer. Ada
konsep analog seperti file offset, indeks array, dan referensi object
remote yang melayani beberapa tujuan yang sama sebagai alamat untuk
jenis object lainnya.
Pointer secara langsung didukung tanpa pembatasan dalam bahasa
seperti PL / I, C, C++, Pascal, dan kebanyakan bahasa perakitan. Ketika
berhadapan dengan array, operasi pencarian kritis biasanya perhitungan
alamat disebut tahap perhitungan alamat yang melibatkan pembentukan
sebuah array.
Dalam struktur data lain, seperti daftar terhubung (linked list),
pointer digunakan sebagai referensi secara eksplisit yang mengikat salah
satu bagian dari struktur yang lain. Pointer digunakan untuk menumpangi
parameter bagi referensi. Hal ini berguna jika programmer mengingin
modifikasi fungsi untuk parameter, untuk dapat dilihat ke pemanggilan
fungsi itu. Ini juga berguna untuk menampikan nilai hasil perkalian dari
dalam fungsi yang telah dibuat.
Pointer juga dapat digunakan untuk mengalokasikan atau DEALLOCATE
variabel dinamis dan array dalam memori. Karena variable akan sering
menjadikan memori penuh setelah selasai ngerjakan 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
}
Arti pointer dalam bahasa sehari-hari adalah putunjuk atau dapat
dikatakan sebagai penentu atau dapat diartikan sebagai tipe data yang
nilainya mengarah pada nilai yang terdapat pada sebuah area memori
(alamat memori).Namun dalam bahasa C, Pointer bisa berfungsi sebagai
variabel array berarti pointer sebagai penunjuk elemen array ke-0 dalam
variabel C.
Kegunaan Pointer Di C++ :
Kegunaan pointer yang utama adalah untuk menyimpan alamat memori
dari sebuah variabel (data type atau object dari class), menyimpan
alamat dari sebuah fungsi (function pointer) dan dapat berfungsi untuk
mengirimkan “Parameter yang berupa variabel” ke dalam fungsi, artinya
nilai variabel bisa diubah di dalam fungsi serta dapat membuat variabel
dinamis.
Tipe Data Pointer :
Tipe_data merupakan tipe dari data yang ditunjuk, bukan tipe dari pointer- nya. Contoh :
1. Mensubstitusikan address sebuah variabel ke pointer dengan memakai address operator &
int x;
int *ptr;
ptr = &x;
2. Mensubstitusikan address awal sebuah array ke pointer
char t[5]; char *ptr; ptr = t;
3. Mensubstitusikan address salah satu elemen array dengan address operator
char t[5] ; char *ptr; ptr = &t[3];
4. Mensubstitusikan address awal character string ke pointer char
char *ptr;
ptr = “jakarta”
5. Mensubstitusikan NULL pada pointer.
NULL ada pointer kosong, menunjukkan suatu status dimana pointer itu belum diinisialisasikan dengan sebuah address tertentu.
Operator Pointer :
Ada 2 operator pointer yang dikenal secara luas, yaitu operator & dan operator *.
Operator &
Operator & merupakan operator alamat. Pada saat pendeklarasian
variable, user tidak diharuskan menentukan lokasi sesungguhnya pada
memory, hal ini akan dilakukan secara otomatis oleh kompiler dan
operating sysem pada saat run-time. Jika ingin mengetahui dimana suatu
variable akan disimpan, dapat dilakukan dengan memberikan tanda
ampersand (&) didepan variable , yang berarti “address of”. Contoh :
ted = &input;
Penulisan tersebut berarti akan memberikan variable ted alamat dari
variable input. Karena variabel input diberi awalan karakter ampersand
(&), maka yang menjadi pokok disini adalah alamat dalam memory,
bukan isi variable.
Misalkan input diletakkan pada alamat 1776 kemudian dituliskan instruksi sbb :
input = 25; fred = input; ted = &input;
Operator *
Operator * merupakan operator reference. Dengan menggunakan
pointer,kita dapat mengakses nilai yang tersimpan secara langsung dengan
memberikan awalan operator asterisk (*) pada identifier pointer, yang
berarti “value pointed by”. Contoh :
beth = *ted;
(dapat dikatakan:”beth sama dengan nilai yang ditunjuk oleh ted”)
beth = 25, karena ted dialamat 1776, dan nilai yang berada pada alamat
1776 adalah 25.
Macam – macam Pointer
- Pointer Bertipe Void
Pada C++ terdapat pointer yang dapat menunjuk ke tipe data apapun, pointer semacam ini dideklarasikan dengan tipe void sehingga sering dikenal dengan istilah Void Pointer. Berikut ini contoh listing program yang menggunakan void pointer. - Pointer Aritmetika
Elemen-elemen array biasanya diakses melalui indeksnya, sebenarnya ada cara lain yang lebih efisien, yaitu dengan menggunakan pointer. Pointer semacam ini disebut dengan istilah pointer aritmetika. Konsep dasar dari pointer aritmetika ini adalah melakukan operasi aritmetika terhadap variabel yang bertipe pointer. - Pointer NULL
Pada saat program dijalankan, pointer akan menunjuk ke alamat acak pada memori, sehingga diperlukan inisialisasi agar hal tersebut tidak terjadi. Dalam C++ terdapat sebuah cara untuk membuat pointer tidak menunjuk ke alamat manapun, yaitu dengan mengisikan pointer tersebut dengan nilai NULL. Karena hal inilah maka pointer tersebut sering dinamakan pointer NULL (NULL Pointer).Se¬bagai contoh kita mempunyai pointer p, dan kita ingin melakukan inisialisasi pada pointer tersebut dengan nilai NULL, maka sintaknya adalah P=NULL;
DEKLARASI POINTER
Seperti halnya variabel yang lain, variabel pointer juga harus dideklarasikan terlebih dahulu sebelum digunakan.
Bentuk Umum :
Tipe_data *nama_pointer;
//Contoh9_1
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-operasi Pointer
- 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. - Operasi Aritmatika
Suatu variabel pointer hanya dapat dilakukan operasi aritmatika dengan nilai integer saja. Operasi yang biasa dilakukan adalah operasi penambahan dan pengurangan. - Operasi Logika
Operasi logika juga dapat dilakukan pada sebuah variabel pointer.
OPERASI POINTER
* Operasi Penugasan
Suatu variable pointer seperti halnya variable yang lain, juga bisa mengalami operasi
penugasan. Nilai dari suatu variable pointer dapat disalin ke variable pointer yang lain.
//Contoh9_2
#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();
}
* 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.
//Contoh9_3
#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();
}
* Operasi Logika
Suatu pointer juga dapat dikenai operasi logika.
//Contoh9_4
#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();}
0 comments:
Post a Comment