熟悉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. 分布式架构ActiveMQ的安装与使用(单节点)

    具体内容请参考样例代码和视频教程: http://www.roncoo.com/course/view/85d6008fe77c4199b0cdd2885eaeee53   IP:192.168.4. ...

  2. C#学习笔记-工厂模式

    题目:计算器 解析:工厂方法(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类. 定义运算类: class Operation { ; ; public doubl ...

  3. Coursera课程 Programming Languages 总结

    课程 Programming Languages, Part A Programming Languages, Part B Programming Languages, Part C CSE341: ...

  4. org.springframework.data.redis.serializer.SerializationException: Cannot serialize;

    前言 本文中提到的解决方案,源码地址在:perfect-ssm,希望可以帮你解决问题. 问题描述 在Spring与Redis整合过程中,出现了如下报错: org.springframework.dat ...

  5. Spring+SpringMVC+MyBatis+easyUI整合优化篇

    优化篇 Spring+SpringMVC+MyBatis+easyUI整合优化篇(一)System.out.print与Log Spring+SpringMVC+MyBatis+easyUI整合优化篇 ...

  6. SDWebImage 加载显示 WebP 与性能问题

    SDWebImage 加载显示 WebP 与性能问题 本文包含自定义下载操作 SDWebImageDownloaderOperation 与编码器 SDWebImageCoder.SDWebImage ...

  7. 树莓派搭建WEB服务器

    树莓派搭建WEB的教程网上有许多,但感觉每一篇都有一些问题,这次我将网上的教程汇总,并亲身实践,将注意的问题都写进去,方便新手学习! 目录:1,安装nginx+sqlite+php5打造轻量级服务器, ...

  8. CTF---隐写术入门第三题 打不开的文件

    打不开的文件分值:10 来源: 实验吧 难度:中 参与人数:2718人 Get Flag:1222人 答题人数:1276人 解题通过率:96% 咦!这个文件怎么打不开? 解题链接: http://ct ...

  9. noi 2016 游记

    先挖个坑..这回大概不会太监吧(大雾 day -2 下午起飞的飞机,晚上到了成都..把东西扔到旅馆后就组队外出觅食了... 街上人不多,逛了半天才发现一家卖本地小吃的小店. KPM:诶诶给我来碗酸辣粉 ...

  10. Codeforces Round #451 (Div. 2)-898A. Rounding 898B.Proper Nutrition 898C.Phone Numbers(大佬容器套容器) 898D.Alarm Clock(超时了,待补坑)(贪心的思想)

    A. Rounding time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...