Rumah >pembangunan bahagian belakang >C++ >Mengapa Tatasusunan Berbilang Dimensi Mereput kepada Penunjuk Berbeza Daripada Tatasusunan Satu Dimensi?
Apabila bekerja dengan tatasusunan dan penunjuk, adalah penting untuk memahami cara pereputan jenis berlaku . Walaupun anda mungkin menjangka tatasusunan dua dimensi akan mereput menjadi penunjuk berganda, ini tidak selalu berlaku. Mari kita selidiki mengapa ini berlaku dan terokai perbezaan dalam tingkah laku.
Seperti yang ditunjukkan oleh kes ujian, tatasusunan satu dimensi sememangnya mereput menjadi penunjuk tunggal:
<code class="cpp">std::is_same<int*, std::decay<int[]>::type>::value; // true</code>
Ini kerana aritmetik penuding boleh dilakukan dengan penuding tunggal.
Walau bagaimanapun, tatasusunan dua dimensi tidak mereput menjadi penunjuk berganda :
<code class="cpp">std::is_same<int**, std::decay<int[][1]>::type>::value; // false</code>
Sebabnya ialah penunjuk berganda memerlukan maklumat tambahan tentang dimensi tatasusunan. Sebagai contoh, dalam kes int[5][4], pengkompil mengetahui bahawa setiap tatasusunan "dalaman" mempunyai panjang 4. Menghantar ke int (*)[4] mengekalkan maklumat ini, menjadikan aritmetik penuding mungkin.
Walau bagaimanapun, menghantar ke int ** kehilangan maklumat dimensi ini. Ia hanya menjadi penuding kepada penuding, yang tidak mencukupi untuk melaksanakan aritmetik penuding yang bermakna.
Pertimbangkan perkara berikut:
<code class="cpp">char *tmp = (char *)p // Work in units of bytes (char) + i * sizeof(int[4]) // Offset for outer dimension (int[4] is a type) + j * sizeof(int); // Offset for inner dimension int a = *(int *)tmp; // Back to the contained type, and dereference</code>
Kod ini melakukan akses tatasusunan secara manual, menunjukkan bahawa pengkompil bergantung pada maklumat dimensi. int** tidak memberikan maklumat ini, menjadikannya tidak sesuai untuk aritmetik penuding.
Semasa tatasusunan satu dimensi mereput menjadi penunjuk tunggal, tatasusunan berbilang dimensi tidak mereput menjadi penunjuk berganda kerana mereka kekurangan maklumat dimensi yang diperlukan. Tingkah laku ini memastikan bahawa aritmetik penunjuk yang bermakna kekal mungkin dengan penunjuk dimensi tunggal.
Atas ialah kandungan terperinci Mengapa Tatasusunan Berbilang Dimensi Mereput kepada Penunjuk Berbeza Daripada Tatasusunan Satu Dimensi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!