Mengapa Pereputan Array Berbeza untuk int[] dan int[][] dalam C ?

Mary-Kate Olsen
Lepaskan: 2024-10-26 04:15:02
asal
571 orang telah melayarinya

 Why Does Array Decay Differ for int[] and int[][] in C  ?

Jenis Pereputan dalam Tatasusunan: int* lwn. int[][]

Dalam C , tatasusunan mereput menjadi penunjuk dalam konteks tertentu, seperti seperti apabila menghantarnya ke fungsi atau memberikannya kepada penunjuk. Walau bagaimanapun, tingkah laku pereputan ini boleh berbeza-beza bergantung pada dimensi tatasusunan.

Pertimbangkan kod berikut:

<code class="cpp">std::is_same<int*, std::decay<int[]>::type>::value; // true
std::is_same<int**, std::decay<int[][1]>::type>::value; // false</code>
Salin selepas log masuk

Baris pertama berjaya menyusun, mengesahkan bahawa tatasusunan int[] mereput ke dalam penunjuk int. Walau bagaimanapun, baris kedua gagal, menunjukkan bahawa tatasusunan dua dimensi int[][1] tidak mereput menjadi penunjuk int*.

Punca percanggahan ini terletak pada sifat aritmetik penuding . Dalam tatasusunan satu dimensi seperti int[], setiap elemen disimpan berturut-turut dalam ingatan. Ini membolehkan penunjuk kepada tatasusunan ditambah atau dikurangkan untuk mengakses elemen bersebelahan. Walau bagaimanapun, dalam tatasusunan dua dimensi seperti int[][1], setiap elemen disimpan sebagai penunjuk kepada subarray int. Jika int** menunjuk kepada tatasusunan dua dimensi ini, ia tidak akan dapat melaksanakan aritmetik penuding yang bermakna kerana ia tidak akan mengetahui saiz setiap subarray.

Sebaliknya, untuk mengekalkan hubungan antara dimensi bagi tatasusunan apabila ia mereput, C mereput tatasusunan dua dimensi menjadi penuding kepada tatasusunan penunjuk. Dalam erti kata lain, int[][1] mereput menjadi int (*[])[1].

Tingkah laku ini digunakan pada tatasusunan mana-mana dimensi, termasuk tatasusunan bercampur dengan penunjuk dan bukan penuding. Contohnya, int[] mereput menjadi int tetapi bukan int[][], manakala int[] mereput menjadi int.

Memahami mekanisme pereputan jenis ini adalah penting apabila bekerja dengan tatasusunan dalam C untuk memastikan keserasian antara jenis tatasusunan dan jenis penuding.

Atas ialah kandungan terperinci Mengapa Pereputan Array Berbeza untuk int[] dan int[][] dalam C ?. 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
Artikel terbaru oleh pengarang
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!