| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2526 人关注过本帖
标题:请教诸神~ const用在二维数组上为什么会出现这种情况?
只看楼主 加入收藏
xiaomarn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:348
专家分:2026
注 册:2009-3-18
收藏
得分:0 
本来打了好多的,但越打发觉越解释不清,就不拿出来丢人了,全删了
这个问题在<<c专家编程>>那本书中早解释过了
2010-11-17 14:44
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
你在display函数中声明的形参变量的类型为指向类型为const int的指针,而传递给函数的实参为指向int型的指针,
故编译器在检查类型时发现类型不匹配(多了个限定符const),发出警告。
一般来讲,将一个int型(右值)指针赋值给一个const int型(左值,const 修饰int,而不是指针)时,由于左值具有比右值更多的限定符(在这是const),c语法是允许的,
一些编译器也不会发出警告,不知你的是什么编译器?
//
c 专家编程解释的根本不着边,/

我就是真命天子,顺我者生,逆我者死!
2010-11-17 15:13
xiaomarn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:348
专家分:2026
注 册:2009-3-18
收藏
得分:0 
二维数组名其实是一个指向指针的指针
故,int array[][]在参数传递时是于int** array等价的。
对于指针赋值:
"两个操作数都是指向有限定符或无限定符的相容类型的指针,左边指针所指向的类型必须具有右边指针所指向类型的全部限定符"  //<<c专家编程>>
对于像const int *i,与int *j;i和j都是指向int型数据的指针,const修饰的是int型数据,而不是指针i
i和j都指向相容的类型int,但i具有限定符const
所以i=j成立,而j=i就不对了
对于const int **i,和int **j;i和j都是指针,都具有相同的限定符(无),i指向const int*的数据类型,而j指向int*的数据类型,i和j指向的数据类型根本不同,当然出错了。
2010-11-18 19:49
kkggkk
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2016-10-21
收藏
得分:0 
虽然是老贴了,但我要回一下,因为百度搜出来,我希望别人不被楼上一些解释所误导。

数组做为参数,本质是传递指针,为了方便查看,才特别使用数组形式。
extern void display(const int r[2][2]);
其实等效于:
extern void display(const int (*r)[2]);

楼主所遇到的问题,可以转化为如下问题:

程序代码:
int main(void) {
  const int (*r)[2];
  const int a[2][2];
        int b[2][2];

  r = 0, r = r;  // 这行代码只是为了消除提示 r 无用途的警告

  r = a;  // 正确
  r = b;  // GCC4 会警告

  return 0;
}

如上代码呈现了问题所在,当你用 GCC4 去编译时会警告,但你用 GCC5 去编译时是没有的,使用 VC 去编译也没有。
因为这是 GCC4 的小 Bug,它对于这种复杂的指针类型判断出了点岔子,因此才会提示类型不兼容。
如果你还在用 GCC4,那么除了升级 GCC 外,可以使用强制类型转换以避免这个警告。
r = (const int (*)[2])b;

2016-10-21 13:59
快速回复:请教诸神~ const用在二维数组上为什么会出现这种情况?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033565 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved