Penuding kepada Penuding (Penuding Dua Kali) di C

Halo di sana, pemrogram penyusun cita-cita! Hari ini, kita akan melakukan perjalanan yang menarik ke dunia penuding - khususnya, penuding kepada penuding. Saya tahu apa yang mungkin anda fikirkan: "Penuding? Penuding dua kali? Ini terdengar seperti mimpi buruk!" Tetapi jangan khawatir, saya berjanji untuk membuat ini menyenangkan dan mudah untuk dipahami. Jadi, ambil minuman kesukaan anda, rasakan diri anda yang selesa, dan mari kita melompat masuk!

C - Pointer to Pointer

Apa itu Penuding Dua Kali di C?

Bayangkan anda berada di atas penyelidikan harta karun. Anda memiliki peta (kita panggil itu penuding) yang membawa anda ke rakit. Tetapi kejutan! Di dalam rakit, ada peta lain (penuding lain) yang membawa kepada harta yang sebenarnya. Itulah esen penuding dua kali - penuding yang menunjuk kepada penuding lain.

Di dalam pemrograman C, penuding dua kali adalah persis seperti yang namanya menunjukkan - penuding kepada penuding. Itu adalah variabel yang menyimpan alamat penuding lain. Ini mungkin terdengar sedikit membingungkan di awal, tetapi jangan khawatir, kita akan pecahkan itu langkah demi langkah.

Deklarasi Penuding kepada Penuding

Mari kita mulai dengan bagaimana kita mendeklarasikan penuding dua kali. Sintaksnya sangat jelas:

int **ptr;

Di sini, ptr adalah penuding kepada penuding kepada integer. Tanda bintang pertama * menjadikannya penuding, dan yang kedua * menjadikannya penuding kepada penuding.

Contoh Penuding kepada Penuding (Penuding Dua Kali)

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 penuding p yang menunjuk ke x.
  3. Kita membuat penuding dua kali pp yang menunjuk ke p.
  4. Kita kemudian mencetak nilai x dengan tiga cara yang berbeda:
  • Langsung menggunakan x
  • Menggunakan penuding tunggal p (kita dereferensikannya sekali dengan *p)
  • Menggunakan penuding dua kali pp (kita dereferensikannya dua kali dengan **pp)

Semua tiga metode memberikan kita nilai yang sama: 5. Itu seperti mencapai harta menggunakan peta yang berbeda!

Bagaimana Penuding Normal Bekerja di C?

Sebelum kita kembali lebih jauh ke penuding dua kali, mari kita singkatkan bagaimana penuding 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 oleh q: %d\n", *q);

Output:

Nilai y: 10
Alamat y: 0x7ffd5e8e9f44
Nilai q: 0x7ffd5e8e9f44
Nilai yang ditunjuk oleh q: 10

Di sini, q adalah penuding yang menyimpan alamat y. Ketika kita menggunakan *q, kita mengakses nilai yang disimpan di alamat itu.

Bagaimana Penuding Dua Kali Bekerja?

Sekarang, mari kita perpanjang ini ke penuding dua kali:

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 oleh r: %d\n", *r);
printf("Nilai yang ditunjuk oleh rr: %p\n", (void*)*rr);
printf("Nilai yang ditunjuk oleh nilai yang ditunjuk oleh rr: %d\n", **rr);

Output:

Nilai z: 15
Alamat z: 0x7ffd5e8e9f48
Nilai r: 0x7ffd5e8e9f48
Alamat r: 0x7ffd5e8e9f50
Nilai rr: 0x7ffd5e8e9f50
Nilai yang ditunjuk oleh r: 15
Nilai yang ditunjuk oleh rr: 0x7ffd5e8e9f48
Nilai yang ditunjuk oleh nilai yang ditunjuk oleh rr: 15

Ini mungkin terlihat sedikit melelebihkan, tetapi mari kita pecahkan:

  1. z adalah integer dengan nilai 15.
  2. r adalah penuding yang menyimpan alamat z.
  3. rr adalah penuding dua kali yang menyimpan alamat r.
  4. *r memberikan kita nilai z (15).
  5. *rr memberikan kita nilai r (yang adalah alamat z).
  6. **rr memberikan kita nilai z (15).

Pikirkan tentang hal ini seperti ini: rr menunjuk ke r, yang menunjuk ke z. Jadi **rr adalah seperti mengatakan "ikuti penuding pertama, lalu ikuti penuding kedua, dan berikan saya nilai di sana".

Penuding Dua Kali Bertindak Seperti Penuding Normal

Inilah rahasia kecil: penuding dua kali adalah hanya penuding, tetapi bukannya menunjuk ke int atau float, itu menunjuk ke penuding lain. Ini berarti kita dapat melakukan semua hal yang sama dengan penuding dua kali yang kita lakukan dengan penuding normal.

Contohnya, kita dapat menggunakan penuding dua kali dengan array:

int main() {
char *fruits[] = {"Apel", "Pisang", "Ceri"};
char **ptr = fruits;

for(int i = 0; i < 3; i++) {
printf("%s\n", *ptr);
ptr++;
}

return 0;
}

Output:

Apel
Pisang
Ceri

Di sini, fruits adalah array dari penuding (masing-masing menunjuk ke string), dan ptr adalah penuding kepada penuding kepada char (yang dapat menunjuk ke elemen fruits).

Penuding Berbagai Tingkat di C (Apakah Penuding Triple Dimungkinkan?)

Ya, anda dapat memiliki penuding triple, kuadruple, dan seterusnya! Tidak ada batasan teoritis untuk tingkat indireksi yang anda dapat memiliki. Namun, dalam praktek, sangat jarang melihat lebih dari penuding dua kali.

Berikut adalah contoh penuding triple:

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 berlebihan dapat membuat kode lebih sulit untuk dibaca dan dipelihara. Seperti adat pemrogram yang lama berkata, "Semua masalah dalam ilmu komputer dapat diselesaikan dengan tingkat indireksi lain... kecuali masalah terlalu banyak tingkat indireksi!"

Kesimpulan

Selamat! Anda baru saja menavigasi di atas perairan yang rumit penuding dua kali di C. Ingat, seperti banyak konsep di pemrograman, penuding kepada penuding mungkin terdengar membingungkan di awal, tetapi dengan latihan, itu akan menjadi wajah kedua.

Berikut adalah tabel yang ringkasan titik utama yang telah kita review:

Konsep Sintaks Deskripsi
Penuding Normal int *p; Menunjuk ke integer
Penuding Dua Kali int **pp; Menunjuk ke penuding kepada integer
Dereferensi *p Mengakses nilai yang ditunjuk oleh p
Dereferensi Dua Kali **pp Mengakses nilai yang ditunjuk oleh penuding yang pp menunjuk
Operator Alamat &x Mendapatkan alamat x

Teruskan untuk berlatih, tetap curious, dan ingat - setiap ahli pernah menjadi pemula. Selamat coding!

Credits: Image by storyset