int**p=new int*; int a[3][3]; *p=a[0];//正确 p=&(a[0]);//不正确 为什么&(a[0])不应该是地址的地址吗

*p=a[1];//对p=&(*p);//对p=&(a[1]);//不对为什么... *p=a[1];//对
p=&(*p);//对
p=&(a[1]);//不对
为什么
展开
 我来答
庄政警
2017-10-27 · TA获得超过9916个赞
知道大有可为答主
回答量:1113
采纳率:94%
帮助的人:888万
展开全部


c语言里,二维数组和二级指针完全是两回事

c语言里二维数组是由一维数组所组成的一维数组

int a[3][3];   

//a的元素是int[3] ,这里int[3]是一种数据类型(有3个int元素的数组),也就是说a[0]的类型就是int[3],那么a[0]的地址&a[0]的类型自然就是int(*)[3]了

p的类型是int**,&a[0]的类型是int(*)[3]; 而不是int**;所以p=&a[0];自然就是不合法的了

*p=a[1]; //正确,a[1]的值是&a[1][0],类型是int* ,*p的类型是int* , ok


p=&(*p); // 正确,*p的类型是int* ,&(*p)的类型是int**   ,ok 


p=&(a[1]); //错误,&(a[1])的类型是int(*)[3]; p的类型是int**,不行

ps: 因为p是new出来的,所以在做p=.....这类操作前一定要释放内存或者用另一个指针保留现场,不然会有内存泄漏

对一个一维数组名做取地址操作得到的值不是一个二级指针,而是一个指向一维数组的一级指针

int arr[3]; 

arr类型是int*,但&arr不是int**,而是int(*)[3];

你把一维数组看作是一种数据类型,就没这个问题了,c语言恰好提供了typedef这个东西:

typedef int ta[3];  //把由3个int组成的数组看成一种新类型ta; 

那么int a[3][3]就可以写作 

ta a[3];  //由3个ta类型组成的一维数组

那么&a[1]的类型就是ta*,指向ta类型的指针,ta是个什么玩意,ta是由3个int组成的数组,就是int[3],而不是int*


可以说弄清楚指针,c语言就入门了

地瓜说机
2013-05-30 · TA获得超过2.9万个赞
知道大有可为答主
回答量:2.3万
采纳率:91%
帮助的人:1.2亿
展开全部
a[0]表示的是一个值 而a表示的是数组的首地址 也就是你所说的p

&(a[0])这个错误是在于括号 加个括号表示是一个值 哪里来的地址一说 如果你把括号去掉 这样就可以了
更多追问追答
追问
去掉括号也不对,报的错是
error C2440: '=' : cannot convert from 'int (*)[3]' to 'int ** '
追答
是这样的 讨论了一下 你a(0) a(1)  这些都是常量  你不能取地址的
你可以写*p=a 但不能这样写
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式