Memahami Penunjuk Void: Perbezaan Antara C dan C
Penunjuk Void ialah aspek utama C dan C , tetapi terdapat perbezaan yang ketara dalam pengendalian mereka. Artikel ini meneroka perbezaan ini dan menerangkan sebab tingkah laku yang kelihatan bercanggah boleh berlaku.
Penukaran Tersirat dalam C
Dalam C, penukaran antara penuding kepada jenis tertentu (mis., int) dan penunjuk kosong (kosong) sentiasa tersirat. Ini bermakna pernyataan berikut adalah sah:
<code class="c">int* p = malloc(sizeof(int));</code>
Fungsi malloc mengembalikan kekosongan*, yang kemudiannya diberikan kepada penuding int*. Walau bagaimanapun, dalam C , penukaran tersirat sedemikian tidak dibenarkan.
Penghantaran Eksplisit dalam C
Dalam C , penukaran daripada penuding kepada penuding kosong masih tersirat, tetapi menukar daripada penuding kosong kepada jenis tertentu memerlukan lakonan yang jelas. Ini menerangkan sebab kod berikut disusun dalam kedua-dua C dan C :
<code class="c">void foo(void* vptr) { } int main() { int* p = (int*) malloc(sizeof(int)); foo(p); return 0; }</code>
Fungsi malloc mengembalikan kekosongan*, yang dihantar ke fungsi foo. Walaupun penuding int* diberikan kepada parameter void*, C membenarkan penukaran tersirat ini. Walau bagaimanapun, panggilan seterusnya kepada p memerlukan hantaran eksplisit kepada jenis int*.
Perspektif Standard
Menurut spesifikasi K&R2, sebarang penunjuk ke objek boleh selamat ditukar kepada batal* tanpa kehilangan maklumat. Tambahan pula, menukar kembali kepada jenis penunjuk asal memulihkan nilai asal. Dalam C , piawaian menentukan bahawa penukaran tersirat daripada mana-mana jenis penunjuk kepada batal* dibenarkan, tetapi hantaran eksplisit diperlukan untuk penukaran daripada batal* kepada mana-mana jenis lain.
Kesimpulan
Perbezaan utama antara pengendalian penuding void C dan C terletak pada keperluan untuk pemutus eksplisit apabila menukar daripada void* kepada jenis tertentu dalam C . Pendekatan yang lebih ketat ini membantu mencegah tingkah laku yang tidak ditentukan dan mengekalkan keselamatan jenis dalam kod C.
Atas ialah kandungan terperinci Penunjuk Void dalam C dan C : Mengapa Penukaran Tersirat Berbeza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!