`
anna_zr
  • 浏览: 196090 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

指针和const限定符

阅读更多
原帖时间:2008年7月30日 http://blog.csdn.net/winglet/archive/2008/07/30/2740781.aspx

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

指针和const限定符之间存在着两种交互类型:指向const对象的指针和const指针。两种类型的含义相信都不难理解(下文马上介绍),但是在具体的应用环境下,相信还是会有很多初学者犯迷糊。尤其是面临找工作的初学者,如果不能弄清const和指针之间的一些细致的区别和联系,可能会给你的笔试或面试带来麻烦。

本文的所有基础知识均来源于《C++ Primer》中文版第四版,P110页,去读读吧:)

当const用于限定一个基础对象时,意义再清楚不过了,例如:

const double c_pi = 3.14; //double const c_pi = 3.14;

上面两句代码代表的意思是一样的,事实上,const在限定类型的时候,放在类型前和放在类型后都是没有问题的(后面的一个试验将进一步证明这一点)。

但是,当把指针加进来时,情况变得稍微复杂了一些。

1. 指向const对象的指针

const double *cptr;

以上cptr就是一个指向double类型const对象的指针。但是cptr本身并不是const的,则你可以使用改变cptr指针本身的值(做指针运算或将其指向另一个对象),但是不能用cptr去改变它所指向对象的值。再来看以下代码:

const double c_pi = 3.14; double pi = 3.14; double* ptr; const double* cptr;//节省篇幅,写为一行

则以下的做法:

a. ptr = &c_pi;     //error!

b. ptr = π

c. cptr = &c_pi;

d. cptr = π

以上的代码,a是不对的(编译出错),其他都是可行的。注意d,也就是说,允许将非const对象赋给指向const对象的指针。这样的话,就不能通过cptr来修改pi的值,但是,pi的值可以通过其他的渠道修改,也就是说,cptr所指向的对象只是说不可以通过cptr解引用以后修改,但是仍有可能通过其他的方式来修改(如果基础对象本身是非const的话)。

在实际的应用中,指向const对象的指针,常用于做函数的形参,确保传递给函数的实际对象不会因为形参而被修改。指向const对象指针的另一个用途是用来指向const对象(必须用 "指向const对象的指针" 来指向const对象)。

2. const指针

int num = 9;

int* const c_ptr = #

以上的代码定义了一个const指针,可以从右向左练作 "c_ptr是const指针,它指向int型对象"。const指针的意思与其他const对象一样,即指针本身的值不可修改,不能进行指针运算,不能让其再指向另外一个对象,甚至不能赋回同样的值(如:c_ptr = c_ptr; //error!)。但是指针本身指向的基础对象可以使用指针解引用后修改其值。

你或许已经全部理解了,好,我们再来看看以下的代码(不要犯迷糊哦,因为下面代码的目标就是要让你犯迷糊,但是,我的终极目标是让你不再迷糊,ohyeah! ):

        const int c_num = 5;

        int num = 6;

a.     int const *ptr_0;

b.     int const *ptr = &c_num;

c.     int const *ptr_1 = #

d.     int * const ptr_2;//-----------------------error!

e.     int * const ptr_3 = &c_num;//----------error!

f.     int * const ptr_4 = #

g.     ptr = ptr;

h.     *ptr = 7;//----------------------------------error!

i.     *ptr_1 = 7;//--------------------------------error!

j.     ptr_4 = ptr_4;//----------------------------error!

k.     *ptr_4 = 7;

上面的代码,其实主要在考察(int const*)和(int* const)到底是两个什么东西,int* const不用说,是const指针;int const*其实和const int *一样。一个很简单的记忆方法是从右往左来阅读定义。上面代码错误的原因依次为:

d错误的原因是const指针必须初始化;

e错误的原因是试图用const指针指向const对象,const对象必须用"指向const对象的指针"来指向,而不是const指针,这是要特别注意的!

h和i用于演示使用"指向const对象的指针"是无法改变基础对象值的,无论其所指向的对象是否是const;

j的错误在于试图改变const指针本身的值。

通过上面的说明,我想我们都应该能够区分以下的声明了:

int * const ptr;//-------error!

int const *ptr;

const int *ptr;

3. 指向const对象的const指针

如果把两者结合起来,就是指向const对象的const指针,意义也是将两者结合起来:既不能修改指针值,也不能通过该指针修改其所指向的对象。

const int c_num = 4;

int num = 5;

const int* const ptr = &c_num;

cosnt int* const ptr_1 = #

上面的代码都是对的,原因相信不用多解释了吧,呵呵。

4. 再加上typedef

如果把typedef加进来,问题又变得迷糊了。

typedef string *pstring;

cosnt pstring cstr;

cstr到底是(const string*)呢,还是(string *const)?答案是后者,如果此时你把typedef当作文本扩展,就极有可能弄错cstr的真正含义。再看如下代码:

string str;

typedef string* pstring;

a. const pstring cstr_1 = &str;

b. pstring const cstr_2 = &str;

c. string* const cstr_3 = &str;

上面a、b、c所声明的都是const指针,注意a和b也再次说明了const与类型的前后关系是不确定的,C++ Primer建议将const放在类型前面。

5. 总结

没什么说的,希望我们都不再迷糊,o(∩_∩)o...哈哈!ps:C++ Primer很好很强大!

另外参考:
http://www.99inf.net/SoftwareDev/VC/53240.htm
---------------------------------
华赛一面的一道题:
typedef char * pstr;
const char *p1 = "abc";
const pstr p2 = "abc";
p1++;
p2++;
问:有没有错,错在哪里?
答:p2++错, p2是常量指针。


分享到:
评论

相关推荐

    指针与const限定符的使用分析

    本篇文章对指针与const限定符的使用进行了分析介绍。需要的朋友参考下

    C++Primer视频(初级)下载地址

    第4章指针和const限定符 33.第4章C风格字符串 34.第4章创建动态数组 35.第4章新旧代码的兼容 36.第4章多维数 37.第5章算术操作符 38.第5章关系操作符和逻辑操作符 39.第5章位操作符 40.第5章赋值...

    非常经典的c++ primer视频教程6-10

    4.2.5 指针和const限定符 4.3 C风格字符串 4.3.1 创建动态数组 4.3.2 新旧代码的兼容 4.4 多维数组 第5章 表达式 5.1 算术操作符 5.2 关系操作符和逻辑操作符 5.3 位操作符 5.3.1 bitset对象或整型值的...

    C++ 中const总结

    const 限定符把一个对象转换成一个常量,如 const int bufSize=512; 申 明 bufSize 的时候,如果不将它初始化,那么编译器会报错:const object must be initialized if not extern。因为 bufSize 被 const 限定符...

    C++ 指针 及其实例

    指针的定义与运算 指针与数组的关系 字符串函数 指针与const限定符 传递指针参数 动态内存分配方法 函数指针

    C++ Primer第四版【中文高清扫描版】.pdf

    4.2.5 指针和const限定符 110 4.3 C风格字符串 113 4.3.1 创建动态数组 117 4.3.2 新旧代码的兼容 120 4.4 多维数组 122 小结 124 术语 125 第5章 表达式 127 5.1 算术操作符 129 5.2 关系操作符和逻辑操作符 131 ...

    C++Primer const限定符

    用关键字const对变量的类型加以限定,可以将变量定义成一个常量。因为const对象一旦创建后其值就不能再改变,所以const对象必须初始化 const int bufsize = 512; //bufsize被定义为一个常量,任何试图为bufsize赋值...

    C++ const用法及注意事项

     (一) const限定符(p49)  定义const对象时要初始化  除非特别说明,在全局作用域声明的const变量是定义该对象为文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问  通过制定const变量为...

    C++中const与指针、引用的分析

    C++中函数的参数相比C语言中的函数参数要复杂的多,其中主要的原因是C++中引入了引用以及const限定符。这两个对象的引入,使得C++中的函数参数变得异常的复杂多变,每一种类型都具有比较适合的使用范围。 本文详细...

    详解C++中const_cast与reinterpret_cast运算符的用法

    指向任何对象类型的指针或指向数据成员的指针可显式转换为完全相同的类型(const、volatile 和 __unaligned 限定符除外)。对于指针和引用,结果将引用原始对象。对于指向数据成员的指针,结果将引用与指向数据成员...

    Qt智能指针--QScopedPointer.pdf

    const 限制 C ++指针的const限定也可以⽤QScopedPointer表⽰: const QWidget *const p = new QWidget(); // 等同于: const QScopedPointer<const QWidget> p(new QWidget()); QWidget *const p = new QWidget(); /...

    浅析c++ 中const关键字

    const是一个C++语言的限定符,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性。另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。 define与...

    C++基础入门教程(八):函数指针

    主要介绍了C++基础入门教程(八):函数指针,本文讲解了函数原型和函数定义、const限定符与指针、函数的指针参数、为什么要使用指针参数等内容,需要的朋友可以参考下

    Linux C程序设计大全

    4.4.3 限定修饰符const 4.4.4 const关键字修饰指针——在指针定义之前 4.4.5 const关键字修饰指针——在指针定义之中 4.4.6 const关键字修饰指针——在指针定义之前和定义之中 4.4.7 使用const关键字的意义 第5章 ...

    C++ primer 第4版 原书+习题解答+源码 清晰pdf

     2.4 const限定符  2.5 引用  2.6 typedef名字  2.7 枚举  2.8 类类型  2.9 编写自己的头文件  小结  术语  第3章 标准库类型  3.1 命名空间的using声明  3.2 标准库string类型  3.3 标准库...

    C++Primer中文版(第4版).part4

     2.4 const限定符  2.5 引用  2.6 typedef名字  2.7 枚举  2.8 类类型  2.9 编写自己的头文件  小结  术语  第3章 标准库类型  3.1 命名空间的using声明  3.2 标准库string类型  3.3 标准库...

    宋劲彬的嵌入式C语言一站式编程

    4. 指针与const限定符 5. 指针与结构体 6. 指向指针的指针与指针数组 7. 指向数组的指针与多维数组 8. 函数类型和函数指针类型 9. 不完全类型和复杂声明 24. 函数接口 1. 本章的预备知识 1.1. strcpy与strncpy 1.2. ...

    C语言解析教程(原书第4版)(美) 凯利.pdf

    6.19 类型限定符const和volatile 6.20 总结 6.21 练习 第7章 位操作符和枚举类型 7.1 位操作符和表达式 7.1.1 按位求反 7.1.2 补码 7.1.3 位逻辑操作符 7.1.4 左移位和右移位操作符 7.2 掩码 7.3 软件工具:打印int...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

     2.4 const限定符 53  2.4.1 const的引用 54  2.4.2 指针和const 56  2.4.3 顶层const 57  2.4.4 constexpr和常量表达式 58  2.5 处理类型 60  2.5.1 类型别名 60  2.5.2 auto类型说明符 61  2.5.3 ...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

     2.4 const限定符 53  2.4.1 const的引用 54  2.4.2 指针和const 56  2.4.3 顶层const 57  2.4.4 constexpr和常量表达式 58  2.5 处理类型 60  2.5.1 类型别名 60  2.5.2 auto类型说明符 61  2.5.3 ...

Global site tag (gtag.js) - Google Analytics