在C中取消引用二维数组

时间:2018-04-15 17:28:59

标签: c arrays dimensional

我在理解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. 每次运行它,我都会得到一个奇怪的数字。这个号码是什么意思?
  4. 谢谢:)

1 个答案:

答案 0 :(得分:0)

回答你的问题:

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

  2. 由于arr不是arr[0][0]的地址。

  3. 这是一个疯狂的情况,难以理解,难以解释。简而言之:由于arr是指向数组的指针,*arr是该数组。但是当你尝试将它传递给printf时,编译器会转向并再次生成指向数组第一个元素的指针。我怀疑指针值不同,因为你的编译器和操作系统每次都将main(因此arr)放在堆栈的不同位置。 (然后还有一个额外的问题,因为我们讨论指针,它不一定能打印它们%d,特别是如果你的机器有32位整数和64位指针。)

  4. 我给你的建议是不要担心为什么不正确的代码会打印更改值。相反,请只需正确打印数组,代码如下:

    int i, j;
    for(i = 0; i < 2; i++) {
        for(j = 0; j < 3; j++)
            printf("%d ", arr[i][j]);
        printf("\n");
    }