我有以下代码:
void main()
{
int a[3][4] = {{1,2,3,4},{11,12,13,14},{21,22,23,24}};
printf("%d\n",*a);
system("pause");
}
输出是数组第一个元素的地址。为什么?我希望这个地址被取消引用。
答案 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]。