-3

我在理解 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 回答 1

0

在回答您的问题时:

  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");
}
于 2018-04-15T17:34:30.517 回答