Saat belajar bahasa C, kita hampir pasti akan bertemu dengan konsep pointer. Simbol * dan & sering muncul di berbagai bagian kode, terutama saat berhubungan dengan fungsi, array, atau struktur data. Bagi pemula, pointer sering terlihat rumit, padahal konsep dasarnya cukup sederhana.
Pointer digunakan untuk menyimpan alamat memori dari suatu data, bukan nilainya langsung. Dengan cara ini, C bisa mengakses dan memanipulasi data secara efisien, terutama saat bekerja dengan data berukuran besar. Memahami pointer berarti memahami bagaimana program berinteraksi langsung dengan memori—sesuatu yang menjadi kekuatan utama bahasa C.
Abstraksi RAM

source: https://www.log2base2.com/C/pointer/computer-memory-address-basics.html
Kita berangkat dari memori/RAM terlebih dahulu. Kita bisa abstraksi RAM sebagai deretan kotak yang bernomor/beralamat. Setiap variabel yang kita definisikan sebenarnya cuma isi dari salah satu kaotak itu.
int x = 10;
printf("isi x: %d", x)
output:
isi x: 10
artinya: “Taruh angka 10 di satu kotak memori”.
Apa Itu Pointer?

Nah fungsi pointer sendiri adalah untuk menyimpan alamat kotak memori, bukan isi kotaknya.
Kalau variabel biasa menyimpan nilai, maka pointer menyimpan lokasi di mana nilai itu berada.
Kenapa ini penting?
Karena dengan mengetahui alamat suatu data, kita bisa:
- Mengakses data tersebut dari tempat lain
- Mengubah nilainya tanpa harus menyalin datanya
- Mengirim data besar ke fungsi tanpa meng-copy seluruh isinya
- Bekerja langsung dengan memori (array, buffer, file, jaringan, dll)
Jadi secara sederhana:
Variabel biasa menyimpan isi kotak
Pointer menyimpan nomor kotaknya
(*) Deklarasi Pointer
Untuk deklarasi pointer bisa kita lakukan dengan cara berikut:
int *y;
printf("isi y (alamat random stack): %p\n", y);
printf("nilai yang ditunjuk y: %d\n", *y);
output:
isi y (alamat random stack): 0x7fda1d4d8e90
nilai yang ditunjuk y: -98693133
Penjelasan:
yadalah pointer keint- Tapi belum diberi alamat yang valid
- Isinya adalah garbage value (bit sisa di memori)
- Saat kita akses
y, kita menyuruh program: “Pergi ke alamat acak itu dan ambil isinya”
(&) Menghubungkan Pointer ke Variabel
Sekarang kita pakai & untuk mengambil alamat variabel.
int x = 10;
int *y = &x;
printf("isi y (alamat dari x): %p\n", y);
printf("nilai yang ditunjuk y: %d\n", *y);
printf("y juga punya address: %d\n", &y);
output:
isi y (address dari x): 0x7ffd34d0cf0c
nilai yang ditunjuk y: 10
y juga punya address: 0x7ffd34d0cf10
Penjelasan:
&xberarti alamat dari variabelxysekarang menyimpan alamat tersebutyberarti: “Ambil nilai yang berada di alamat yang disimpan oleh y”
Menariknya: y sendiri juga variabel biasa, jadi dia juga punya alamat (&y)
Kesimpulan
| Simbol | Dibaca | Arti |
|---|---|---|
&x | address-of x | Ambil alamat memori x |
int *y | y adalah pointer ke int | y menyimpan alamat int |
*y | dereference y | Ambil nilai di alamat yang ditunjuk y |
Pointer sering dianggap sebagai salah satu bagian paling membingungkan di bahasa C. Banyak simbol * dan & yang terlihat “menakutkan” di awal. Tapi kalau kita kembali ke konsep dasarnya, pointer sebenarnya tidak lebih dari:
Variabel yang menyimpan alamat memori, bukan nilai langsung.
Dengan memahami bahwa:
- Variabel biasa menyimpan isi dari sebuah kotak memori
- Pointer menyimpan alamat dari kotak tersebut
&digunakan untuk mengambil alamat- digunakan untuk mengakses nilai di alamat itu
maka konsep pointer mulai terasa jauh lebih masuk akal.
Pointer memberi kita kemampuan untuk bekerja lebih dekat dengan memori: mengakses data secara efisien, mengirim data besar ke fungsi tanpa menyalin, serta membangun struktur data kompleks seperti array dinamis, linked list, tree, hingga sistem jaringan dan kernel.
Memang, pointer memberi kekuatan besar — dan seperti pepatah lama:
With great power comes great responsibility.
Kesalahan kecil dalam penggunaan pointer bisa menyebabkan bug yang sulit ditrace, crash, atau perilaku program yang tidak terduga. Karena itu, penting untuk selalu memastikan pointer menunjuk ke alamat yang valid sebelum digunakan.

