传送门

常量指针和指针常量的区别详解

在C/C++中关键字const用来定义一个只读的变量或者对象,有如下优点
    (1)便于类型检查,如函数的函数 fun(const int a) a的值不允许变,这样便于保护实参。
    (2)功能类似与宏定义,方便参数的修改和调整。如 const int max = 100;
    (3)节省空间,如果再定义a = max,b=max。。。就不用在为max分配空间了,而用宏定义的话就一直进行宏替换并为变量分配空间
    (4)为函数重载提供参考

而C/C++中常把指针和常量混合起来使用,其最大的用途就是作为函数的形式参数,保证实参在被调函数中的不可改变的特性,那到底常量指针和指针常量有什么区别呢?

下面通过一个例子来解析 常量指针 和 指针常量,我们先总结一下 常量指针 和 指针常量 的区别

首先一定要明白哪种定义方式是常量指针,哪种是指针常量,这里可以记住三句话加深记忆:

* (指针)和 const(常量) 谁在前先读谁 ;*象征着地址,const象征着内容;谁在前面谁就不允许改变。

好吧,让我们来看这个例子:

[cpp] view plaincopy
  1. int a =3;
  2. int b = 1;
  3. int c = 2;
  4. int const *p1 = &b;//const 在前,定义为常量指针
  5. int *const p2 = &c;//*在前,定义为指针常量

常量指针p1:指向的地址可以变,但内容不可以重新赋值,内容的改变只能通过修改地址指向后变换。

p1 = &a是正确的,但 *p1 = a是错误的。
指针常量p2:指向的地址不可以重新赋值,但内容可以改变,必须初始化,地址跟随一生。
    p2= &a是错误的,而*p2 = a 是正确的。

下面是在Vim编辑器中的调试结果

上述代码在注释 18行 和 24行 代码后才能正确输出,下图是正确结果

输出结果可以看出,对于常量指针p1,改变其地址指向,内容也随着地址的改变而变化了。

而对于指针常量p2,初始化后地址就固定了,内容可以随时重新赋值。

对于常量指针p1,我们可以改变它指向的地址,但不能改变指向的内容,如果改变了,就会出错,下面是18行代码取消注释后编译器提示的错误:

对于指针变量p2,我们可以改变他指向的内容,却不能改变它指向的地址,如果改变了,就会出错,下面是24行代码取消注释后编译器提示的错误:

经过上面的介绍,我想大家应该知道常量指针和指针常量的区别了。

转载于:https://www.cnblogs.com/njczy2010/p/5769620.html

转 常量指针和指针常量的区别详解相关推荐

  1. c语言char数组和short数组的区别,详解C语言中Char型指针数组与字符数组的区别

    详解C语言中Char型指针数组与字符数组的区别 详解C语言中Char型指针数组与字符数组的区别 1.char 类型的指针数组:每个元素都指向一个字符串,指向可以改变 char *name[3] = { ...

  2. C语言结构体与指针ppt,c语言指针和结构体:链表详解.ppt

    c语言指针和结构体:链表详解.ppt 1,第十一章 链表,2,例跳马.依下图将每一步跳马之后的位置x,y放到一个"结点"里,再用"链子穿起来",形成一条链,相邻 ...

  3. const int *a和int*const a 的区别详解

    补充知识 "const int i"与"int const i"之间的区别 对变量来说,const 关键字可以限定一个变量的值不允许改变,从而保护被修饰的东西, ...

  4. OpenGL,GLUT,FreeGLUT,GLFW,GLEW,GLAD,GL3W,GLAD,GLM,GLSL的区别详解

    OpenGL,GLUT,FreeGLUT,GLFW,GLEW,GLAD,GL3W,GLAD,GLM,GLSL的区别详解 很多同学在初学计算机图形学时,都要去配置OpenGL环境,其中涉及多个库的选择和 ...

  5. python 文件读写with open模式r,r+ w,w+ a,a+区别详解

    python 文件读写with open模式r,r+ w,w+ a,a+区别详解 python中的 with open主要要来进行文件读写的操作 在 Python 中使用文件的关键函数是 open() ...

  6. CSharp(C#)语言_委托和事件区别详解

    委托和事件区别详解 委托和事件的概念 委托 事件 委托和事件的作用 委托 事件 委托和事件的区别 委托和事件的详细解答请看C#系列文章 委托和事件代码实践 委托 事件 总结 委托和事件的概念 委托   ...

  7. java和c++的区别_JAVA和C++区别详解

    JAVA和C++区别详解 来源:-- 作者:-- 浏览:811 时间:2016-08-10 14:18 标签: 摘要: 1)java是解释性语言,java程序在运行时类加载器从类路经中加载相关的类,然 ...

  8. [ASP.NET]ASP.NET中的Inherits、CodeFile、CodeBehind的区别详解及OWIN及IDENTITY

    篇一 : ASP.NET中的Inherits.CodeFile.CodeBehind的区别详解 Inherits.CodeFile.CodeBehind 在 ASP.NET 中使用代码隐藏方法来设计W ...

  9. PHP的传值与引用,php 传值与传引用的区别详解

    摘要 腾兴网为您分享:php 传值与传引用的区别详解,掌上公交,信用管家,天翼阅读,平安知鸟等软件知识,以及k歌达人,ml2010打印机驱动,维也纳大学app,建玛特,网盘快搜,中国禁毒数字展览馆,爱 ...

最新文章

  1. url获取网站信息不包含网页源文件内的标签_前嗅ForeSpider链接抽取应用场景及链接在源码的html标签里写脚本...
  2. HP小型机的信息的命令集(一)
  3. 变更AD计算机名称和IP地址
  4. 1029 C语言文法定义
  5. 使用Jexus 容器化您的 Blazor 应用程序
  6. [mybatis]动态sql_if_where_trim判断OGNL
  7. 大牛深入讲解!9次Java面试经验总结
  8. 【HDOJ】4363 Draw and paint
  9. php 接口安全解决方案,php接口数据安全解决方案(一)
  10. db2如何锁定一张表_办公必备的保护工作表技巧,你会了么?
  11. uniapp全局传值方式总结
  12. apk安装到电视上看不到图标_零基础搭建电视直播APP平台第二弹(修改APP)
  13. 毕设题目:Matlab图像修复
  14. 智力题(猜凶手,确定比赛名次)
  15. P1251 餐巾计划问题 解题报告
  16. 计算机设置从u盘启动怎么办,如何进入bios设置u盘启动为优先启动项
  17. 《MySQL入门学习》(p61~p62)
  18. 如何集成指纹验证到网站系统
  19. 【Java】命名规范
  20. Florian%C3%B3polis巴西北岸新业务的最佳场所四方数据分析

热门文章

  1. POJ2488 A Knight's Journey(DFS)
  2. inheritConstructorStealing.js
  3. 2014-03-08_javascrit_controllerstatus
  4. IIS故障问题(Connections_Refused)分析及处理【转】
  5. android使用Dialog实现复选功能与数据库结合综合实例
  6. NSUserDefaults使用
  7. 高仿快递100--实战之RadioGroup和RadioButton应用
  8. VDI ROI不包括硬成本节约
  9. 利用linux的mtrace命令定位内存泄露(Memory Leak)
  10. freebsd mount linprocfs