Reputan Jenis Tatasusunan dalam C
Dalam C , tatasusunan secara semula jadi akan mereput menjadi penunjuk apabila digunakan dalam konteks tertentu. Walau bagaimanapun, gelagat pereputan ini berbeza antara tatasusunan satu dimensi dan pelbagai dimensi.
Reput Tatasusunan Satu Dimensi: int[] kepada int*
Apabila tatasusunan satu dimensi digunakan dalam konteks yang memerlukan penunjuk, ia secara berkesan mereput menjadi penunjuk kepada elemen pertamanya. Contohnya, pertimbangkan kod berikut:
<code class="cpp">std::is_same<int*, std::decay<int[]>::type>::value; // true</code>
Ini kembali benar kerana pereputan jenis int[] menghasilkan jenis int*.
Reputan Tatasusunan Berbilang Dimensi: int [][1] to int
Sebaliknya, apabila tatasusunan berbilang dimensi digunakan dalam konteks yang sama, ia tidak mereput menjadi penuding kepada penuding. Sebaliknya, ia mereput menjadi penunjuk kepada elemen pertamanya, yang merupakan tatasusunan. Contohnya:
<code class="cpp">std::is_same<int**, std::decay<int[][1]>::type>::value; // false</code>
Ini mengembalikan palsu kerana pereputan jenis int[][1] menghasilkan jenis int*, bukan jenis int**.
Pereputan Tatasusunan Penunjuk: int*[] kepada int
Menariknya, apabila tatasusunan penuding dicipta, ia mereput menjadi penuding kepada penuding. Ini terbukti daripada kod berikut:
<code class="cpp">std::is_same<int**, std::decay<int*[]>::type>::value; // true</code>
Pemerhatian ini berlaku untuk mana-mana jenis dalam tatasusunan penunjuk, selagi dimensi terakhir ialah tatasusunan. Contohnya, int***[] mereput menjadi int*** (atau int****), iaitu penunjuk kepada penuding kepada penuding.
Sebab Perbezaan Pereputan
Punca percanggahan dalam tingkah laku pereputan ini terletak pada konsep aritmetik penunjuk. Tatasusunan satu dimensi secara semula jadi sejajar dengan gelagat penunjuk, membolehkan operasi aritmetik penunjuk yang cekap. Walau bagaimanapun, perkara yang sama tidak benar untuk tatasusunan berbilang dimensi, kerana setiap dimensi mewakili tahap arah yang berbeza. Percubaan aritmetik penuding pada tatasusunan berbilang dimensi yang mereput akan mengakibatkan akses memori tidak sah dan tingkah laku yang tidak dapat diramalkan.
Atas ialah kandungan terperinci Bagaimanakah pereputan tatasusunan satu dimensi dan pelbagai dimensi dalam C berbeza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!