【问题标题】:Dereferencing a Two Dimensional Array In C在 C 中取消引用二维数组
【发布时间】:2018-09-25 10:57:16
【问题描述】:

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

谢谢:)

【问题讨论】:

  • 您无法使用%d 打印数组。如果你遍历arr 的元素,这应该可以工作。
  • (2) 因为数组的地址是第一个元素的地址。你的行是0, 1,你的列是0, 1, 2
  • 每个问题都。 1.arr的值在哪里? 2. 这甚至没有错,3. 未定义的行为?

标签: c arrays dimensional


【解决方案1】:

回答您的问题:

  1. 在表达式中使用,arr 的值是指向其第一个元素的指针。因为它是一个数组数组,所以指向它的第一个元素的指针是&amp;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");
}

【讨论】:

  • 1.假设 arr[0][0] 位于地址 1000。&arr[0] 是什么?地址是什么?
  • @MikeT 简单的答案是 1000。但这是一个误导性问题。
猜你喜欢
  • 1970-01-01
  • 2021-09-07
  • 2021-11-18
  • 2015-09-30
  • 2020-07-30
  • 2021-03-27
  • 1970-01-01
  • 2017-05-10
  • 2015-01-27
相关资源
最近更新 更多