前言:很多人都把const int * 、int * const、int const* 的区别和联系搞混,我自己在学习C++的过程中,也经常性          弄不 清楚,今天特意总结一下,作为学习笔记记录下来。

一,const修饰符用于指针

将const用于指针有些很微妙的地方,有两种不同的方式将const关键字用于指针。第一种方法是让指针指向一个常量对象,这样可以防止使用该指针来修改所指向的值,第二种方法是将指针本身声明为常量,这样可以防止改变指针的位置。

声明一个指向常量的指针a:

int y = 1;

const int * a = &y;

该声明指出,a指向一个const int,这里为1,因此不能使用a来修改这个值。换句话说,*a的值为const,不能被修改,但是a的声明并不意味着它指向的值实际上就是一个常量,而只是意味着对a而言,这个值是常量。a指向y,而y不是const,可以通过y变量来修改y的值,但不能使用a指针来修改。

const int m = 9;

const int * n = &m;  // (1)

int * t = &m;            //(2)

上面的(1)和(2)中看到了什么,(2)将const的地址赋给了常规指针,(1)将const地址赋给了const指针,这两张是否正确呢,答案显然(2)不对,因为C++禁止将const的地址赋给非const指针,如果非要这样做,只能使用强制类型转换来突破这种限制。

int m = 1;

const int * n = &m;  //(3)

int * const h = &m;  //(4)

(3)中声明的const只能防止修改n指向的值,而不能防止修改n的值,也就是说可以将一个新地址赋给n;但仍然不能使用n来修改它指向的值,不允许使用n来修改m的值,但允许将n指向另一个位置。(4)中关键字const的位置与之前的不同,这种声明格式使得h只能指向m,但允许使用h来修改m的值。

二,int const * 与const int *

int const * a 与const int * a是没有任何区别的,它们的效果是一样的,都表示a指向一个const int,它总是把它指向的目标当做一个int常量。不能使用a来修改这个指向的地址的值,但是可以重新指向其他地址。即*a的值是const,不能被修改。

三,const int * const 与 const int const *

int trouble = 2;

const int * const flag1 = &trouble;  //(5)

const int const * flag2 = &trouble;  //(6)

其中(5)flag1只能指向trouble,而flag1不能用来修改trouble的值,即flag1和*flag1都是const。指向的地址和指向的地址的值都不能改变。

其中(6)同(5)的用法类似,也是指针指向的内存地址不可变,并且指针指向的内存地址的值也不能被修改。

四,牛客网例题分析

请声明一个指针,其所指向的内存地址不能改变,但内存中的值可以被改变。

正确答案: B   你的答案: C (错误)

const int const *x = &y;

int * const x = &y;

const int *x = &y;

int const *x = &y;

const int * const x = &y;

我们始终记住若const限定符在*之前,则const限定的是*ptr而不限定ptr。也就是说,ptr可以改变其所指向的对象,但不能通过该指针修改其所指向对象的值。
若const限定符在*之后,则const限定的是ptr而不限定*ptr。也就是说,ptr不可以改变其所指向的对象,但能通过该指针修改其所指向对象的值。
若在*之前有const限定符且在*之后也有const限定符,则ptr与*ptr都被限定。也就是说,ptr既不可以改变其所指向的对象,也不能通过该指针修改其所指向对象的值。
只要在*之后有const 限定符,则该指针在声明时必须初始化。

A中指向的内存地址不可变,指向的内存地址的值也不可变

B中指向的内存地址不可变,但是指向的内存的地址的值可以改变。

C中指向的内存地址可以改变,但是指向的内存的地址的值不能改变。

D中指向的内存地址可以改变,但是指向的内存的地址的值不能改变。

E中指向的内存地址不可变,指向的内存地址的值也不能改变。

*****************************************************************

补充:int a()const { } 表示a()函数中,类的成员变量不能发生任何改变。a不会对参数进行修改;如果a是结构体或者类的成员,那么也不会对结构体或类的成员变量进行修改

const int a(){ } 这属于一种牵强的写法吧,意思是返回值是一个整型 , 而且这个返回值是常量

