Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Tatasusunan Berbilang Dimensi Mereput kepada Penunjuk Berbeza Daripada Tatasusunan Satu Dimensi?

Mengapa Tatasusunan Berbilang Dimensi Mereput kepada Penunjuk Berbeza Daripada Tatasusunan Satu Dimensi?

DDD
DDDasal
2024-10-26 08:24:03564semak imbas

 Why Do Multidimensional Arrays Decay to Pointers Differently Than Single-Dimensional Arrays?

Mengapa Susunan Pereputan menjadi Penunjuk Berbeza Bergantung pada Dimensi

Pengenalan

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.

Reput untuk Tatasusunan Satu Dimensi

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.

Reput untuk Tatasusunan Berbilang Dimensi

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.

Memahami Perbezaan

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.

Kesimpulan

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!

Kenyataan:
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