Setiap nama variabel yang deklarasi merupakan representasi dari sebuah alamat memori yang menampung data. Misalkan terdapat sebuah variabel bertipe integer dengan nama var_int, maka 4 byte memori akan dipesan untuk variabel tersebut. Lokasi memori yang dipesan tersebut dikenal dengan nama var_int. Pada level mesin, lokasi tersebut memiliki alamat memori.
Dalam bahasa C, sebuah alamat memori dapat diakses dan dimanipulasi dengan menggunakan pointer. Pointer adalah sebuah variabel yang digunakan untuk menyimpan alamat memori variabel lain. Sebuah pointer dideklarasi dengan tipe data dan tanda ‘*’ (asterik) di depan nama variabel, seperti contoh di bawah.
int *ptr_i; /* pointer dengan tipe data integer */ float *ptr_f; /* pointer dengan tipe data float */ double *ptr_d; /* pointer dengan tipe data double */ char *ptr_c; /* pointer dengan tipe data char */
Terdapat dua operator yang digunakan dalam pointer, yaitu dereference operator (asterik (‘*’)) dan reference operator (ampersand (‘&’)). Dereference operator digunakan untuk mendapatkan nilai dari alamat memori yang ditunjuk oleh pointer. Sedangkan reference operator digunakan untuk mendapatkan alamat memori suatu variabel.
int i = 10; /* mengambil alamat memori variabel i dengan menggunakan * reference operator dan menyimpannya ke dalam pointer ptr_i */ int *ptr_i = &i; /* mengambil nilai dari alamat memori yang ditunjuk pointer ptr_i * dengan menggunakan dereference operator. Jika lupa meletakkan * dereference operator di depan nama variabel, maka yang akan * tercetak adalah alamat memori yang ditunjuk */ printf("%d\n", *ptr_i);
Tipe data variabel pointer harus sama dengan tipe data variabel yang ditunjuk.
Cara Kerja Pointer
Misalkan terdapat sebuah variabel i dan sebuah pointer ptr_i, dengan ptr_i menunjuk ke alamat i sebagai berikut.
int i = 10; int *ptr_i = &i;
ASUMSIKAN variabel i disimpan di dalam memori dengan alamat memori 22FF3C (dalam hexadesimal) dan pointer disimpan di dalam memori dengan alamat memori 22FF38. Maka yang tersimpan di dalam pointer ptr_i adalah 22FF3C. Dengan kata lain, pointer ptr_i menunjuk ke alamat memori variabel i.
Perlu diingat, pointer hanya menujukkan ke sebuah alamat memori BUKAN menyimpan nilai yang ada pada alamat memori tersebut. Jadi, jika nilai variabel i diubah, maka nilai yang ditunjuk oleh pointer ptr_i juga akan berubah sesuai dengan nilai yang berubah. Begitu juga jika nilai yang ditunjuk pointer ptr_i diubah seperti di bawah, maka nilai pada variabel i juga akan berubah.
*ptr_i = 5
Untuk lebih jelas, perhatikan contoh di bawah.
#include <stdio.h> int main() { int *ptr_i; /* deklarasi pointer ptr_i */ int i; /* deklarasi variabel i */ /* inisialisasi variabel i dengan nilai 10 */ i = 10; /* menyimpan alamat memori variabel i ke pointer ptr_i */ ptr_i = &i; /* cetak alamat memori variabel i */ printf("Alamat memori variabel i: %p\n", &i); /* cetak nilai variabel i */ printf("Nilai variabel i: %d\n", i); /* cetak alamat yang ditunjuk pointer ptr_i */ printf("Alamat memori yang disimpan pointer ptr_i: %p\n", ptr_i); /* cetak nili pada alamat memori yang ditunjuk pointer ptr_i */ printf("Nilai pada alamat memori yang ditunjuk pointer ptr_i: %d\n\n", *ptr_i); /* mengubah nilai variabel i */ i = 5; printf("Setelah nilai variabel i diubah menjadi 5\n"); printf("Nilai variabel i: %d\n", i); printf("Nilai pada alamat memori yang ditunjuk pointer ptr_i: %d\n\n", *ptr_i); /* mengubah nilai pada alamat memori yang ditunjuk pointer ptr_i */ *ptr_i = 15; printf("Mengubah nilai variabel i melalui pointer ptr_i menjadi 15\n"); printf("Nilai variabel i: %d\n", i); printf("Nilai pada alamat memori yang ditunjuk pointer ptr_i: %d\n\n", *ptr_i); return 0; }
Alamat memori variabel i: 000000000022FE44 Nilai variabel i: 10 Alamat memori yang disimpan pointer ptr_i: 000000000022FE44 Nilai pada alamat memori yang ditunjuk pointer ptr_i: 10 Setelah nilai variabel i diubah menjadi 5 Nilai variabel i: 5 Nilai pada alamat memori yang ditunjuk pointer ptr_i: 5 Mengubah nilai variabel i melalui pointer ptr_i menjadi 15 Nilai variabel i: 15 Nilai pada alamat memori yang ditunjuk pointer ptr_i: 15