簡體   English   中英

關於將2D指針數組傳遞給函數C的不同方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM