一,入门

const 指针

指针指向的内容不能变,指针可以改变指向

指向const的指针

指针不可以改变指向,指针指向内容可以变

#include "stdio.h"
int main()
{
//const 指针 (指针指向的内容不能变,指针可以改变指向)
int a = 5;   
int b = 6;   
const int *ptr = &a;   
*ptr = 8; //error   
ptr = &b; //ok;   
//指向const的指针 (指针不可以改变指向,指针指向内容可以变)
int a = 5;   
int b = 6;   
int * const ptr = &a;   
*ptr = 8; //ok   
ptr = &b; //error
}

二,深度解析

大致说来其可分为三种情况: const修饰指针,const修饰引用,const修饰指针的引用.
const修饰指针 
       const修饰指针本身
       const修饰指针所指的变量(或对象)
       const修饰指针本身和指针所指的变量(或对象)
       1)const修饰指针本身 
             这种情形下,指针本身为常量,p不可改变,任何修改指针本身的行为都是非法的.

例如:

const int a = 1;
const int b = 2;
int i = 3;
int j = 4;
int* const pi = &i; //ok, pi的类型为int* const , &i的类型为int* const
int* const pi = &a; //error, pi的类型为int* const, &a的类型为const int* const
pi = &j; //error, 指针是常量,不可变
*pi = a; //ok, *pi并没有限定是常量 ,可变 

由此看出,pi是常量,常量在初始化和赋值时,类型必须严格一致。也就是const修饰指针本身时,=号两边的变量类型必须严格一致,否则不能匹配。
     2)const修饰指针指向的变量(或对象) 
           此种情形下,通过间接引用指针不可改变变量的值,假设指针为p,则*p不可变,下面以例子说明:

const int *pi = &a; //也可以写成 int const *pi = &a;
const int *pi = &i; //ok ,pi可赋值常量的地址,又可赋变量的地址
const int *pi1 = &a;
const int *pi = pi1; //ok
*pi = j; //error,*pi 不可变,不能更改指针的间接引用形式
pi = &j; //ok,pi可变
pi = &b; //ok,pi可变
pi++; //ok
--pi; //ok

3)const修饰指针本身和指针所指的变量(或对象)
     设有指针p,此种情形下,p和*p都不可变.举例如下:

const int* const pi = &a; //or int const* const pi = &a;
//将const pi看作一体,就与(2)所述相同,只是要求pi必须为const,正如上所说,=号两边的类型不必严格匹配,但必须含有int*, &a的类型为const int* const,含有int*, 所以可以赋值。
const int* const pi = &i; //ok, &i类型为int* const,含有int*, 可赋值。
const int *pi1 = &j;
const int *const pi = pi1; //ok,  pi1类型为int*
pi = &b; //error, pi不可变
pi = &j; //error, pi不可变
*pi = b; //error, *pi不可变
*pi = j; //error, *pi不可变
pi++; //error ,pi不可变
++i; //ok, =号右边的变量(或对象)与所修饰的变量无关
a--; //error, a为const

这种情况,跟以上两种情形有联系。对const int* const pi = &a;我们可以这样看:const int*( const pi )= &a;(仅仅是表达需要),将const pi看作一体,就与上述分类(2)符合。只要含有int*便可.

const修饰引用
    这种情况比较简单,没有象修饰指针那样繁复,因为引用和引用对象是一体的,所以引用被const修饰只有一种类型。
const修饰引用,引用本身不可变,但引用的变量(或对象)可以改变.例如:

const int& ri = a; //or int const & ri = a; ok, ri 本身是常量,引用不区分类型
const int& ri = i; //ok,引用不区分类型
ri++; //error, ri为常量,不可变
i++; //ok,=右边的变量与引用无关
ri=b; //error, ri为常量
i=j; //ok,=右边的变量与引用无关
int & const ri = i; //error,不存在这种形式,没有意义

const修饰指针的引用
    引用只是个别名,这里与修饰指针类似,又分为三种情况:
(1)
     先给个例子:
           const int *pi = &a; 
           const int *&ri = pi; //or int const *&ri = pi;
     引用是引用对象的别名,正因为如此,ri是pi的别名,所以ri的类型必须与pi完全一致才行。这里pi的类型为int*,ri的类型也为int*,赋值可行。若const int *&ri = &a;正不正确?分析一下就知晓。ri类型为int*,&a的类型则为const int* const不匹配。
         const int *&ri = &i; //error,类型不匹配,一为int*,一为int* const
          ri = &a; //ok
          ri = &i; //ok 
          const int *pi1=&a;
          const int *pi2=&i;
          ri = pi1; //ok
          ri = pi2; //ok
          *ri = i; //error 
          *ri = a; //error
     注意这与1-(2)的区别.
(2)
     用例子说明:
         int *const &ri = &i; //去掉ri左边的&号,则为int *const ri,因为ri是别名,故ri的类型应与赋值的数类型一致,ri类型为int *const,&i为int *const,可以这么做. 
         int *const &ri = pi; //error,类型不合,一为int *const ,一为int *
         int *const &ri = &a; //error,类型不合,一为int *const,一为const int* const
         (*ri)++; //ok
         i++; //ok
         ri = &i; //error
   这种情况下,ri为常量,不可更改.
