๐ Daftar Isi
Pada artikel kali ini kita akan membahas mengenai pointer. Pointer adalah variabel yang menunjuk ke suatu variabel lain dengan menyimpan alamat memory variable tersebut. Setiap variabel yang kita buat pada program akan memiliki alamat memori. Alamat memori berfungsi untuk menentukan lokasi penyimpanan data pada memori (RAM). Kadang alamat memori ini disebut reference atau referensi. Untuk melihat alamat memori yang digunakan pada variabel, kita bisa pakai simbol & (emphasis). Tak perlu jauh-jauh, kita sudah tahu tentang fungsi scanf(), yaitu fungsi yang meminta input dari pengguna. Contoh:
sacnf("%d", &a);
Pada contoh tersebut, 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 (Hasil bisa berbeda setiap saat dan berbeda antara perangkat satu dengan lainnya):
0x7ffef6dec9ec
Lalu apa hubungannya alamat memori dengan pointer? Seperti yang dijelaskan di awal artikel ini bahwa pointer adalah sebuah variabel yang berisi alamat memori dari variabel yang lain. Setelah mengetahui cara mengambil alamat sebuah variabel, sekarang kita harus menggunakan pointer untuk menyimpannya. Pointer juga bisa mengakses data yang ada di suatu alamat memori.
Tipe variabel pointer dan tipe data yang ditunjuk haruslah sejenis
Operator:
- * (bintang) untuk mendapatkan nilai dari variabel yang ditunjuk oleh pointer
- & untuk mendapatkan alamat memory dari suatu variabel;
Deklarasi Pointer
Meskipun berbeda dari variabel umumnya, namun cara mendeklarasikan pointer hampir sama dengan yang lain. Deklarasi pointer:
tipe_data *nama_variabel;
Karena pointer menampung alamat memori, maka dalam melakukan inisialisasi juga harus memberikan alamat memori. Untuk memahami deklarasi dan inisialisasi pointer.
#include <stdio.h>
int main()
{
int a = 5;
int *p;
p = &a;
printf("%p\n", p);
}
Pada contoh tersebut, saat memberikan nilai pada variabel pointer p, tak perlu menambahkan *. Kemudian, untuk mencetaknya tak perlu menggunakan &, karena p merupakan variabel pointer.
Operator Dereference (*) merupakan kebalikan dari operator & karena operator ini akan menunjuk nilai yang berada di alamat memori.
Contoh Program dengan Pointer
#include <stdio.h>
void main()
{
// membuat variabel
int umur = 19;
float tinggi = 175.6;
// membuat pointer
int *pointer_umur = &umur;
int *pointer2 = &umur;
float *p_tinggi = &tinggi;
// mecetak alamat memori variabel
printf("alamat memori variabel 'umur' = %d\n", &umur);
printf("alamat memori variabel 'tinggi' = %d\n",
&tinggi);
// mencetak referensi alamat memori pointer
printf("referensi alamat memori *pointer_umur = %d\n",
pointer_umur);
printf("referensi alamat memori *pointer2 = %d\n",
pointer2);
printf("referensi alamat memori *p_tinggi = %d\n",
p_tinggi);
}
Setelah dijalankan programnya, alamat memori yang digunakan sebagai referensi pada pointer akan sama dengan alamat memori dari variabel yang kita gunakan sebagai referensi.
Pointer Untuk Pass By Reference
Berikutnya kita akan mencoba menggunakan pointer untuk melakukan passing argumen berdasaran referensinya (pass by reference).
#include <stdio.h>
void add_score(int score)
{
score = score + 5;
}
void main()
{
int score = 0;
printf("score sebelum diubah: %d\n", score);
add_score(score);
printf("score setelah diubah: %d\n", score);
}
Pada program ini, kita membuat fungsi dengan nama add_score() untuk menambahkan nilai score sebanyak 5. Tapi ketika dijalankan, nilai variabel score tidak berubah, ia tetap bernilai 0. Hal ini karena variabel score dibuat di dalam fungsi main(), lalu ketika fungsi add_score() mencoba mengubah nilainya, maka perubahan hanya terjadi secara lokal di dalam fungsi add_score() saja. Hal ini dapat dibuktikan dengan menambahkan potongan program berikut ke dalam fungsi add_score():
printf("Score dibuah ke %d\n", score);
Setelah program di atas dijalankan, dapat dilihat bahwa nilai score pada fungsi add_score() sudah berubah menjadi 5, namun variabel score pada fungsi main() akan tetap bernilai. Permasalah ini salah satunya dapat diselesaikan dengan menggunakan pointer untuk melakukan pass-by-reference.
Sekarang, coba ubah kode programnya menjadi seperti ini:
#include <stdio.h>
void add_score(int *score)
{
*score = *score + 5;
printf("score dibuah ke: %d\n", *score);
}
void main()
{
int score = 0;
printf("score sebelum diubah: %d\n", score);
add_score(&score);
printf("score setelah diubah: %d\n", score);
}
Karena argumen fungsi add_score() kita ubah menjadi pointer, maka kita harus memberikan alamat memori saat memanggilnya. Sekarang, setiap fungsi add_score() dipanggil atau dieksekusi, maka nilai variabel score akan bertambah 5.
Pointer yang Mengakses Elemen Array
Pointer juga sering digunakan untuk mengakses elemen array, seperti yang ditunjukkan pada program di bawah ini.
#include <stdio.h>
void main()
{
printf("## Program Antrian CS ##\n");
char no_antrian[5] = {'A', 'B', 'C', 'D', 'E'};
// menggunakan pointer
char *ptr_current = &no_antrian;
for(int i = 0; i < 5; i++)
{
printf("๐ข Pelanggan dengan no antrian %c silahkan
ke loket!\n", *ptr_current);
printf("Saat ini CS sedang melayani: %c\n",
*ptr_current);
printf("-------- Tekan Enter untuk Next --------");
getchar();
ptr_current++;
}
printf("โ
Selesai");
}
Pada program ini, kita menggunakan ptr_current untuk mengakses elemen array. Saat pertama kali dibuat, pointer ptr_current akan mereferensi pada elemen pertama array. Lalu pada perulangan, dilakukan increment ptr_current++, maka pointer ini akan mereferensi ke elemen array selanjutnya.
Materi Lengkap
Silakan baca juga beberapa artikel menarik kami tentang Struktur dan Pointer, daftar lengkapnya adalah sebagai berikut.