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

DDD
Lepaskan: 2024-10-26 08:24:03
asal
562 orang telah melayarinya

 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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!