Rumah > pembangunan bahagian belakang > C++ > Mengapakah `int[]` mereput menjadi `int*` tetapi bukan `int[][]`?

Mengapakah `int[]` mereput menjadi `int*` tetapi bukan `int[][]`?

Mary-Kate Olsen
Lepaskan: 2024-10-28 15:38:02
asal
724 orang telah melayarinya

Why does `int[]` decay into `int*` but not `int[][]`?

Mengapa int[] Mereput menjadi int* tetapi Bukan int[][]?

Dalam C , tatasusunan mempamerkan peraturan pereputan unik yang berbeza berdasarkan dimensi dan kehadiran penunjuk. Fenomena ini boleh diperhatikan apabila membandingkan kelakuan tatasusunan satu dimensi (int[]) dan tatasusunan dua dimensi (int[][]) apabila melibatkan pereputan.

Tasusunan Satu Dimensi : int*[] mereput menjadi int

Apabila tatasusunan satu dimensi, seperti int[], tertakluk kepada pereputan, ia berkelakuan seperti penunjuk kepada elemen pertama. Ini jelas dalam kod berikut:

<code class="cpp">std::is_same<int*, std::decay<int[]>::type>::value; // true</code>
Salin selepas log masuk

Kod ini kembali benar kerana pereputan int[] menghasilkan int*, menunjukkan bahawa ia berkelakuan seperti penuding kepada integer.

Susun Dua Dimensi: int[][1] tidak mereput menjadi int

Berbeza dengan tatasusunan satu dimensi, tatasusunan dua dimensi (int[][]) tidak mereput menjadi penunjuk kepada penunjuk (int**). Sebaliknya, mereka mengekalkan sifat array mereka. Ini ditunjukkan dalam kod berikut:

<code class="cpp">std::is_same<int**, std::decay<int[][1]>::type>::value; // false</code>
Salin selepas log masuk

Kod ini dinilai palsu, menunjukkan bahawa pereputan int[][1] tidak menghasilkan int**.

Peranan Penunjuk dalam Pereputan Array

Perbezaan utama antara kedua-dua kes ini terletak pada penglibatan penunjuk. Apabila tatasusunan satu dimensi diisytiharkan dengan jenis penuding, seperti int[], ia secara berkesan menjadi penuding kepada tatasusunan. Ini menerangkan sebab ia mereput menjadi int*, iaitu penunjuk kepada penuding.

<code class="cpp">std::is_same<int**, std::decay<int*[]>::type>::value; // true</code>
Salin selepas log masuk

Penaakulan: Mengapa Tidak int[][]?

Sebab tatasusunan dua dimensi tidak mereput menjadi penunjuk kepada penunjuk adalah kerana ia akan membawa kepada kesukaran dalam melaksanakan aritmetik penunjuk. Dalam tatasusunan dua dimensi, setiap elemen disimpan pada offset tertentu dalam blok memori bersebelahan. Untuk mengakses elemen, pengkompil perlu mengetahui saiz kedua-dua dimensi. Jika ia mereput menjadi int**, ia akan kehilangan maklumat penting ini dan menjadikan aritmetik penunjuk menjadi mustahil.

Atas ialah kandungan terperinci Mengapakah `int[]` mereput menjadi `int*` tetapi bukan `int[][]`?. 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