| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 475 人关注过本帖
标题:指针和typedef
只看楼主 加入收藏
liudw2
Rank: 4
等 级:业余侠客
帖 子:85
专家分:248
注 册:2011-7-31
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:9 
指针和typedef
如果typedef string* s1;

那么const s1 s2应该怎么读?

是等价于const string* s2,还是等价于string* const s2?
2012-07-28 16:29
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
我觉得等价于第一个
2012-07-28 16:43
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9008
专家分:53957
注 册:2011-1-18
收藏
得分:0 
我觉得等价于第二个
2012-07-28 16:44
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
对 那应该就是等价于第二个了
2012-07-28 16:46
liudw2
Rank: 4
等 级:业余侠客
帖 子:85
专家分:248
注 册:2011-7-31
收藏
得分:0 
回复 2楼 zklhp
C++ primer上说是第二个,还是const修饰的是s1的类型,是一个指针,所以s2是定义为指向string类型对象的const指针,这话说的我头晕啊。
2012-07-28 16:47
liudw2
Rank: 4
等 级:业余侠客
帖 子:85
专家分:248
注 册:2011-7-31
收藏
得分:0 
回复 3楼 rjsp
为什么是第二个呢?
2012-07-28 16:51
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:5 
const int i;
此时 i不可变


const int *i;
此时 *i 不可变 i可变


typedef int* pint;
const pint i;
此时 自然是i不可变 因为pint是个类型 符合第一种情况 则 必然不和一楼中的第一种理解相符 那只能是第二种了
2012-07-28 16:53
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
改天可以试验一下 好复杂的问题啊。。
2012-07-28 16:54
liudw2
Rank: 4
等 级:业余侠客
帖 子:85
专家分:248
注 册:2011-7-31
收藏
得分:0 
哦,我有点懂了,因为typedef修饰的是string*,所以要将const挪到s1后面去。
2012-07-28 17:06
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:5 
是第二个。
事实上:由于 const int * p 和 int *p 指向的内容的限定符不同(就认为是指向的类型不同),因此它们是不同类型的指针。
而 int * p 和 int * const p 指向的类型完全相同,只是后者多了一个 const 修饰符,因此一般认为它们是有不同的 cv-限定符(cv-qualifier)的相同类型的指针。术语 cv-限定符 是指 const 和 volatile。
const 关键字只能修饰一个标识符的 cv-限定,不能修改它的类型。

不知道这么理解是不是好一点:对于指针的声明 A * B identifier 中,A 是用来声明指针指向的类型的,它决定了指针的类型。B 是用来声明指针的 cv-限定的,与指针指向的类型无关。
一个类型 typedef 好之后,就不能用 const 来修饰它指向的类型了,只能修饰这个类型本身的属性。
就好像为了声明常成员函数,得写 int f() const, 它和 const int f() 完全不是一码事。

容易对 typedef 产生这类混淆的主要原因是因为它有的时候有点像宏,但是其实它并不是简单的替代。因此用 typedef 一般会避免很多混乱。


[ 本帖最后由 pangding 于 2012-7-28 17:19 编辑 ]
2012-07-28 17:14
快速回复:指针和typedef
数据加载中...
 
   



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

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