【问题标题】:dreferencing 2 d array引用二维数组
【发布时间】:2010-05-27 17:06:04
【问题描述】:

请看这段代码:-

#include<stdio.h>
int main()
{
int arr[2][2]={1,2,3,4};
printf("%d %u %u",**arr,*arr,arr);
return 0;
}

当我编译并执行这个程序时,我得到了 arr 和 *arr 的相同值,它是二维数组的起始地址。 例如:- 1 3214506 3214506

我的问题是为什么取消引用 arr ( *arr ) 不会打印存储在 arr 中包含的地址的值?

【问题讨论】:

  • 动态分配你的数组,你会看到正确的结果。

标签: c arrays 2d


【解决方案1】:

*arr 是长度为 2 的整数类型数组,因此它与 arr 共享相同的地址。它们都指向它们数组的开头,也就是同一个位置。

【讨论】:

    【解决方案2】:

    在 C 中,二维数组在内存中不表示为数组数组;相反,它是一个常规的一维数组,其中需要第一个给定维度,以便在执行时计算数组内的正确偏移量。这就是为什么在多维数组中,您总是需要指定除最后一个维度之外的所有维度(这不是必需的);例如,如果您声明一个数组,如

    int a[2][3][4];
    

    该数组将在内存中表示为总共 2*3*4 个元素的单个数组。尝试访问位置 (i,j,k) 处的元素,实际上将被转换为访问普通数组中的元素 3*i+4*j+k。从某种意义上说,需要初始维度来知道将“换行符”放在一维数组中的什么位置。

    【讨论】:

    • 您的答案中有一个更正,在声明多维数组时,不需要初始维度,其余所有维度都是必需的。如果 a 被传递给一个函数,那么它的参数应该是 int (*a)[3][4] 或 int a[][3][4] 类型。编译器需要知道在哪里打破一维数组的界限。它不关心行数。
    猜你喜欢
    • 2020-07-30
    • 2012-04-10
    • 1970-01-01
    • 2021-06-04
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    相关资源
    最近更新 更多