Dapatkah Beberapa Pointer Merujuk Variabel yang Sama di C?

12

Ini adalah kekhasan C yang sering membuat pemula tersandung tetapi terasa seperti keajaiban setelah diklik: Anda dapat memiliki selusin petunjuk yang semuanya mengarah ke alamat memori yang sama.

Pertimbangkan skenario ini. Anda mendeklarasikan bilangan bulat i. Kemudian Anda mendeklarasikan tiga pointer p, q, dan r. Anda menugaskan semuanya ke alamat i.

Lihatlah baris terakhir itu. r tidak perlu mengetahui tentang i secara langsung. Itu hanya menunjuk ke apa pun yang p tunjuk. Dan p menunjuk ke i. Jadi r juga menunjuk ke i.

Operator penugasan di sini menyalin alamatnya, bukan nilainya. Saat Anda melakukan r = p, Anda tidak menyalin bilangan bulat di dalam i. Anda menyalin lokasi memori yang disimpan p.

Setelah kode ini dijalankan, i pada dasarnya memiliki empat nama. Anda dapat mengaksesnya melalui i. Anda dapat mengaksesnya melalui *p. Anda dapat mengaksesnya melalui *q. Atau Anda dapat mengaksesnya melalui *r.

Tidak ada batasan teknis mengenai berapa banyak petunjuk yang dapat Anda kumpulkan seperti ini.

Mengapa Ini Penting

Ini bukan hanya sintaksis akademis. Ini mengubah cara Anda berpikir tentang aliran data.

Dalam bahasa dengan referensi objek yang ketat, menyalin objek sering kali membuat instance baru di memori. Di C, menyalin pointer itu murah. Itu hanya alamat memori. Cepat. Kecil.

Hal ini memungkinkan beberapa bagian kode Anda memanipulasi data yang sama tanpa duplikasi. Ubah *p dan *q segera melihat perubahannya.

Anda membuat alias untuk memori.

Risiko Alias

Di sinilah “aspek keren” menjadi sebuah tanggung jawab.

Jika p, q, dan r semuanya menunjuk ke i, salah satu dari mereka dapat mengubah i.

Sekarang i adalah 10. *q adalah 10. *r adalah 10.

Namun bagaimana jika Anda lupa bahwa r juga sedang memperhatikan i? Anda mungkin menganggap i stabil karena Anda belum menyentuhnya secara langsung. Anda hanya menyentuh *q.

Ini adalah sumber daya bersama. Dan sumber daya bersama adalah tempat terjadinya kondisi balapan dan penimpaan yang tidak terduga.

Cara Mencegah Efek Samping yang Tidak Diinginkan

Jika Anda ingin memastikan satu penunjuk tidak secara tidak sengaja menimpa data yang dimaksudkan untuk penunjuk lainnya, gunakan const.

Sekarang r dapat membaca i. Itu bisa menunjukkan hal itu. Itu tidak bisa mengubahnya.

Ini adalah cara Anda menerapkan batasan dalam bahasa yang memercayai Anda untuk mengelola memori secara manual.

Dimana Cocok dalam Pemrograman Sistem

Anda melihat pola ini di mana pun dalam kode sistem.

Struktur kernel sering kali memiliki banyak penunjuk ke blok kontrol yang sama. Driver perangkat memetakan register perangkat keras yang sama ke nama logis yang berbeda.

Memahami bahwa pointer hanyalah label untuk alamat membantu Anda men-debug masalah ini. Ketika memori rusak, lacak petunjuknya. siapa lagi