C memungkinkan Anda membuat kerumunan di sekitar satu lokasi memori. Anda tidak harus puas dengan satu petunjuk. Sejumlah pointer dapat menunjuk ke alamat yang sama. Ini bukan bug. Ini adalah fitur bagaimana C menangani referensi memori.
Pertimbangkan variabel integer sederhana i. Anda dapat mendeklarasikan tiga pointer berbeda: p, q, dan r. Kode ini sangat mudah.
Lihatlah baris terakhir itu. r menunjuk ke hal yang sama dengan p menunjuk ke sana. Dan karena p sudah diberi alamat i, r secara efektif menunjuk ke i juga.
Operator penugasan menyalin alamat dari sisi kanan ke sisi kiri. Itu tidak menyalin nilai yang disimpan di alamat itu. Itu menyalin lokasi itu sendiri. Ini adalah perbedaan utama dalam aritmatika pointer.
Setelah eksekusi, i memiliki empat nama. Anda dapat menyebut bilangan bulat sebagai i. Anda dapat memodifikasinya melalui *p. Anda dapat membacanya melalui *q. Anda juga dapat mengaksesnya menggunakan *r.
Tidak ada batasan berapa banyak pointer yang dapat menyimpan alamat yang sama. Anda dapat mendeklarasikan s, t, dan u jika Anda mau. Semuanya hanyalah alias untuk bagian memori yang sama.
Fleksibilitas ini penting. Hal ini memungkinkan fungsi untuk berbagi referensi ke data tanpa menyalin struktur besar. Ini memungkinkan struktur data yang kompleks di mana banyak node menunjuk ke anak yang sama. Itu membuat pengelolaan sumber daya di C lebih efisien.
Namun hal ini juga menimbulkan risiko. Jika satu penunjuk mengubah nilainya, semua penunjuk akan melihat perubahannya. Tidak ada isolasi. Anda harus berhati-hati. Satu penunjuk mengubah bilangan bulat. Yang lain langsung melihatnya.
Variabel
isekarang memiliki empat nama:i,*p,*q, dan*r.
Ini adalah aritmatika penunjuk dasar. Penting untuk memahami model memori C. Namun di sinilah segala sesuatunya menjadi rumit. Banyak referensi ke alamat yang sama berarti banyak cara untuk merusak data.
Anda dapat merangkai tugas penunjuk tanpa henti. s = r; t = s;. Semuanya menunjuk kembali ke i. Kompiler tidak peduli. Waktu proses tidak peduli. Itu hanya alamat memori.
Mengapa hal ini penting bagi pengguna sehari-hari? Jika Anda menulis kode C, Anda mengandalkan ini. Jika Anda sedang men-debug kerusakan, hal ini sering kali menjadi penyebabnya. Kesalahan penggunaan setelah bebas berkembang pesat di lingkungan di mana penunjuk ditugaskan ulang tetapi tidak dibatalkan.
Efisiensi harus dibayar mahal. Kompleksitas. Anda harus melacak siapa pemilik data tersebut. Siapa yang diperbolehkan memodifikasinya. Dengan banyak petunjuk, pelacakan itu menjadi lebih sulit.
Namun kekuatannya tidak dapat disangkal. Anda dapat meneruskan pointer ke fungsi. Ubah nilainya. Variabel asli mencerminkan perubahan. Begitulah cara C mencapai semantik referensi tanpa objek.
Ini adalah konsep yang sederhana. Salin alamatnya. Jangan menyalin nilainya. Biarkan beberapa nama merujuk pada satu lokasi. Gunakan dengan bijak.



























