二维数组名和指针的关系

我了解到二维数组的名字就是一个行指针,即为指向行首地址的指针,也即为指向指针的指针。对于一维数组,可以有int*p=a[10];那对于二维数组,为什么int**p=a[1... 我了解到二维数组的名字就是一个行指针,即为指向行首地址的指针,也即为指向指针的指针。
对于一维数组,可以有 int *p=a[10];
那对于二维数组,为什么 int **p=a[10][10];是错误的?
上面两个代码写错了,一维数组的话 应该是 int a[10]; int *p=a;

对于二维,int a[10][10];
int **p=a;是错误的
展开
 我来答
baizhaoliangdu
2014-09-12 · TA获得超过184个赞
知道小有建树答主
回答量:333
采纳率:42%
帮助的人:130万
展开全部

应该这样写

int a[10][10];
int (*p)[10]=a;

p是行轮枣指和晌针,一行有10个唤桐锋元素

水晶果冻199106
2014-09-12
知道答主
回答量:7
采纳率:0%
帮助的人:3万
展开全部
int a[10]; int *p=a代表将a数组的地址传给指针p,而a[10][10]的a既不代表一历李行的地址也不能顷烂弯代表整个二维雀闷数组的地址,所以无法传给**p啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lvgangyumiao
2014-09-12 · TA获得超过155个赞
知道答主
回答量:38
采纳率:100%
帮助的人:32万
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
CodeBlove
推荐于2017-11-26 · TA获得超过3363个赞
知道小有建树答主
回答量:936
采纳率:79%
帮助的人:239万
展开全部
二维数组名即数组地址,指向首行地址,表面上看,行地址即一维数组指针,而数组名指向行就应该是指针的指针,但是必须注意指针也是有类型的,类型不同数据宽度也不同。
如果a[10][10],假设int **p=a; 那么要对行递增执行p++时,编译器如何知道列宽?因为int **是指指向一个 int *类型的指针,32位系统中int *的陆蚂宽度为4字节,即地址宽度是4字节,因此p将指向下一个元素(整数指针),也就是p递增了4字节,而不是10个int型数据的宽度,这就错位了。
所以a[10][10]的地址类型不是简单的指针的指针,而是行指针的指针,而行宽是由你定义的数组列数和元素类型所决定,int类型就是4*10=40个字节。这叫数据对齐。因此编译器在转换数组名时,会根据对齐要求而确定相应的指针类型,所以a的地址类早橘埋型应该是int (*)[10],而不是int **。
所以应该这样:int (*p)[10]=a;
其含义为,p是一个指向(含10个int类型元素的一维数组或行的)指伍空针,其实本质上任何指针都是4字节(32位系统),你完全可以将一种指针类型强制转为任何其他类型,那为什么还要区分指针类型,就是为了指针运算时实现数据对齐,准确定位。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式