Penunjuk (ilmu komputer)Ilustrasi sebuah variabel penunjuk (pointer) di memori yang menyimpan alamat memori dan merujuk secara langsung ke nilai dari variabel lain.
Dalam ilmu komputer, penunjuk (bahasa Inggris:pointercode: en is deprecated ) adalah objek atau tipe data pada bahasa pemrograman yang nilainya merujuk (atau "menunjuk") secara langsung ke nilai lain yang tersimpan di tempat else dalam memori komputer menggunakan alamat memori-nya. Memperoleh nilai data yang disimpan pada lokasi yang ditunjuk oleh sebuah penunjuk disebut dengan istilah dereferensi atau awakait (dereferencing).[1]
Konsep penunjuk sangat mirip dengan nomor halaman dalam daftar isi sebuah buku. Daftar isi tidak memuat isi bab itu sendiri, melainkan memuat "penunjuk" (nomor halaman) di mana bab tersebut dapat ditemukan secara fisik oleh pembaca. Dalam komputasi, penggunaan penunjuk dapat meningkatkan kinerja program secara signifikan karena menyalin dan memindahkan alamat memori (yang berukuran sangat kecil dan seragam) jauh lebih murah dan cepat dibandingkan menyalin seluruh blok data yang besarnya bisa mencapai hitungan megabita.
Penunjuk merupakan elemen kunci dalam membangun struktur data yang kompleks, merancang algoritme tingkat rendah, dan melakukan alokasi memori dinamis.
Konsep dasar
Memori komputer fisik, seperti RAM, pada dasarnya dapat dipandang sebagai larikbita raksasa yang berurutan. Setiap bita dalam memori memiliki alamat numerik yang unik, dimulai dari angka 0 hingga batas maksimum kapasitas memori tersebut.
Ketika sebuah program mendeklarasikan variabel biasa, program tersebut meminta sistem operasi untuk mengalokasikan ruang memori untuk menampung nilai variabel tersebut. Nilai tersebut kemudian dapat diakses menggunakan nama variabel yang mudah dipahami oleh manusia. Sebaliknya, ketika program mendeklarasikan sebuah variabel penunjuk, sistem tidak menyimpan data aktual pada memori tersebut, melainkan menyimpan angka yang merepresentasikan alamat dari lokasi memori lain.[2]
Sebuah penunjuk dikatakan memiliki "tipe" tertentu (misalnya, penunjuk ke bilangan bulat atau penunjuk ke karakter). Tipe ini memberi tahu kompilator berapa banyak bita memori yang harus dibaca ketika penunjuk tersebut didereferensi, serta bagaimana menafsirkan deretan bit tersebut.
Operator dasar
Dalam bahasa pemrograman seperti C dan C++, operasi penunjuk dikendalikan menggunakan dua operator utama:
Operator alamat (biasanya dilambangkan dengan ampersan &): Mengembalikan alamat memori dari sebuah variabel yang sudah ada.
Operator dereferensi (biasanya dilambangkan dengan tanda bintang *): Mengakses nilai yang disimpan pada alamat memori yang ditunjuk oleh penunjuk tersebut.
Contoh dalam bahasa C:
#include<stdio.h>intmain(){intnilai=42;// Mendeklarasikan variabel biasaint*penunjuk=&nilai;// Penunjuk menyimpan alamat memori dari 'nilai'printf("Nilai dari variabel: %d\n",nilai);printf("Alamat dari variabel: %p\n",(void*)&nilai);printf("Alamat yang disimpan penunjuk: %p\n",(void*)penunjuk);// Melakukan dereferensi untuk mengambil atau mengubah nilai*penunjuk=100;printf("Nilai baru setelah diubah melalui penunjuk: %d\n",nilai);return0;}
Aritmetika penunjuk
Bahasa pemrograman tingkat rendah yang mendukung penunjuk secara manual (seperti C dan C++) mengizinkan operasi aritmetika terbatas pada penunjuk, seperti penjumlahan (+) dan pengurangan (-).[3]
Ketika sebuah angka ditambahkan ke penunjuk, alamat memori yang ditunjuk tidak bertambah sebesar angka tersebut secara mentah, melainkan bertambah sebesar angka tersebut dikali dengan ukuran tipe data yang ditunjuknya.[3]
Jika p adalah penunjuk ke sebuah bilangan bulat (int yang berukuran 4 bita) dan saat ini menyimpan alamat 1000, maka operasi p + 1 akan menghasilkan alamat 1004.
Mekanisme ini merupakan fondasi internal di balik cara kerja operasi indeks pada larik (array), di mana ekspresi larik[i] secara matematis ekuivalen dengan *(larik + i).
Penunjuk ganda (Pointer-to-Pointer)
Karena penunjuk itu sendiri merupakan sebuah variabel yang menempati ruang di memori komputer, penunjuk tersebut juga memiliki alamat memorinya sendiri. Hal ini memungkinkannya untuk ditunjuk oleh penunjuk lain, yang dikenal sebagai penunjuk ganda atau penunjuk tingkat dua (double pointer).[3]
Indireksi bertingkat ini dideklarasikan dengan tanda bintang ganda (misalnya int **ptp). Penunjuk ganda sangat sering dijumpai pada organisasi larik dua dimensi dinamis, serta ketika sebuah fungsi perlu mengubah alamat target yang disimpan oleh sebuah variabel penunjuk luar secara langsung.
Penggunaan
Implementasi senarai berantai tunggal (singly linked list) memanfaatkan penunjuk pada tiap simpul untuk merujuk ke lokasi simpul berikutnya di memori.
Penunjuk merupakan fondasi dari banyak mekanisme pemrograman tingkat lanjut, antara lain:
Alokasi memori dinamis: Fungsi pustaka seperti malloc dalam bahasa C mengembalikan sebuah penunjuk ke blok memori yang baru dialokasikan di pustaka memori heap. Tanpa penunjuk, program hanya terbatas pada variabel statis yang dialokasikan di tumpukan panggilan (stack).[4]
Struktur data dinamis: Struktur data rekursif dan tertaut, seperti senarai berantai, pohon, dan graf, dibangun menggunakan objek atau simpul yang di dalamnya memuat penunjuk ke simpul lain.[4]
Pemanggilan fungsi berdasarkan rujukan: Penunjuk memungkinkan parameter diteruskan ke dalam fungsi berdasarkan rujukannya (pass-by-reference). Ini memungkinkan fungsi tersebut mengubah nilai asli dari variabel yang diteruskan oleh pemanggil, bukan sekadar mengubah salinan lokalnya.
Pemetaan memori: Dalam pemrograman sistem dan penulisan pemacu peranti (device driver), penunjuk digunakan untuk menulis perintah langsung ke alamat memori perangkat keras fisik (seperti kartu grafis atau cip pengendali).
Penunjuk nol (Null pointer)
Penunjuk nol atau null pointer adalah penunjuk yang memiliki nilai khusus yang menandakan bahwa ia tidak merujuk ke objek atau lokasi memori mana pun yang valid.[5] Bergantung pada bahasa pemrogramannya, penunjuk ini sering direpresentasikan dengan kata kunci seperti NULL, nullptr, nil, atau None.
Penunjuk nol biasanya digunakan untuk menginisialisasi penunjuk yang belum memiliki target, menandai akhir dari sebuah struktur data (seperti ekor dari senarai berantai), atau mengindikasikan bahwa sebuah fungsi gagal melakukan tugasnya dan tidak memiliki nilai untuk dikembalikan. Upaya untuk mendereferensi penunjuk nol umumnya akan menyebabkan program mogok (crash) dan memicu kesalahan segmentasi (segmentation fault).
Kerentanan dan masalah umum
Kekuatan absolut yang ditawarkan oleh bahasa pemrograman yang mengekspos memori secara langsung kepada pengguna (seperti C/C++) sering kali memicu berbagai kutu (bug) dan kerentanan keamanan yang fatal:
Penunjuk menjuntai (Dangling pointer): Terjadi ketika memori yang ditunjuk oleh sebuah penunjuk telah dibebaskan (di-free atau dihapus), tetapi penunjuk itu sendiri belum dikosongkan. Mengakses penunjuk menjuntai memicu perilaku tak terdefinisi.[6]
Kebocoran memori (Memory leak): Terjadi ketika blok memori dinamis dialokasikan, tetapi penunjuk yang merujuk ke memori tersebut ditimpa atau hilang sebelum sempat dibebaskan. Memori tersebut akan terus mengonsumsi RAM sampai program dihentikan.[7]
Penunjuk liar (Wild pointer): Penunjuk yang dideklarasikan tetapi tidak diinisialisasi sehingga menunjuk ke alamat acak di memori.
Limpahan penyangga (Buffer overflow): Manipulasi memori atau aritmetika penunjuk yang secara keliru menunjuk melampaui batas akhir sebuah larik, sehingga menimpa data kritis di memori tetangganya.
Dukungan bahasa pemrograman
Paradigma setiap bahasa pemrograman menentukan bagaimana memori dikelola:
Kelompok Bahasa
Manajemen Pointer
Fitur Utama
Keamanan Memori
C, C++, Assembly, Pascal
Manual manual penuh oleh pemrogram
Mendukung aritmetika penunjuk penuh dan manipulasi alamat fisik secara langsung
Rendah (Sangat rentan terhadap kutu memori jika lalai)
Java, C#, Python, JavaScript
Otomatis (Abstraksi Penunjuk)
Menggunakan konsep referensi; penunjuk manual ditiadakan demi keamanan
↑Black, Paul E. "pointer". Dictionary of Algorithms and Data Structures (dalam bahasa Inggris). National Institute of Standards and Technology. Diakses tanggal 2 Juni 2026.
↑Patterson, David A.; Hennessy, John L. (2013). Computer Organization and Design: The Hardware/Software Interface (dalam bahasa Inggris) (Edisi 5th). Morgan Kaufmann. ISBN978-0-12-407726-3.
123Kernighan, Brian W.; Ritchie, Dennis M. (1988). The C Programming Language (dalam bahasa Inggris) (Edisi 2nd). Prentice Hall. ISBN978-0131103628.
12Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L.; Stein, Clifford (2009). Introduction to Algorithms (dalam bahasa Inggris) (Edisi 3rd). MIT Press. ISBN978-0-262-03384-8.
↑Black, Paul E. "null pointer". Dictionary of Algorithms and Data Structures (dalam bahasa Inggris). National Institute of Standards and Technology. Diakses tanggal 2 Juni 2026.