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!

C - Pointer to Pointer

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:

  1. Kita mendeklarasikan integer x dan menginisialisasikannya dengan 5.
  2. Kita membuat pointer p yang menunjuk ke x.
  3. Kita membuat double pointer pp yang menunjuk ke p.
  4. 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:

  1. z adalah integer dengan nilai 15.
  2. r adalah pointer yang menyimpan alamat dari z.
  3. rr adalah double pointer yang menyimpan alamat dari r.
  4. *r memberikan kita nilai z (15).
  5. *rr memberikan kita nilai r (yang merupakan alamat dari z).
  6. **rr memberikan kita nilai z (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