我在理解C.中的二维数组时遇到一些困难 我们来看看这个例子:
#include <stdio.h>
void foo(int arr[2][3]) {
printf("%d", *arr);
}
int main() {
int arr[2][3] = { {10, 20, 30},
{40, 50, 60}
};
foo(arr);
return 0;
}
我有几个问题:
谢谢:)
答案 0 :(得分:0)
回答你的问题:
在表达式中使用,arr
的值是指向其第一个元素的指针。由于它是一个数组数组,因此指向其第一个元素的指针是&arr[0]
。该值有一个不寻常的类型,“指向3个整数的数组”。
由于arr
不是arr[0][0]
的地址。
这是一个疯狂的情况,难以理解,难以解释。简而言之:由于arr
是指向数组的指针,*arr
是该数组。但是当你尝试将它传递给printf
时,编译器会转向并再次生成指向数组第一个元素的指针。我怀疑指针值不同,因为你的编译器和操作系统每次都将main
(因此arr
)放在堆栈的不同位置。 (然后还有一个额外的问题,因为我们讨论指针,它不一定能打印它们%d
,特别是如果你的机器有32位整数和64位指针。)
我给你的建议是不要担心为什么不正确的代码会打印更改值。相反,请只需正确打印数组,代码如下:
int i, j;
for(i = 0; i < 2; i++) {
for(j = 0; j < 3; j++)
printf("%d ", arr[i][j]);
printf("\n");
}