Sebagian besar pengembang menemukan pointer di C melalui mekanisme spesifik yang dikenal sebagai pass-by-pointer. Ini bukan hanya kekhasan sintaksis; inilah alasan mendasar mengapa fungsi dapat mengubah keadaan eksternal. Anda mungkin pernah melihat ini sebelumnya tanpa menyadarinya. Pertimbangkan fungsi scanf. Setiap kali Anda memanggil scanf, Anda terpaksa menambahkan alamat operator (& ) ke variabel Anda.
scanf("%d", &Nomor Saya);
Jika Anda menghilangkan ampersand itu, program akan crash. Mengapa? Karena scanf mengharapkan alamat memori, bukan nilai. Memahami perilaku ini akan membuka logika di balik cara C menangani parameter fungsi. Saat Anda meneruskan pointer, Anda memberikan izin fungsi untuk mengakses memori Anda dan menulis ulang data secara langsung.
Зміст
Kegagalan Pass-by-Value
Untuk memahami mengapa petunjuk diperlukan, kita harus melihat apa yang terjadi jika petunjuk tersebut tidak ada. Kesalahan umum pemula adalah mencoba menulis fungsi swap yang menukar dua nilai integer.
Berikut adalah implementasi naif yang gagal:
Jalankan kode ini. Outputnya akan menampilkan 5 10 diikuti oleh 5 10. Pertukaran tidak terjadi.
Alasannya sederhana. Di C, argumen diteruskan berdasarkan nilai secara default. Saat swap(a, b) dipanggil, sistem akan membuat salinan lokal dari a dan b dengan nama i dan j. Fungsi ini menukar nilai i dan j dengan sangat baik. Namun ketika fungsinya kembali, variabel lokal tersebut dimusnahkan. a dan b asli di main tetap tidak tersentuh.
Solusinya: Pass-by-Pointer
Untuk mengubah variabel asli, fungsi memerlukan akses ke lokasi memori sebenarnya, bukan salinan nilainya. Di sinilah pointer untuk parameter fungsi menjadi penting.
Berikut implementasi yang diperbaiki:
Sekarang, outputnya adalah 5 10 diikuti oleh 10 5. Pertukarannya berhasil.
Cara Kerja Dereferensi Pointer
Perbedaannya terletak pada apa yang diteruskan ke fungsi tersebut.
- Panggilan:
swap(&a, &b)meneruskan alamat dariadanb. - Parameter: Tanda tangan fungsi
void swap(int *i, int *j)mendeklarasikanidanjsebagai pointer ke bilangan bulat. - Koneksi: Di dalam
swap,imenyimpan alamata.jmemegang alamatb. - Dereferensi: Pernyataan
*i = *jberarti “pergi ke alamat memori yang disimpan dii, dan tulis nilai yang ditemukan di alamat memori yang disimpan dijke dalamnya.”
Secara visual, bayangkan dua kotak berlabel a dan b.
– a berisi 5.
– b berisi 10.
– i adalah catatan dengan alamat kotak a tertulis di atasnya.
– j adalah catatan dengan alamat kotak b tertulis di atasnya.
Saat kode mengeksekusi t = *i, ia membaca catatan i, menuju ke lokasi tersebut, dan membaca nilai 5. Ini menyimpan 5 di t. Kemudian *i = *j membaca nilai dari kotak b (yaitu 10 ) dan menuliskannya kembali ke kotak a. Kotak aslinya telah berubah.
























