[英]Different ways about Passing 2D array of pointer to function C
今天在將2d數組傳遞給函數時遇到了一些問題,后來我找到了一些解決方案,例如A和B。我知道2d數組作為1d存儲在連續內存中。 因此,在我看來,實際上並沒有二維點,編譯器將這個連續數拆分成“二維”概念。
我的問題是:在C中我明確告訴編譯器該參數為'int **'之后,為什么它沒有通過'二維'點?
有人可能會指出“在C中您沒有告訴編譯器組長”,我認為它知道此信息,因為如果您嘗試將12個元素的普通內存重新解釋為arr [2] [6],將出現類似“ void printArr(int _arr [] [6],int _columns,int _rows)”。
有點困惑,請幫忙...
int arr[][3]={{1,2,3},{5,6,7},{9,10,11},{13,14,15}};
void printArr(int _arr[][3], int _columns, int _rows){ //----->A
void printArr(int (* _arr)[3], int _columns, int _rows){//---->B
void printArr(int** _arr, int _columns, int _rows){//--------->C
for(int r=0; r< _rows; r++){
for (int c=0; c<_columns; c++)
//printf("%4d,", _arr[r][c]);
printf("%4d,", *(*(_arr+r)+c));
}
}
int main(){
printArr(arr, columns, rows);
}
數組會衰減為指針,這意味着,如果您有一個數組int arr[x][y]
它可能會衰減為一個指向數組int (*arr)[y]
的指針。
因此, int ** arr
將是衰變的指針數組int *arr[x]
,這是與數組不兼容的類型。
int **是指向int的指針,而不是指向2維數組的指針。
樣式說明:請勿在標識符前使用下划線; 這些名稱是為實現保留的。
解決方案B
明確捕獲正在發生的事情; 在對printArr
的調用中, 表達式 arr
被隱式地從“ int的3元素數組的4元素數組”轉換為“ int的3元素數組的指針”。
但是,在函數參數聲明的上下文中,符號T a[]
與T *a
同義; 因此,解決方案A
與解決方案B
有效相同。
沒錯,編譯器保留了一塊連續的內存,因此知道您可以執行類似我的示例的操作。 它也適用於一維數組,即:printArr((int *)arr,1,10);
void printArr(int *_arr, int _columns, int _rows) {
for(int r = 0; r < _rows; r++) {
for (int c = 0; c < _columns; c++) {
printf("%4d,", _arr[r * _columns + c]);
}
}
}
int arr[][3]={{1,2,3},{5,6,7},{9,10,11},{13,14,15}};
printArr((int*)arr, 3, 4);
我認為您與C非常接近。這兩個更改是使用int *而不是int **參數化的,並且偏移量計算不正確。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.