Bolehkah Anda Mengambil Alamat Elemen Tatasusunan Satu Selepas Tamat?
Kod berikut telah menjadi subjek perdebatan dalam pengaturcaraan komuniti:
int array[5]; int *array_begin = &array[0]; int *array_end = &array[5];
Secara khusus, persoalan sama ada &array[5] ialah kod C sah dalam konteks ini telah dinaikkan.
Pendirian Piawaian C
Mengikut Piawaian C, khususnya:
Implikasi untuk &array[5]
Menggunakan peraturan ini pada &array[5], kami mempunyai:
Adakah Ia Sah?
Ya, ia sah. Piawaian secara eksplisit membenarkan penunjuk untuk menunjuk satu elemen melepasi penghujung tatasusunan, dengan syarat ia tidak dinyahrujuk. Dalam kes ini, &array[5] hanya digunakan untuk mendapatkan alamat, bukan untuk mengakses nilai di alamat itu, jadi ia berada dalam lingkungan yang dibenarkan oleh piawai.
Mengapa Perbezaan dari tatasusunan 5 atau &tatasusunan[4] 1?
Kelakuan &tatasusunan[5] berbeza daripada tatasusunan 5 atau &tatasusunan[4] 1 disebabkan oleh keutamaan operator dan [] digabungkan dengan kelakuan operator * unary yang tersirat oleh []. Khususnya:
Sebaliknya, &array[5] dinilai seolah-olah operator & telah dialih keluar dan operator [] ditukar kepada operator, menghasilkan tatasusunan 5, tetapi tanpa penilaian operator * unary.
Atas ialah kandungan terperinci Adakah Undang-undang dalam C untuk Mengambil Alamat Elemen Tatasusunan Satu Melepasi Akhir?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!