csdn=>faq=>faq 展示 问题内容:const常量、指向常量的指针和常量指针 原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=5298032 所属论坛:c++ 语言     审核组:c/c++ 提问者:dragon_red     解决者:dragon_red 感谢:caocheng8230 关键字:c/c++ 变量 常量 指针 c++ 语言 指向 int 引用 const 两者 可行 称呼 答案:

1)先看const常量的情况:

const int a=2;
int const b=c; // c是已经声明过的整型
两者都可以。本地的const常量必须在第一次声明时就初始化,用变量或常量初始化都可以,只是初始化一次以后它的值就不能再改变了,此所谓const的含义。

2)接着看指向常量的指针:

const int *pa;
int const *pa;
两者也等价。因为指向常量的指针有时候会指向常量,所以它具有这个性质:“不能靠解引用改变它指向的对象的值”,以此保护它所指向的常量的常量性:
*pa =d; // 不可行(d是已经声明过的整型)

但指针本身的值是可变的:
pa=& d; // 可行(d是已经声明过的整型)

而且指向常量的指针有时候也会指向变量,如下:
int t,u;
const int *pa;
pa =&t; //可行,指向变量t
pa =&u; //也可行,指向变量u

我们可以把它理解成:“为了指向常量而发明的指针”,这样比较贴切。

3)然后看常量指针的情况:

int *const pa =&n; // n是之前已经声明过的整型变量,注意必须是变量,理由见下

 “常量指针”即指针本身的值是常量,但“能靠解引用改变它指向的对象的值”,如下:
pa=&d; // 不可行(d是已经声明过的整型)
*pa =d; // 可行(d是已经声明过的整型)

因为常量指针也是一种const常量,所以它同样必须在第一次声明时就初始化,不过它的初始值缩小为只能是变量(的地址),因为只有变量才能确保以后能靠解引用而改变它指向的对象的值。这使得常量指针不象一般的const常量,用变量或常量初始化都可以。
也就是说,常量指针反而总是指向变量的。

4)最后,是前面两者的结合:指向常量的常量指针
const int *const c=&e; //e是已经声明过的整型,整型常量或整型变量都可以

把它理解成一个普通的const常量,同时被剥夺了“靠解引用改变它指向的对象的值”的性质的就行。

5)关于记忆技巧:
对于区分const int *pa和int *const pa这两者,
前者中,const直接修饰*(不考虑int,因为类型在这里是没影响的),说明*(解引用)这种行为具有常量性,即“不能靠解引用改变它指向的对象的值”,即指向常量的指针。
后者中,const直接修饰pa,说明pa本身的值具有常量性,即常量指针。

或者也可以这样来记忆:
const int a;       // const常量
const int *a; //指向常量的指针
int *const a=&n; //常量指针
你在纸上按顺序写下以上三行,记住它们的注释长度:短——长——短,
分别对应着:const常量、指向常量的指针、常量指针这三种,应该就不会混淆了。

个人认为以上记忆法比《effective ++》条款21中推荐的划线分左右法更好记。

另1:也有教材反过来把上述第二者称呼为“常量指针”,第三者称呼为:“指针常量”,相对来说更容易让人混淆,大家还是只记住上面的那种称呼法就好。

另2:const和typedef在一起时容易让人陷入陷阱,具体见《typedef的用途和陷阱》。


---------------------------------------------------------------

mark

评价: 有价值 给朵鲜花(12) 无价值 扔个鸡蛋(1) 相关faq 大数据量的相同记录次数统计产生服从均匀分布的随机数const常量、指向常量的指针和常量指针为何c++中类的析构函数有时设计成virtual?移位操作符struct中可不可以有const的量呢?自己动手制作控制台定位函数c++内存布局--从一个修改私有变量的问题想到的写好c程序的10+大要点深度探索c++对象模型系列问题之二(2)typedef的四个用途和两个陷阱java puzzlers里面的一个谜题,大家都给个解释,进者有分求助:计算一个超长字符串中的子串个数如何知道一个类或者类中的方法被哪些类使用或者被哪些方法使用了呢?向sql server的存储过程传递字符型参数时,如果这个参数中含有一个单引号怎么办?一个关于java参数传递的问题org指令51中的data区中到底装的是什么!月份排行榜的数据显示.弱弱地问 keil c 地址空间溢出问题
posted on 2009-12-31 00:26  康的瑞  阅读(195)  评论(0编辑  收藏  举报