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
380 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!

sumber:php.cn
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