为什么我不能取消引用二维数组?

时间:2014-10-13 07:52:37

标签: c arrays

我有以下代码:

void main()
{
  int a[3][4] = {{1,2,3,4},{11,12,13,14},{21,22,23,24}};   
  printf("%d\n",*a);
  system("pause");  
}

输出是数组第一个元素的地址。为什么?我希望这个地址被取消引用。

2 个答案:

答案 0 :(得分:3)

要获取您可能要取消引用两次的内容。第一个元素可以通过以下方式访问:

**a

*a[0]

答案 1 :(得分:1)

C中的多维数组是连续的。以下内容:

int a [4] [5];

由4个int [5]组成,在记忆中彼此相邻。

指针数组:

int * a [4];

是锯齿状的。每个指针都可以指向不同长度的单独数组(的第一个元素)。

a [i] [j]相当于((a + i)+ j)。参见C11标准,第6.5.2.1节:

下标运算符[]的定义是E1 [E2]与(*((E1)+(E2)))相同

因此,a [i] [j]相当于(*(a + i))[j],相当于((a + i)+ j)。

这种等价性的存在是因为在大多数情况下,数组类型的表达式会衰减到指向其第一个元素的指针(C11标准,6.3.2.1)。 a [i] [j]被解释如下:

a是一个数组数组,因此它衰减到指向[0]的指针,即第一个子数组。 a + i是指向a的第i个子数组的指针。 a [i]相当于*(a + i),取消引用指向a的第i个子数组的指针。由于这是数组类型的表达式,它衰减到指向[i] [0]的指针。 a [i] [j]相当于(a + i)+ j),取消引用指向a的第i个子数组的第j个元素的指针。

请注意,指向数组的指针与指向其第一个元素的指针不同。 a + i是指向数组的指针;它不是数组类型的表达式,它不会衰减,无论是指向指针还是指向任何其他类型的指针。

由于某种原因,在单维数组中打印* a将打印数组的第一个元素,而在多维数组中打印* a将打印一个随机数。为什么会这样?

输出是数组第一个元素的地址。为什么呢?

的printf( “%d \ n”,*一个);

* a将等同于打印数组第一个元素的[0]。