Belajar tentang pointer memang sangat penting dalam pemrograman bahasa C. Oleh karena itu, berikut adalah penjelasan mengenai pointer dalam bahasa C.
Sama seperti kita yang punya alamat, variabel juga memiliki alamat yang ada dalam memori saat program berjalan. Ini juga merupakan keunggulan dari bahasa C, karena bahasa C memungkinkan kita untuk mengakses alamat memori dan melakukan operasi yang berhubungan dengan memori.
Ada 2 yang akan kita pelajari nanti, yaitu Address-of (&
) dan Pointer (*
).
Daftar isi
Address-of
Seperti penjelasan sebelumnya bahwa setiap variabel pasti memiliki alamat pada memori dan untuk mengetahui alamat variabel tersebut, kita gunakan operator address-of (&
).
Tak perlu jauh-jauh, kita sudah tahu tentang fungsi scanf()
, yaitu fungsi yang meminta input dari pengguna.
scanf("%d", &a);
Pada fungsi itu, terdapat ‘&a
‘ yang artinya program akan menyimpan nilai input ke dalam alamat memori a
.
Alamat memori memiliki format heksadesimal (hex), yaitu sistem bilangan yang memiliki 16 simbol dalam penomoran. Contoh untuk mencetak alamat dari memori a:
#include <stdio.h> int main(){ int a; printf("%p\n", &a); }
Hasil keluaran:
0x7ffef6dec9ec
Program akan mencetak alamat a
dengan menggunakan sistem bilangan heksadesimal.
Catatan: Hasil bisa berbeda setiap saat dan berbeda antara perangkat satu dengan lainnya.
Pointer
Pointer adalah sebuah variabel yang akan menyimpan alamat dari variabel lain. Setelah mengetahui cara mengambil alamat sebuah variabel, sekarang kita harus menggunakan pointer untuk menyimpannya. Meskipun berbeda dari variabel umumnya, namun cara mendeklarasikan pointer hampir sama dengan yang lain.
Deklarasi Pointer
tipe_data *nama_variabel;
Atau
tipe_data* nama_variabel;
Keduanya sama-sama mendeklarasikan sebuah variabel.
Inisialisasi Pointer
Karena pointer menampung alamat memori, maka dalam melakukan inisialisasi juga harus memberikan alamat memori. Jika tidak, tentu akan terjadi suatu kesalahan (error).
#include <stdio.h> int main(){ int a = 5; int *p = &a; printf("%p\n", p); }
Pada contoh tersebut, p
merupakan variabel pointer, sehingga untuk mencetaknya tak perlu menggunakan &
.
Assignment Pointer
Assignment adalah memberikan nilai pada variabel, cara melakukannya untuk pointer juga tidak sama dengan yang lain.
#include <stdio.h> int main(){ int a = 5; int *p; p = &a; printf("%p\n", p); }
Untuk melakukan assignment, tak perlu menambahkan *
. Karena baris ke-5 hanya memberi tahu komputer bahwa p
adalah sebuah pointer, dan isi dari p
adalah a
(baris ke-7).
Operator Dereference (*)
Operator ini merupakan kebalikan dari operator &
karena operator ini akan menunjuk nilai yang berada di alamat memori. Misal:
#include <stdio.h> int main(){ int a = 5; int *p; p = &a; printf("%d\n", *p); }
Output:
5
p
merupakan pointer yang menyimpan alamat dari a
, sehingga *p
berisi nilai dari a
. Karena nilai dari a
adalah 5, maka *p
bernilai 5. Memang terlihat membingungkan karena pointer lebih sulit daripada yang lain.
Uniknya dari pointer adalah dengan mengubah satu akan mengubah yang lain. Pada contoh sebelumnya, *p
akan merujuk nilai dari a
dan jika nilai *p
kita ubah, nilai dari a juga akan ikut berubah.
#include <stdio.h> int main(){ int a = 5; int *p; p = &a; printf("%d\n", *p); *p = 20; printf("%d\n", a); a = 25; printf("%d\n", *p); }
Output:
5 20 25
Padahal pada baris 11 yang diubah adalah *p
, begitu juga pada baris 14.
Double Pointer
Sekarang kita tahu bahwa pointer adalah variabel yang berisi alamat dari variabel lain. Hal ini juga bisa berlaku untuk pointer itu sendiri. Artinya double pointer adalah variabel pointer yang menunjuk (menyimpan alamat) pointer lain. Double pointer juga bisa disebut dengan istilah pointer to pointer.
#include <stdio.h> int main(){ int a = 5; int *ptr1; int **ptr2; ptr1 = &a; ptr2 = &ptr1; printf("%d\n", a); printf("%d\n", *ptr1); printf("%d\n", **ptr2); }
Output:
5 5 5
Jika printf()
terakhir berisi *ptr2
dan bukan **ptr2
, maka keluaran terakhir yang tercetak adalah alamat dari ptr1
.
Pointer Array
Jika kita menggunakan pointer pada array, maka program akan otomatis merujuk pada array elemen pertama (indeks 0). Namun berbeda jika kita menyertakan indeksnya.
#include <stdio.h> int main(){ int arr[5] = {1,2,3,4,5}; int i; for(i=0;i<5;i++) printf("%p\n", &arr[i]); printf("%p\n", &arr); }
Output:
0x7ffdbb263e60 0x7ffdbb263e64 0x7ffdbb263e68 0x7ffdbb263e6c 0x7ffdbb263e70 0x7ffdbb263e60
Terlihat bahwa perbedaan indeks ke-n dengan indeks n+1 adalah 4. Hal ini dikarenakan array tersebut memiliki tipe data int
, tipe data yang memiliki ukutan 4 byte.
Pointer dan Fungsi
Pada fungsi kita sudah mengetahui tentang parameter. Ada 2 cara bagi kita untuk memberi nilai pada parameter, yaitu pass by value dan pass by reference.
Pass by value adalah kita hanya memberikan nilai pada parameter fungsi dan tidak akan berdampak apapun terhadap nilai awal (nilai asli). Sedangkan pass by reference memungkinkan kita untuk memberikan nilai untuk parameter fungsi sekaligus memungkinkan untuk mengubah nilai awal nilai tersebut.
Pass by value:
#include <stdio.h> void pass_by_value(int a){ a *= 2; printf("%d\n", a); } int main(){ int nilai = 5; pass_by_value(nilai); printf("%d\n", nilai); }
Output:
10 5
Seperti yang kita ketahui bahwa prosedur pass_by_value()
akan mencetak 10 dan variabel nilai
bernilai 5.
Pass by reference:
#include <stdio.h> void pass_by_ref(int *a){ (*a) *= 2; printf("%d\n", *a); } int main(){ int nilai = 5; pass_by_ref(&nilai); printf("%d\n", nilai); }
Output:
10 10
Sebenarnya bisa saja kita menuliskan baris ke-3 dengan *a *= 2;
namun tentu akan membingungkan karena ada banyak asterisk.
Berbeda dari pass by value, pass by reference juga akan mengubah nilai dari variabel sumber (nilai
).
Mungkin itu saja penjelasan mengenai pointer bahasa C, jika ada pertanyaan mari berdiskusi di bawah. Happy coding!