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