2010-05-27 80 views
2

请看看这个peice的代码: -dreferencing 2 d阵列

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

当我被编译和执行该程序我得到ARR和* ARR其是2 d数组的起始地址相同的值。 例如: - 1 3214506 3214506

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

+0

动态分配你的数组,你会看到正确的结果。 – Cam 2010-05-27 17:07:24

回答

5

* arr是长度为2的整型数组,因此它与arr共享相同的地址。他们都指向他们的阵列的开始,这是相同的位置。

0

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

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

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

+0

在答案中有一个更正,在声明多维数组时,初始维度不是必需的,并且需要保留所有维度。如果将a传递给函数,那么它的参数应该是int(* a)[3] [4]或int a [] [3] [4]。编译器需要知道在哪里打破1D数组的边界。它不关心行数。 – 2017-10-03 08:21:07