Mengapa Beberapa Pointer Dapat Menargetkan Satu Alamat di C

8

C memungkinkan Anda menciptakan kekacauan atau kejelasan dengan memori. Anda dapat memiliki lusinan petunjuk yang semuanya mengarah ke tempat yang sama di RAM. Ini bukan bug. Itu sebuah fitur.

Pertimbangkan skenario di mana Anda mendeklarasikan bilangan bulat i. Anda kemudian membuat tiga penunjuk bilangan bulat: p, q, dan r.

Kode ini melakukan persis seperti yang Anda harapkan. p mengambil alamat i. q melakukan hal yang sama. r menyalin apa pun yang dipegang p. Karena p menyimpan alamat i, r juga menunjuk ke i.

Setelah tugas ini dijalankan, Anda memiliki satu variabel dengan empat nama. i adalah yang asli. *p mengaksesnya. *q mengaksesnya. *r mengaksesnya.

Cara Kerja Penetapan Pointer

Kuncinya di sini adalah memahami apa yang terjadi selama penugasan. Saat Anda menulis q = &i, Anda tidak menyalin nilai i. Anda menyalin lokasi i.

Saat Anda menulis r = p, Anda menyalin alamat dari p ke r. Tidak ada memori baru yang dialokasikan. Tidak ada data yang diduplikasi. Nilai alamat berpindah dari satu variabel penunjuk ke variabel penunjuk lainnya.

Ini berarti tidak ada batasan berapa banyak pointer yang dapat menyimpan alamat yang sama. Anda dapat membuat seribu penunjuk yang semuanya menunjuk ke i. Semuanya merujuk pada lokasi memori yang sama.

Tidak ada batasan jumlah pointer yang dapat menampung (dan karenanya menunjuk ke) alamat yang sama.

Perilaku ini penting dalam cara C mengelola memori. Hal ini memungkinkan struktur data yang fleksibel seperti daftar tertaut dan pohon. Ini juga memungkinkan argumen fungsi yang efisien. Berikan penunjuk alih-alih salinan. Ubah data asli secara langsung.

Namun hal ini juga menimbulkan risiko. Ubah i menjadi p. Lihatlah i hingga q. Perubahannya terlihat dimana-mana. Hanya ada satu sumber kebenaran.

Variabel i sekarang memiliki empat nama. ‘saya’. *p. *q. *r.

Beginilah cara C bekerja. Anda memiliki akses langsung ke alamat memori. Anda bisa alias data dengan bebas. Anda hanya perlu berhati-hati dengan apa yang Anda ubah.