二维数组名与二级指针有什么区别?

# include <stdio.h>
int main(void)
{
int a[2][3] = {1, 2, 3, 4, 5, 6};
int ** p = a;

printf(" %d\n", p[0]); // 输出 1
printf("%d\n", a[0]); // 以整数形式输出二维数组的地址 1638192

return 0;
}
为什么p[0]输出数组第一个元素的址,而a[0]输出了数组的首地址?

第1个回答  推荐于2016-01-20
实际上它们是没有任何关系的,那个赋值也不应该通过。以下的解答建立在一定程度的脑补上,实际上这段代码问题相当多。
a的内存布局如下:
-------------------------
| 1 | 2 | 3 | 4 | 5 | 6 |
-------------------------
p[0]结果是一个int*,它的大小凑巧和int相同。p[0]凑巧读到了a[0][0],所以输出1。
a[0]结果是一个int*,但是它是由int[3]退化而来,编译器实际上输出的是&a[0][0]。
换句话说,p假装指向的是一个数组而把那一段内存解释成指针(就像一个int数组一样)。本回答被提问者采纳
第2个回答  2018-04-23

网页链接 这个帖子很详细

相似回答