int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};中a[1]是不是常量,为什么

int**p,*q;q=&a[1],和p=&a[1]是错误的,q=a[1]正确,为什么... int **p ,*q;q=&a[1],和p=&a[1]是错误的,q=a[1]正确,为什么 展开
 我来答
风若远去何人留
推荐于2017-12-12 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450127
专业C/C++软件开发

向TA提问 私信TA
展开全部
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
这是一个3*3的二维数组. a[1]是a[1][0]的地址,即第二行首地址. 可以认为是常量指针.
类型相当于int *型.
q=a[1] 类型匹配. 可以赋值.
而&a[1] 并不是int **型, 而是一个数组指针, 类型为int (*)[3].
所以 int (*m)[3];
然后m=&a[1];
这样赋值才是正确的.
百度网友26ad406
2012-12-10 · TA获得超过1611个赞
知道大有可为答主
回答量:1506
采纳率:100%
帮助的人:1077万
展开全部
a[1]代表的是第一行元素的首地址或就是一个指针,本身就是一个地址,可以直接赋值给指针
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zyplsok
2012-12-10 · TA获得超过155个赞
知道答主
回答量:91
采纳率:0%
帮助的人:101万
展开全部
&a[1]的类型是 int(*)[3] 不是int**,所以p=&a[1]是不行的
这样就可以

int (*p)[3]; //p是个指向长度是3的一维int数组的指针
p=&a[1];

a[1]是个地址,他是个右值(严格来说是个常左值),把他看作常量也行
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
海涛026
2012-12-10
知道答主
回答量:10
采纳率:0%
帮助的人:4万
展开全部
a[1]是变量,因为你可以对这个量进行改变,比如a[1]={1,1,1};
第二个问题大概原因是 a 是一个const **
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
loboho
2012-12-10 · TA获得超过506个赞
知道小有建树答主
回答量:441
采纳率:100%
帮助的人:409万
展开全部
&a[1]是int(*)[3]常量,a[1]是int*常量,所以 q = a[1]正确,你可试试定义int (*p)[3]; 则p = &a[1]正确。int (*)[3]和int*区别是,前者地址单元长是3个int,后者是一个int,如下面代码:
int (*p)[3], q;
cout << int(q + 1) - int(q) << endl; // 输出结果为4,即1个int的长度
cout << int(p + 1) - int(p) << endl; // 输出结果为12,即3个int的长度
至于&a[]为啥是int(*)[],c标准就是这么规定,一维数组也一样,int a[1],则a是int*常量(所谓指针常量可理解为地址),&a是int(*)[1]常量。

加点分。
追问
常量不是不能取地址吗
追答
只有立即数这些编译后被硬编码的不能取,如常对象,const int a,常字符串这些有内存地址的都能取。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式