Pointer
Mempelajari konsep memori, pointer, dan cara efisien memanipulasi struktur data (struct) langsung pada alamat memorinya tanpa menyalin data.
Motivasi: Mengapa Kita Butuh Pointer?
Bayangkan kamu memiliki sebuah buku ensiklopedia tebal berukuran 1000 halaman — ini adalah analogi dari sebuah struct atau data yang ukurannya sangat besar. Suatu hari, temanmu meminta kamu memperbaiki satu salah ketik di halaman 500.
Jika kamu menggunakan fungsi biasa (Passing by Value), C++ akan memfotokopi seluruh 1000 halaman buku tersebut, memberikannya ke dalam fungsi, lalu membuangnya setelah fungsi selesai. Sangat boros waktu dan memori!
Pendekatan yang jauh lebih cerdas adalah Passing by Reference. Alih-alih memfotokopi buku, kamu cukup memberikan "alamat rak" tempat buku itu berada. Fungsi langsung mendatangi rak tersebut dan memperbaiki buku aslinya. Di sinilah letak kekuatan sesungguhnya dari manipulasi memori di C++.
Konsep Dasar Pointer
Pointer adalah variabel khusus yang tidak menyimpan nilai data secara langsung, melainkan menyimpan alamat memori dari variabel lain.
Ada dua operator penting saat bekerja dengan pointer:
- Operator
&(Address-of) — mendapatkan alamat memori dari sebuah variabel. Contoh:&xberarti "alamat tempatxdisimpan". - Operator
*(Dereference) — saat deklarasi menandakan bahwa variabel adalah pointer (int *px;), dan saat digunakan untuk membaca atau mengubah nilai di alamat memori tersebut (*px = 100;).
Perhatikan visualisasi berikut:
Memori Komputer:
[Alamat: 0x6487620] berisi nilai 50 → Variabel x
[Alamat: 0x6487624] berisi 0x6487620 → Variabel pointer px (menyimpan alamat x)Passing Parameter by Reference
Pada materi sub program sebelumnya, parameter yang dikirim selalu berupa salinan nilainya (by value). Dengan pointer, kita dapat mengirimkan alamat memori variabel asli sehingga fungsi bisa memodifikasi nilainya secara langsung.
Perhatikan perbedaan deklarasi fungsinya:
| Passing by Value | Passing by Reference | |
|---|---|---|
| Deklarasi | void ubah(int sesuatu) | void ubah(int *sesuatu) |
| Efek | Hanya mengubah nilai fotokopi lokal | Mengubah nilai variabel asli di memori |
| Pemanggilan | ubah(x); | ubah(&x); |
Berhati-hatilah saat menggunakan Passing by Reference. Karena fungsi memiliki akses langsung ke memori asli, manipulasi data yang salah akan langsung merusak data utama program Anda!
Pointer dan Struct
Pointer tidak hanya untuk tipe sederhana seperti int atau double — pointer juga sangat sering digunakan bersama struct.
Mengirimkan struct ke dalam fungsi by reference berarti kita mengirimkan alamat memori variabel asli, bukan menyalin seluruh isinya. Ini sangat menghemat memori dan meningkatkan performa, terutama jika struct menyimpan banyak field atau field bertipe string.
Menggunakan Operator Panah (->)
Untuk mengakses field dari sebuah struct melalui pointer, secara logika penulisannya adalah (*rek).saldo — dereference dulu, baru akses field-nya. Namun penulisan ini panjang dan rawan salah.
C++ menyediakan jalan pintas: operator panah (->).
// Cara lama dan panjang
(*rek).saldo = (*rek).saldo + 50000;
// Cara baru menggunakan operator panah (SANGAT DISARANKAN)
rek->saldo = rek->saldo + 50000;
Selalu gunakan operator ketika bekerja dengan pointer yang
menunjuk ke sebuah struct. Ini adalah standar penulisan kode C++
modern.
Silakan pelajari dan jalankan kode di editor untuk melihat bagaimana fungsi setorTunai berhasil mengubah saldo secara permanen, sementara cobaSetorValue tidak memberikan efek apa pun pada data aslinya!