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