熟悉C++也已经有一些年头了,今天突然翻出当年浏览的书籍,对一些概念居然生疏了,指针常量和常量指针由于 指针 这一特殊的对象而变得难以区别。
因此,在思考再三之后,决定写下该篇总结,加强对他们的区别:

转载请注明出处: http://blog.csdn.net/elfprincexu

1. 常量指针 (const __type__ *)


常量指针,通常形式是const位于*左侧,C++primer定义为底层const指针,我们可以这样理解,常量指针以为“常量的指针”,形容词为常量,指针为名词。也就是说它的本质还是一个指针,只不过多了一个“常量的”修饰词。 表示该指针指向一个常量。

  1. const int * p ;  // 常量整形指针,表面该指针指向一个整形常量。
  2. int a =5;
  3. const int *p = &a ;  // 合法,表面p指针指向一个为5的整形常量a; 常量指针可以指向非常量
  4. *p = 6; // 错误,既然为常量的指针,不能通过该指针修改它所指向的常量值
  5. a = 6; // 合法,可以通过原来的申明修改

我们常用的字符比较函数 strcmp就是一个很好的例子:

  1. int strcmp (const char* lhs, const char* rhs);

表明该指针不能修改所指向的常量(理所当然,我们只需要读操作,不应该改变所指向的对象的值,设置常量指针保证了在函数内部,不能通过该指针去改变他所指向的对象的值,对保护原对象至关重要,我想之所有常量指针的出现,很大一部分用处在于此番考虑吧。

  1. const int * p2; // 合法,可以定义时不初始化,
  2. int b = 8;
  3. p2 = &b ; // 合法,常量指针可以变换指针所指向的地址,这一点和”指向常量“没有冲突,所以

总结: const 的位置在 * 左侧 (C++ primer 定义为底层const*), const 表示常量,该表达式表面常量指针,表面指针指向的对象是常量 !

2. 指针常量 (__type__ * const )


const位于*右侧(C++Primer 定义为顶层const*), 指针常量, 可以理解为 “指针的” 类型常量, 本质是 一个常量, 和我们通常说的整形常量类似, 本质是一个常量。所以常量在定义的时候必须初始化。

  1. const int a;   // 非法,常量必须初始化
  2. const int b = 5; // 合法,b为5的常量
  3. int * const p = &b; // 合法,必须给常量初始化,他的值是a的地址,指针常量,说明该常量是指针(地址)
  4. *p = 10;    // 合法,虽然指针常量是个常量,它一旦初始化(地址给定)就不在改变,但没有限制它所指向的对象的值得改变(改变对象的值依然指向该对象,指针值(地址)没变)。

总结: 指针常量,本质是个常量,const位于* 的右侧,必须定义时给出初始化(地址),初始化之后不可改变(指针常量,指针当然不能变),但是可以改变指针所指向的对象的值。

3. 指向常量的指针常量 (const __type__ * const)


这个不容易搞错,反正,两个都有,两个性质也都有,必须定义时初始化,并且不能改变指针所指向的对象的值。

  1. const int a = 8;
  2. int b = 10;
  3. const int* const p =&a;     //合法, 第一个const 表面是常量指针,指向常量,第二个const表明是指针常量,必须初始化
  4. *p = 10; // 非法,常量指针不允许改变指针所指向的值
  5. p = &b;    // 非法,指针常量不允许在改变p的值(既然指向了a对象,不能再改变)

总结: 两个const 都有的情况下,不易混淆。

const(*号)左边放,我是常量指针,指向常量,可以变向;

const(*号)右边放,我是指针常量,指向变量,不可变向;

const(*号)两边放,我是常量指针常量,指向常量,不可变向;

【转】C++易混知识点1: 指针常量和常量指针的区别,附有详细案例解释的更多相关文章

  1. 【转】 C++易混知识点2. 函数指针和指针函数的区别

    我们时常在C++开发中用到指针,指针的好处是开销很小,可以很方便的用来实现想要的功能,当然,这里也要涉及到指针的一些基本概念.指针不是基本数据类型,我们可以理解他为一种特殊类型的对象,他占据一定空间, ...

  2. 【转】 C++易混知识点4: 自己编写一个智能指针(Reference Counting)学习auto_ptr和reference counting

    这篇文章建大的介绍了如何编写一个智能指针. 介绍: 什么是智能指针?答案想必大家都知道,智能指针的目的就是更好的管理好内存和动态分配的资源,智能指针是一个智能的指针,顾名思义,他可以帮助我们管理内存. ...

  3. 【转】C++易混知识点3. New Operator, Operator New, Placement New 实例分析,比较区别

    我们知道,C++中引入了New 这个内置符号,很大方便了指针的使用,程序员不必关注与这块堆上新分配的内存是如何来的,如何初始化的,然后如何转换为我们想要的类型指针的.现在,我们重点来分析下这个NEW内 ...

  4. 【转】C++易混知识点5:实例讲解Public Protected Private作用域,继承的区别和用意

    大学生涯,涉及到类的作用域,继承都是用的public 共有继承,当时也没想那么多,觉得共有继承多方便,多简单,反正没有太多的限制,不管是类的成员或者是基类的成员函数都可以访问.没有深究.其实这里面真是 ...

  5. C语言之数组与指针的易混淆知识点

    一.指针与数组 指针:指针本身也是一个变量,它的内容是指向的内容的地址.指针同样有类型的区分,char 的指针只能指向char型数据,int 指针指向int型数据.但是指针所占内存单元的大小(即其内容 ...

  6. C语言基础知识点整理(函数/变量/常量/指针/数组/结构体)

    函数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...

  7. 【C++】初次学习C++指针时的一些易混或疑惑的地方

    C++中的指针是一个比较复杂的知识概念,最近我有在学习这一方面的知识,就借此文章记录一下在学习时容易产生的混淆.本人初次发技术类的分享,可能会有纰漏,欢迎诸位指正^_^! 1.*在两种语境下的含义 先 ...

  8. JavaScript易错知识点整理

    前言 本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,闭包问题及对象拷贝与赋值这6个方面进行由浅入深的介绍和讲解,其中也涉及了一 ...

  9. JavaScript 易错知识点整理

    本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,闭包问题及对象拷贝与赋值这6个方面进行由浅入深的介绍和讲解,其中也涉及了一些ES ...

随机推荐

  1. 从Unity中的Attribute到AOP(四)

    本篇我们将逐一讲解Unity中经常使用的Attribute(Unity对应的文档版本为2018.1b). 首先是Serializable,SerializeField以及NonSerialized,H ...

  2. python 最基本的的单例模型的实现及应用

    在我们python开发过程很多 ,在很多地方都会用到单例模式,确保数据的唯一性,最简单的单例模式,我们可以模块导入的方式实现,因为导入文件,无论import多少次  都只导入一次模块. 方法一:装饰器 ...

  3. $(document).ready()和window.onload之间的差异

    最近使用$(document).ready(function(){})遇到一个问题:加载页面后发送数据请求后台,得到的数据不对,后发现请求后台时,发送的数据为空,没有获取到值导致的.------改成w ...

  4. 【测试编码URI的函数】

    //测试编码URI的函数 var url="http://www.phpfamily.org/test.php?search= this is a test&sum=1+2" ...

  5. UVA 1030 - Image Is Everything【模拟+思维+迭代更新】

    题目链接:uva 1030 - Image Is Everything 题目大意:有一个最大为n*n*n的立方体的一个不规整立体,由若干个1*1*1的小正方体构成(每一个小正方体被涂成不同的颜色),给 ...

  6. hdu_1014(竟然真的还有更水的)

    注意输出就没了... #include<cstdio> #include<cstring> using namespace std; int gcd(int a, int b) ...

  7. POJ_2769同余问题

    Reduced ID Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9310   Accepted: 374 ...

  8. 关于WPF添加右击ContextMeun,以及获取所绑定控件的源

    今天在公司给公司做一个门禁软件,其中有一个添加员工的功能,功能已经做好,但是页面的右边是一个treeView控件,于是我想到再添加员工后,可以在treeview上的部门的TreeViewWithIco ...

  9. msf

    show exploit show payload msf使用数据库加快搜索,不然每次都等半天 service postgresql startmsfdb reinitmsf > db_rebu ...

  10. 利用nginx 虚拟主机、请求转发实现不同端口web访问

    一个服务器上挂一个网站实在是有点浪费:一个服务器上可以放多个网站:可以开启nginx的虚拟主机功能:利用访问的路径或者域名不同访问不同的文件夹:例如: 1.一台服务器上放多个网站使用nginx的配置文 ...