const int * 、int * const、int const* 、const int a(){ } 和int a()const { }的区别和联系相关推荐

  1. c语言long unsigned int,关于c ++:如何安全地将unsigned long int转换为int?

    我有一个应用程序,它以unsigned long int s的形式创建唯一的ID. 该应用程序需要这种精度. 但是,我必须以仅允许int的协议发送这些ID. 协议的接收应用程序不需要这种精度. 所以我 ...

  2. java 把char转换成int型,java如何把char型数据转换成int型数据(转)

    一字符串,String="2324234535": 把第i个数取出来时是char型的:char temp=String.charAt(i) 如何把char型转换成int型? 我需要 ...

  3. integer 转int类型 java_Java数据类型中String、Integer、int相互间的转换

    Java数据类型String.Integer.int相互间的转换 1.Integer转换成int的方法 Integer i = new Integer(10); int k = i.intValue( ...

  4. c语言数据类型int的用法,C语言基本数据类型:整型(int)用法详解|C语言学习

    C语言基本数据类型:整型(int)用法详解 1. 整型 int C 语言提供了很多整数类型(整型),这些整型的区别在于它们的取值范围的大小,以及是否可以为负.int 是整型之一,一般被称为整型.以后, ...

  5. char * const p; //常量指针,p的值不可以修改  char const * p;//指向常量的指针,指向的常量值不可以改 const char *p; //和char const *p

    char * const p; //常量指针,p的值不可以修改 char const * p://指向常量的指针,指向的常量值不可以改 const char *p: //和char const *p

  6. 可空类型int? 解决: 【数据库里的int类型可以为null,而在c#里int类型不能为Nul】的问题

    using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace 可空数据类 ...

  7. linux 字符转int,如何在Linux内核中将char []字符串转换为int?

    如何在linux内核中将char []转换为int 验证输入的文本实际上是一个int? int procfile_write(struct file *file, const char *buffer ...

  8. c#语言float转换int,关于C#:在x86上将float转换为int的最快方法是什么

    在x86 CPU上将浮点数转换为int的最快方法是什么. 优选在C或组件中(可以在C中内嵌)以获得以下任何组合: 32/64/80位浮点数 - > 32/64位整数 我正在寻找一些比让编译器更快 ...

  9. mysql int做主键_mysql5.5 uuid做主键与int做主键的性能实测

    偶然的机会,得知mysql主键的类型采用 varchar 存UUID 的查询性能没有int型做主键好.网上查询大量资料,都是停留在理论上的,因此,自己写了代码进行实测,以下结果仅供参考,不具备权威性. ...

  10. php const 字符串,我可以使用字符串连接在PHP中定义一个类CONST吗?

    Imho,这个问题值得PHP 5.6的答案,感谢@jammin comment 从PHP 5.6开始,你可以为一个常量定义一个静态标量表达式: class Foo { const BAR = &quo ...

最新文章

  1. linux到不了启动界面,Linux 界面不能启动的解决
  2. mysql停止服务命令_0789不停止MySQL服务重做备库的方法
  3. 心得 : 面向对象和面向过程的区别【分享】
  4. 数据智能知多少?(超大礼包等你拿)
  5. 如果对象的引用被置为null,;垃圾回收器是否会立即释放对象占用的内存?
  6. 我和Django那些事儿(8)----相册django插件photologue,jQuery插件Slides
  7. php mysql addslashes_PHP函数 mysql_real_escape_string 与 addslashes 的区别
  8. iPads和iPhones的Media Queries(转载)
  9. 视频剪辑好帮手——pr软件学习(二)
  10. pip升级及关于pyecharts安装下载所遇到的问题及部分的解决
  11. 人机交互中的情境认知
  12. 用户价值分层——基于RFM模型的研究分析
  13. 设计一个灵活、通用、方便的权限管理系统
  14. android全渠道浅谈
  15. 发生系统错误 67,找不到网络名
  16. Windows注册表内容详解(转载)
  17. Python -- 大作业 — 使用turtle库画皮卡丘
  18. 泛化误差深入理解计算机系统,泛化误差界指导的鉴别字典学习
  19. fk算法绘制层状介质理论地震图
  20. redis哨兵、集群

热门文章

  1. LightHouse/归并排序
  2. 不懂这几个问题就落后了:Python、Android开发者必读!
  3. 机器学习入门(16)— CNN 池化层概念和特征
  4. Go 学习笔记(31)— 字符串 string、字符 rune、字节 byte、UTF-8 和 Unicode 区别以及获取字符串长度
  5. TCP/IP协议三次握手与四次握手流程解析
  6. 源文件封装为IP的步骤
  7. 关于SpringMVC和Struts2的区别
  8. 微软安全新闻聚焦-双周刊第三十四期
  9. [转]Android JNI使用方法
  10. 超市购物打印小票的简单程序 记录下来