Pengertian Pointer
Dalam
ilmu komputer, pointer adalah tipe data bagi bahasa pemrograman yang
nilainya mengacu untuk menunjuk langsung nilai lain yang tersimpan di
tempat lain (variabel) di dalam suatu memori komputer dengan menggunakan
alamat yang ada. Untuk bahasa pemrograman tingkat tinggi, pointer
secara efektif dapat mengambil tempat pada general purpose registers
yang ada pada bahasa tingkat rendah seperti bahasa assembly apabila
memori masih tersedia.
Pointer adalah implementasi sederhana, lebih konkretnya yaitu tentang tipe data referensi yang lebih abstrak. Beberapa jenis bahasa mendukung pointer, walaupun ada yang memiliki lebih banyak pembatasan penggunaannya dari pada yang lain.
Sebagai analoginya, sebuah nomor halaman yang ada pada buku dapat dianggap sebagai pointer ke halaman yang sesuai, dan dereferencing pada pointer akan dilakukan dengan membalik ke halaman dengan nomor halaman yang diberikan.
Sebagai analoginya, sebuah nomor halaman yang ada pada buku dapat dianggap sebagai pointer ke halaman yang sesuai, dan dereferencing pada 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 penggunaan 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
ini "pointer" telah digunakan untuk merujuk pada referensi yang ada
pada umumnya, hal ini juga baik digunakan untuk struktur data yang
secara eksplisit memungkinkan antar muka (interface) pointer untuk
dimanipulasi (secara aritmetik melalui aritmetik pointer) sebagai alamat memori. Karena pointer memungkinkan akses yang dilindungi maupun tidak dilindungi ke memori yang dituju.
Pointer
primitif adalah pointer sering disimpan dalam format yang sama dengan
integer. Namun, pada saat 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 termasuk tipe data macam referensi. Sebuah data 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 data primitif yang logis berdekatan di
dalam 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 (larik), 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 pointer itu digunakan sebagai
alamat memori dan disebut sebagai pointer petunjuk ke alamat memori. Hal
ini juga disebut bahwa pointer menunjuk ke datum [yang ada 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 yaitu nilai pointer yang dimaksud dianggap 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 dituju 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 struktur bahasa pemrograman yang
tersedia).
Pointer
juga dapat digunakan untuk titik (kembali) ke entri tabel sebelumnya
(seperti dalam pengolahan loop) atau maju melewati beberapa 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 di dalam 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 sedangkan
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 menginginkan modifikasi fungsi untuk parameter, agar
dapat dilihat pada pemanggilan fungsi itu. Ini juga berguna untuk
menampilkan nilai hasil perkalian dari dalam fungsi yang telah dibuat.
Pointer
juga dapat digunakan untuk mengalokasikan/ALLOCATE atau DEALLOCATE
variabel dinamis dan array dalam memori. Karena variable akan sering
menyebabkan memori penuh setelah selasai ngerjakan perintah, itu dapat
menjadi pemborosan memori apabila kita menyimpannya terus-menerus, dan
oleh karena itu praktik yang baik untuk DEALLOCATE itu (menggunakan
referensi pointer asli) ketika tidak diperlukan lagi.
Kegagalan pada DEALLOCATE dapat mengakibatkan kehabisan memori (dimana
memori bebas yang tersedia akan secara bertahap berkurang atau dalam
kasus yang parah, dengan secara cepat akan penuh).
Tidak ada komentar:
Posting Komentar