Rumah > pembangunan bahagian belakang > C++ > Penunjuk Void dalam C dan C : Mengapa Penukaran Tersirat Berbeza?

Penunjuk Void dalam C dan C : Mengapa Penukaran Tersirat Berbeza?

Barbara Streisand
Lepaskan: 2024-10-28 07:09:02
asal
440 orang telah melayarinya

  Void Pointers in C and C  : Why are Implicit Conversions Different?

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan