int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};中a[1]是不是常量,为什么
5个回答
展开全部
a[1]代表的是第一行元素的首地址或就是一个指针,本身就是一个地址,可以直接赋值给指针
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
&a[1]的类型是 int(*)[3] 不是int**,所以p=&a[1]是不行的
这样就可以
int (*p)[3]; //p是个指向长度是3的一维int数组的指针
p=&a[1];
a[1]是个地址,他是个右值(严格来说是个常左值),把他看作常量也行
这样就可以
int (*p)[3]; //p是个指向长度是3的一维int数组的指针
p=&a[1];
a[1]是个地址,他是个右值(严格来说是个常左值),把他看作常量也行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
a[1]是变量,因为你可以对这个量进行改变,比如a[1]={1,1,1};
第二个问题大概原因是 a 是一个const **
第二个问题大概原因是 a 是一个const **
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
&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]常量。
加点分。
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,常字符串这些有内存地址的都能取。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询