| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3118 人关注过本帖
标题:const int **p2 是啥意思?
只看楼主 加入收藏
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
虐心!
其实就理解为定义了一个常量p,只是这个常量类型非凡。

能编个毛线衣吗?
2015-08-12 08:33
li362490567
Rank: 1
等 级:新手上路
帖 子:89
专家分:8
注 册:2015-7-9
收藏
得分:0 
回复 7楼 lonmaor
这个C解析程序怎么用?
2015-08-12 09:20
linjxwell
Rank: 2
等 级:论坛游民
帖 子:12
专家分:40
注 册:2013-3-14
收藏
得分:0 
const int **p2;
p2 的类型是 const int **, 所以是指针, 指向 const int *
*p2 的类型是 const int *, 所以是指针, 指向 const int
**p2 的类型是 const int

看一下 * 是如何消解的.
2015-08-12 09:58
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用wmf2014在2015-8-12 08:33:11的发言:

虐心!
其实就理解为定义了一个常量p,只是这个常量类型非凡。

是常量,但是是這個指針所指向的對象是常量,不是這個指針本身是常量。另外,這種修飾祗是編譯器用,並非該對象真的是不可修改的。

授人以渔,不授人以鱼。
2015-08-12 09:59
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 14楼 TonyDeng
嗯,pp既是常量,编译器就不会允许被赋值,而不是他指向的是常量,实际上常量pp也可以指向一个变量。用下述代码验证亦是如此,对pp赋值无法通过编译。
    int j,*p3;
    p3=&j;
    const int v=10;
    const int *p = &v;
    const int **pp = &p;
    const int **p4=&p;  //这个常量型多级指针可以指向一个变量,虽然不能赋值,但可以得到变化的所指向的值
    int *p1,i,**p2;
    p1=&i;
    p2=&p1; //此处对二级指针变量赋值合法
    pp=&p1; //此处对二级指针常量赋值不合法,注释掉后可通过编译
//编译错误提示为:f:\vc\aaa\aaa.cpp(10) : error C2440: '=' : cannot convert from 'int ** ' to 'const int ** '
//理论上内存中的任何数据都可以想到办法修改。

能编个毛线衣吗?
2015-08-12 11:39
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
放在常量儲存區的數據是不能改的。那還祗是內存,對機器來說,還有ROM,那也無法改。

授人以渔,不授人以鱼。
2015-08-12 11:46
实际应用
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:89
专家分:341
注 册:2015-5-30
收藏
得分:0 
这主要用于函数参数
所以,在函数里不能修改p2 指向的内容,
这个例子里就是函数内不能改 int[]的内容
2015-08-12 20:19
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
这与指针的两种声明方式有关,也可以说是语言本身留下不清晰之处造成的问题。经典的书之所以经典,是它考虑的周到,解答普遍的问题:《C++ Primer》第四版比较详细地讲述了指针的两种声明语法,也进行了讨论(在第五版中弱化了数组和指针的教学,反而省略了这部分)。写代码的,如果自己有意识,碰到这种情形,就会谨慎思考和选择如何写出不易造成误解的声明形式。

授人以渔,不授人以鱼。
2015-08-12 22:41
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
关于楼主的问题,const到底修饰哪个对象,其实书上也没有明确的答案,祗能自己写一个测试程序去摸索。换言之,我会回避这种指针,所以探讨这个问题的答案的驱动力不大,不会做这种事,有兴趣的自己做做看吧。

授人以渔,不授人以鱼。
2015-08-12 22:44
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
没系统地看过什么书,理论基础薄弱,其实我也经常觉得有些语法规则很拗口,转着转着就扯不清了,通常我会用代码测试。
经再次验证,我在15楼的说法有错误。
1:const int **pp不能指向一个指针变量,所以下述代码无法通过编译
int i,*p;
p=&i;
const int **pp=&p  //不能通过编译,会error c2440

2:const int *p按我的理解,是定义p为int指针类型常量,应该不能赋值,但下述代码可通过编译,p又可以赋值,有点蒙圈
int i=11;
const int v=15;
const int *p=&v;
p=&i;
printf("%d",*p);
//这个代码又通过编译了,p的指针值被改变,指向变量i,显示结果为11
不知是和缘故,还望tony版主释疑(编译环境还是vc6)

能编个毛线衣吗?
2015-08-12 23:02
快速回复:const int **p2 是啥意思?
数据加载中...
 
   



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

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