二维数组名与二级指针有什么区别?
#include<stdio.h>intmain(void){inta[2][3]={1,2,3,4,5,6};int**p=a;printf("%d\n",p[0]);...
# 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]输出了数组的首地址? 展开
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]输出了数组的首地址? 展开
展开全部
实际上它们是没有任何关系的,那个赋值也不应该通过。以下的解答建立在一定程度的脑补上,实际上这段代码问题相当多。
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数组一样)。
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数组一样)。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询