Rumah >pembangunan bahagian belakang >C++ >Mengapa Pereputan Jenis Berbeza untuk Tatasusunan Satu Dimensi dan Berbilang Dimensi dalam C?
Jenis Pereputan dalam Tatasusunan Berbilang Dimensi
Dalam C , tatasusunan mengalami pereputan jenis menjadi penunjuk dalam konteks tertentu. Walau bagaimanapun, tingkah laku berbeza untuk tatasusunan satu dimensi dan tatasusunan berbilang dimensi. Mengapakah ini berlaku?
Turutan Satu Dimensi
Pertimbangkan kod berikut:
<code class="cpp">int[] arr = {1, 2, 3};</code>
Reput jenis menukar int[] kepada int *, membolehkan kami menulis:
<code class="cpp">std::is_same<int*, std::decay<int[]>::type>::value; // true</code>
Ini kerana int[] secara berkesan mereput menjadi penunjuk kepada elemen pertama tatasusunan.
Tasusunan Berbilang Dimensi
Walau bagaimanapun, tingkah laku ini tidak meluas kepada tatasusunan berbilang dimensi. Pertimbangkan:
<code class="cpp">int[][1] arr2 = {{1}, {2}, {3}};</code>
Reput jenis tidak menukar int[][1] kepada int**. Sebaliknya, ia kekal int[][1], iaitu penunjuk kepada tatasusunan saiz 1. Ini kerana melaksanakan aritmetik penuding pada tatasusunan berbilang dimensi adalah tidak praktikal kerana reka letak memorinya yang tidak bersempadan.
Penunjuk kepada Tatasusunan
Untuk mendapatkan jenis penuding yang diingini untuk tatasusunan berbilang dimensi, kita perlu mencipta penunjuk kepada tatasusunan. Pertimbangkan:
<code class="cpp">int*[] arr3 = {arr, arr2};</code>
Ini mereput menjadi:
<code class="cpp">int**</code>
Ini kerana int*[] mereput menjadi int**, kerana dimensi pertama ialah penunjuk dan dimensi kedua ialah tatasusunan.
Implikasi
Memahami gelagat ini adalah penting untuk menghantar tatasusunan berbilang dimensi sebagai hujah fungsi. Fungsi yang menjangkakan penuding kepada penuding tidak boleh menerima tatasusunan berbilang dimensi itu sendiri, tetapi mereka boleh menerima penuding kepada tatasusunan, yang mereput menjadi penunjuk kepada penuding semasa lulus parameter. Perbezaan halus ini memastikan aritmetik penunjuk adalah konsisten dan menghalang ralat akses memori.
Atas ialah kandungan terperinci Mengapa Pereputan Jenis Berbeza untuk Tatasusunan Satu Dimensi dan Berbilang Dimensi dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!