Menguasai Pointer C: Tutorial Praktis dengan Panduan Ahli
Menguasai Pointer C
Jelajahi konsep inti pointer di C, dari alamat memori hingga contoh praktis dan jebakan umum. Ditulis untuk pengembang yang ingin memenuhi pemahaman mereka dengan kode dunia nyata.
Pointer adalah fondasi pemrograman C yang efisien. Sebelum menyelami pointer, mari kita tinjau bagaimana alamat memori bekerja dalam C.
Alamat Memori dalam C
Jika Anda memiliki variabel var, ekspresi &var menghasilkan alamat tempat var disimpan.
Manipulasi alamat sering muncul, misalnya dalam scanf():
scanf("%d", &var);
Ini menyimpan input pengguna langsung ke lokasi memori var. Demo singkat:
#include <stdio.h> int main() { int var = 5; printf("var: %d\n", var); printf("alamat var: %p", &var); return 0; }
Keluaran
var: 5 alamat var: 0x7fffc1a2b1c8
Catatan: Alamat akan berbeda pada setiap jalankan dan sistem.
Apa Itu Pointer?
Pointer adalah variabel yang menyimpan alamat memori bukan nilai konvensional. Dengan menyimpan alamat, pointer memungkinkan akses indirekt ke data, memungkinkan manajemen memori dinamis, struktur data yang efisien, dan kontrol sistem tingkat rendah.
Mendeklarasikan Pointer
Sintaks deklarasi umum:
int *p;
Variasi juga umum:
int *p1; int *p2;
Perhatikan bahwa spasi di sekitar bintang tidak mempengaruhi deklarasi. Namun, hati-hati dengan deklarasi yang dipisahkan koma:
int *p1, p2; /* p1 adalah pointer, p2 adalah int */
Menugaskan Alamat ke Pointer
Contoh:
int *pc, c; c = 5; pc = &c;
Di sini, c menerima nilai 5, dan pc menyimpan alamat c.
Mengurai Pointer
Untuk mengakses nilai yang disimpan di alamat yang dirujuk pointer, gunakan operator dereferensi *:
int *pc, c; c = 5; pc = &c; printf("%d", *pc); /* Mencetak 5 */
Ingat, pc adalah pointer; *pc mengambil nilai yang ditunjuknya. Mencoba menugaskan alamat ke *pc (misalnya, *pc = &c;) tidak valid.
Operator * dikenal sebagai operator dereferensi.
Mengubah Nilai Melalui Pointer
Anda dapat mengubah data dasar melalui pointernya:
int *pc, c; c = 5; pc = &c; *pc = 1; /* c menjadi 1 */ printf("%d", c); /* Mencetak 1 */
Beberapa variabel dapat berbagi pointer yang sama setelah pengisian ulang:
int *pc, c, d; c = 5; d = -15; pc = &c; printf("%d", *pc); /* 5 */ pc = &d; printf("%d", *pc); /* -15 */
Contoh Praktis
Jalankan program lengkap ini untuk mengamati bagaimana nilai pointer tetap konstan sementara data yang dirujuknya dapat berubah:
#include <stdio.h> int main() { int *pc, c; c = 22; printf("Alamat c: %p\n", &c); printf("Nilai c: %d\n\n", c); pc = &c; printf("Alamat pointer pc: %p\n", pc); printf("Isi pointer pc: %d\n\n", *pc); c = 11; printf("Alamat pointer pc: %p\n", pc); printf("Isi pointer pc: %d\n\n", *pc); *pc = 2; printf("Alamat c: %p\n", &c); printf("Nilai c: %d\n\n", c); return 0; }
Keluaran
Alamat c: 0x7fffc1a2b1c8 Nilai c: 22 Alamat pointer pc: 0x7fffc1a2b1c8 Isi pointer pc: 22 Alamat pointer pc: 0x7fffc1a2b1c8 Isi pointer pc: 11 Alamat c: 0x7fffc1a2b1c8 Nilai c: 2
Penjelasan
int *pc, c; – mendeklarasikan pointer pc dan int c. c = 22; – menyimpan 22 di memori c. pc = &c; – menunjuk pc ke c. c = 11; – memperbarui nilai melalui akses langsung. *pc = 2; – mengubah nilai melalui pointer.
Kesalahan Umum dengan Pointer
Kesalahan umum termasuk mencampur pointer dan nilai:
int c, *pc; // Salah – menugaskan nilai ke pointer pc = c; // Error // Salah – mencoba menugaskan alamat ke pointer yang diurai *pc = &c; // Error // Benar – menugaskan alamat ke pointer pc = &c; // OK // Benar – menugaskan nilai ke lokasi yang ditunjuk *pc = c; // OK
Untuk pemula, sintaks int *p = &c; dapat membingungkan. Ini setara dengan:
int *p; p = &c;
Menulisnya sebagai int* p = &c; mengurangi ambigu.
Sekarang Anda memahami pointer, Anda siap untuk menjelajahi hubungan mereka dengan array dalam tutorial berikutnya.