Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Pereputan Array Berbeza untuk int[] dan int[][] dalam C ?

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

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-26 04:15:02571semak imbas

 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>

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!

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