将指针的2D数组传递给函数C的不同方法

时间:2010-12-14 14:35:37

标签: c arrays function pointers 2d

我今天将2d数组传递给函数时遇到了一些问题,后来我发现了一些像A和B这样的解决方案。 我知道2d阵列作为1d存储在连续存储器中。所以在我看来,实际上没有2维点,编译器将这些连续数字分开,并制作了“二维”概念。

我的问题是:在C中我明确告诉编译器参数是'int **'后,为什么它没有传递'2维'点?

有人可能会指出“在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);
}

4 个答案:

答案 0 :(得分:2)

数组衰减为指针,这意味着如果你有一个数组数组int arr[x][y],它就会衰变为指向数组int (*arr)[y]的指针。

因此,

int ** arr将是一个衰减的指针数组int *arr[x]的版本,它与您的数组是不兼容的类型。

答案 1 :(得分:0)

int **是指向int的指针,而不是指向2-dim数组的指针。

答案 2 :(得分:0)

样式注释:不要在标识符中使用前导下划线;这些名称是为实施保留的。

解决方案B明确捕获正在发生的事情;在调用printArr时,表达式 arr被隐式转换为“3元素数组的int的4元素数组”转换为“指向3元素数组的指针” INT”。

但是,在函数参数声明的上下文中,符号T a[]T *a同义;因此,解决方案A实际上与解决方案B相同。

答案 3 :(得分:-1)

你是对的,编译器保留一个连续的内存块,所以知道你可以做我的例子。它也适用于1d数组,即: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 **进行参数化,你的偏移计算是不正确的。