在 C 中取消引用二维数组



我在理解 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;
}


我有几个问题:

  1. arr的价值是什么?是 arr[0][0] 的地址吗?
  2. 如果arr是 arr[0][0] 的地址,那么为什么是这样一行:
    printf("%d", *arr);
    不打印值 10?
  3. 每次运行它时,我都会得到一个奇怪的数字。 这个数字是什么意思?

谢谢:)

回答您的问题:

  1. 在表达式中使用时,arr的值是指向其第一个元素的指针。 由于它是一个数组数组,因此指向其第一个元素的指针是&arr[0]。 此值具有不寻常的类型,"指向 3 个整数数组的指针"。

  2. 因为arr不是arr[0][0]的地址。

  3. 这是一个疯狂的情况,难以理解,也难以解释。 简而言之:由于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");
}

可以这样做:

#include <stdio.h>
int main()
{
int arr[2][2] = {{2,3},{5,6}};
for (int i = 0; i < 2; i++) {
for (int j = 0;j < 2; j++) {
printf("%dn" , *(&arr[i][j]));
}
}
}

相关内容

  • 没有找到相关文章

最新更新