(3)
     用例子说明:
          const int* pi = &j;
          const int* const &ri = pi; //or int const * const &ri = pi;ok
          const int* const &ri = &i; //ok
     ri是pi的别名,pi的类型应与ri一致。拿掉&,得const int* const ri ,把const  ri看作一体,很容易得出ri的类型信息,就象前面2-(3)所讨论的一样,可以得到赋给ri的只要含有类型int* 即可。pi的类型为int*,&i的类型为int* const ,可以这么做.
         const int * const &ri = &a; //ok 
         ri++;  //error
         *ri = 6;  //error

【C和指针】const指针相关推荐

  1. C语言特殊指针——const指针、void指针、NULL指针、零指针、野指针

    const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性 指向常量的指针: const int *pa; int const *pa; 两者等 ...

  2. C++ Const指针学习

    Const指针 const指针顾名思义就是常量指针的意思.下面将通过一些具体例子说明const指针的几种用法. const type *p 特性 防止使用p指针来修改p所指向的值,下面是最简单的错误例 ...

  3. C++之指向const对象的指针和const指针

    1.指向const对象的指针 我们可以通过指针来修改其所指对象的值,但如果指针指向的是const对象,则不允许使用指针来改变其所指的const值.C++要求指向const对象的指针也是const类型. ...

  4. 修改const指针所指向的值

    dval  =  3.14159; *cptr = 3.14159; //错误  cptr是一个指向const的指针 double  *ptr  =  &dval; //正确 ptr指向非co ...

  5. C++指向const对象的指针和const指针

    1.指向const对象的指针 我们可以通过指针来修改其所指对象的值,但如果指针指向的是const对象,则不允许使用指针来改变其所指的const值.C++要求指向const对象的指针也是const类型. ...

  6. const指针与指向const的指针

    const指针与指向const的指针 const指针 如下代码: int main() {int num = 42;int* const p = # // p是常量指针,指向一个整型数cout < ...

  7. 指向const的指针和const指针

    如何区分 1.const的右边是指针类型,则指针是const,即const指针:const的右边是整型类型,则该类型是const,即指向const的指针: 2.指向const的指针可以不用初始化,因为 ...

  8. inline函数返回值_C++知识补充-指针,const,函数指针,指针数组,运算符重载

    嵌入式Linux:C++ 面试准备珍藏版本​zhuanlan.zhihu.com 明月照我心:123道c++笔试题汇总(含答案)​zhuanlan.zhihu.com 阿贵:常见C++笔试面试题整理​ ...

  9. 【C 语言】const 关键字用法 ( 常量指针 - const 在 * 左边 - 修饰数据类型 - 内存不变 | 指针常量 - const 在 * 右边 - 修饰变量 - 指针不变 )

    文章目录 一.const 普通用法 二.常量指针 ( 指向 常量 的指针 | 被指向的内存不能被修改 ) 三.指针常量 ( 指针不能被修改 ) 三.指向 常量 的 指针常量 四.const 在 * 左 ...

  10. c++中的void指针和const指针

    在c++中可以声明指向void类型的指针,指向void类型的指针称为void指针,此外,在声明指针时,还可以用关键字const进行修饰,用关键字const修饰的指针称为const指针. 1.void指 ...

最新文章

  1. 2018-3-7论文网络评论中非结构化信息的表示与研究--------实验分析
  2. R构建指数回归模型(Exponential Regression)
  3. 深入Activity的作业完成
  4. 配置tomcat支持http delete和put的方法
  5. jQuery中this与$(this)的区别总结
  6. LeetCode 581. 最短无序连续子数组(排序单调栈)
  7. python未将对象引用设置到对象的实例_在Python中使用pingarapi。服务器引发Webfault:对象引用未设置为对象的实例...
  8. vue assets图片_Vue实战—如何细化Vue项目目录设计(2)
  9. 解决浏览器兼容性问题
  10. DEFERRED_SEGMENT_CREATION
  11. XML与HTML区别
  12. 孙鑫VC学习笔记:第十二讲 (六) 读写注册表
  13. 前端开源项目周报1213
  14. Validation 参数校验
  15. git 记住账号密码、忽略部分文件、合并分支、将远程分支拉取到本地
  16. GBase 8c数据库登陆
  17. 使用pyqt5的日期控件做一个小日历方便查看
  18. U盘安装Linux系统教程
  19. TensorFlow搭建LSTM实现多变量时间序列预测(负荷预测)
  20. 专访仙工智能叶杨笙:工业产品如何提升研发效能?

热门文章

  1. 白名单模板_solidworks打开stp显示默认模板无效?如何解决!
  2. matlab画柱形图
  3. oracle通信通道的文件结尾_Oracle错误——ORA-03113:通信通道的文件结尾 解决办法...
  4. html3d旋转效果相册,HTML5css3:3D旋转木马效果相册
  5. sed命令详解(下)
  6. 计算机组装训练知识总结,计算机组装维护实训总结
  7. 三人行SEO教程免费公开下载-学点啥收集整理
  8. Java--十大排序算法之归并排序
  9. 后台管理系统登录思路
  10. Opencv图像特征点提取(