Menukar Penunjuk: Mengapa Sekatan terhadap Penukaran Penunjuk ke Penunjuk?
Dalam C , secara amnya dibenarkan menghantar penuding kepada bukan -jenis const kepada penunjuk kepada jenis const. Ini mengikut prinsip "const-correctness", membenarkan hanya data malar diubah suai.
Walau bagaimanapun, satu pengecualian pelik timbul apabila berurusan dengan penunjuk kepada penunjuk. Tidak seperti penukaran yang disebutkan di atas, adalah dilarang untuk menukar "penunjuk kepada penuding kepada bukan const" kepada "penunjuk kepada penuding kepada const."
Pertimbangkan coretan kod ini:
char *s1 = 0; const char *s2 = s1; // OK... char *a[MAX]; // aka char ** const char **ps = a; // error!
Mengapa adakah penugasan a to ps haram? Jawapannya terletak pada standard:
const char c = 'c'; char* pc; const char** pcc = &pc; // not allowed *pcc = &c; *pc = 'C'; // would allow to modify a const object
Dalam contoh ini:
Jika penukaran ini dibenarkan, ia akan membolehkan pengubahsuaian pada objek tetap. Sebagai contoh, *pcc akan menunjuk kepada aksara const, tetapi *pc akan boleh diubah suai. Ini melanggar premis ketepatan const, kerana ia berpotensi membenarkan perubahan kepada data malar.
Oleh itu, sekatan untuk menukar penuding kepada penuding kepada bukan const kepada penuding kepada penuding kepada const berpunca daripada keperluan untuk mengekalkan integriti objek malar dan mengelakkan pengubahsuaian data yang tidak diingini.
Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Menukar Penunjuk-ke-Penunjuk kepada Bukan-Const kepada Penunjuk-ke-Penunjuk kepada Const dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!