我今天将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);
}
答案 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 **进行参数化,你的偏移计算是不正确的。