Pointer ke Pointer (Double Pointer) di C
Halo semua, pemrogram berbakat! Hari ini, kita akan melakukan perjalanan yang menarik ke dunia pointer - khususnya, pointer ke pointer. Saya tahu apa yang mungkin Anda pikirkan: "Pointer? Double pointer? Ini terlihat seperti mimpi buruk!" Tetapi jangan khawatir, saya berjanji akan membuat ini menyenangkan dan mudah dipahami. Jadi, ambil minuman kesukaan Anda, rasakan diri Anda nyaman, dan mari kita melompat masuk!
Apa itu Double Pointer di C?
Bayangkan Anda berada di atas petualangan mencari harta. Anda memiliki peta (kita sebut itu pointer) yang mengarahkan Anda ke rakit. Tapi, tiba-tiba! Di dalam rakit, ada peta lain (pointer lain) yang mengarahkan ke harta yang sebenarnya. Itulah yang dipanggil double pointer - sebuah pointer yang menunjuk ke pointer lain.
Di dalam pemrograman C, double pointer adalah persis seperti yang namanya - sebuah pointer ke pointer. Ini adalah sebuah variabel yang menyimpan alamat dari pointer lain. Ini mungkin terdengar sedikit membingungkan di awal, tetapi jangan khawatir, kita akan membahas ini langkah demi langkah.
Deklarasi Pointer ke Pointer
Mari kita mulai dengan cara mendeklarasikan double pointer. Sintaksnya sangat sederhana:
int **ptr;
Disini, ptr
adalah pointer ke pointer ke integer. Tanda bintang pertama *
membuatnya menjadi pointer, dan yang kedua *
membuatnya menjadi pointer ke pointer.
Contoh Pointer ke Pointer (Double Pointer)
Mari lihat contoh sederhana untuk memahami ini lebih baik:
#include <stdio.h>
int main() {
int x = 5;
int *p = &x;
int **pp = &p;
printf("Nilai x: %d\n", x);
printf("Nilai x menggunakan p: %d\n", *p);
printf("Nilai x menggunakan pp: %d\n", **pp);
return 0;
}
Output:
Nilai x: 5
Nilai x menggunakan p: 5
Nilai x menggunakan pp: 5
Mari kita pecahkan:
- Kita mendeklarasikan integer
x
dan menginisialisasikannya dengan 5. - Kita membuat pointer
p
yang menunjuk kex
. - Kita membuat double pointer
pp
yang menunjuk kep
. - Kita kemudian mencetak nilai
x
dengan tiga cara berbeda:
- Langsung menggunakan
x
- Menggunakan pointer tunggal
p
(kita dereferensikannya sekali dengan*p
) - Menggunakan double pointer
pp
(kita dereferensikannya dua kali dengan**pp
)
Semua tiga metode memberikan nilai yang sama: 5. Seperti mencapai harta menggunakan peta yang berbeda!
Bagaimana Pointer Normal Bekerja di C?
Sebelum kita mendalamkan double pointer, mari singkat untuk membahas bagaimana pointer normal bekerja:
int y = 10;
int *q = &y;
printf("Nilai y: %d\n", y);
printf("Alamat y: %p\n", (void*)&y);
printf("Nilai q: %p\n", (void*)q);
printf("Nilai yang ditunjuk q: %d\n", *q);
Output:
Nilai y: 10
Alamat y: 0x7ffd5e8e9f44
Nilai q: 0x7ffd5e8e9f44
Nilai yang ditunjuk q: 10
Disini, q
adalah pointer yang menyimpan alamat dari y
. Ketika kita menggunakan *q
, kita mengakses nilai yang disimpan di alamat itu.
Bagaimana Double Pointer Bekerja?
Sekarang, mari perpanjang ini ke double pointer:
int z = 15;
int *r = &z;
int **rr = &r;
printf("Nilai z: %d\n", z);
printf("Alamat z: %p\n", (void*)&z);
printf("Nilai r: %p\n", (void*)r);
printf("Alamat r: %p\n", (void*)&r);
printf("Nilai rr: %p\n", (void*)rr);
printf("Nilai yang ditunjuk r: %d\n", *r);
printf("Nilai yang ditunjuk rr: %p\n", (void*)*rr);
printf("Nilai yang ditunjuk nilai yang ditunjuk rr: %d\n", **rr);
Output:
Nilai z: 15
Alamat z: 0x7ffd5e8e9f48
Nilai r: 0x7ffd5e8e9f48
Alamat r: 0x7ffd5e8e9f50
Nilai rr: 0x7ffd5e8e9f50
Nilai yang ditunjuk r: 15
Nilai yang ditunjuk rr: 0x7ffd5e8e9f48
Nilai yang ditunjuk nilai yang ditunjuk rr: 15
Ini mungkin terlihat sedikit melebihkan, tetapi mari kita pecahkan:
-
z
adalah integer dengan nilai 15. -
r
adalah pointer yang menyimpan alamat dariz
. -
rr
adalah double pointer yang menyimpan alamat darir
. -
*r
memberikan kita nilaiz
(15). -
*rr
memberikan kita nilair
(yang merupakan alamat dariz
). -
**rr
memberikan kita nilaiz
(15).
Pikirkan seperti ini: rr
menunjuk ke r
, yang menunjuk ke z
. Jadi **rr
adalah seperti mengatakan "ikuti pointer pertama, lalu ikuti pointer kedua, dan berikan nilai di sana".
Double Pointer Bertindak Seperti Pointer Normal
Inilah rahasia kecil: double pointer hanyalah pointer, tetapi bukannya menunjuk ke integer atau float, dia menunjuk ke pointer lain. Ini berarti kita bisa melakukan semua hal yang sama dengan double pointer seperti dengan pointer normal.
Misalnya, kita bisa menggunakan double pointer dengan array:
int main() {
char *fruits[] = {"Apel", "Pisang", "Cherry"};
char **ptr = fruits;
for(int i = 0; i < 3; i++) {
printf("%s\n", *ptr);
ptr++;
}
return 0;
}
Output:
Apel
Pisang
Cherry
Dalam contoh ini, fruits
adalah array of pointers (masing-masing menunjuk ke string), dan ptr
adalah pointer ke pointer ke char (yang dapat menunjuk ke elemen dari fruits
).
Pointer Multi Level di C (Apakah Triple Pointer Memungkinkan?)
Ya, Anda dapat memiliki triple pointer, quadruple pointer, dan seterusnya! Tidak ada batasan teoritis untuk tingkat indireksi yang Anda dapat memiliki. Namun, dalam praktek, sangat jarang melihat lebih dari double pointer.
Berikut adalah contoh triple pointer:
int x = 5;
int *p = &x;
int **pp = &p;
int ***ppp = &pp;
printf("Nilai x: %d\n", ***ppp);
Output:
Nilai x: 5
Tetapi ingat, hanya karena Anda bisa tidak berarti Anda harus. Tingkat indireksi yang berlebihan dapat membuat kode lebih sulit untuk dibaca dan dipelihara. Seperti adat penyuntingan pemrograman yang lama, "Semua masalah di ilmu komputer dapat diselesaikan dengan tingkat indireksi lain... kecuali masalah karena terlalu banyak tingkat indireksi!"
Kesimpulan
Selamat! Anda baru saja menelusuri perairan yang rumit double pointer di C. Ingat, seperti banyak konsep dalam pemrograman, pointer ke pointer mungkin terdengar membingungkan di awal, tetapi dengan latihan, mereka akan menjadi hal yang biasa.
Berikut adalah tabel yang ringkasan titik penting yang kita telah membahas:
Konsep | Sintaks | Deskripsi |
---|---|---|
Pointer Normal | int *p; |
Menunjuk ke integer |
Double Pointer | int **pp; |
Menunjuk ke pointer ke integer |
Dereferensi | *p |
Mengakses nilai yang ditunjuk oleh p
|
Double Dereferensi | **pp |
Mengakses nilai yang ditunjuk oleh pointer yang pp menunjuk |
Operator Alamat | &x |
Mendapatkan alamat dari x
|
Terus latihan, tetap curious, dan ingat - setiap ahli pernah menjadi pemula. Selamat coding!
Credits: Image by storyset