一、const变量的一些基本特点

  • ①const修饰的变量不能被修改

const int a=10;

a=20;//错误

  • ②因为const修饰的变量不能被修改,所以必须被初始化

int a=10;

const int b=a; //正确

const int c=10; //正确

  • ③const修饰的变量可以赋值给其他值

const int a=10;

int b=a;//正确

  • ④可以有常量引用

int a=10;

const int &b=a;

二、在其他文件中使用const常量(extern)

  • const常量默认只能在当前文件使用,可以使用extern使const常量在文件中共享

  • 注意:在别的文件中使用const常量时,如果出现同名时:①其他文件的局部变量会覆盖const常量。②其他文件的全局变量会报错,显示重定义

方法:

  • 在demo.h文件中extern const int a;//声明

  • 在demo.c文件中extern const int a=1;(extern可省略)

三、const和引用

  • 把引用绑定到const对象上,就像绑定到其他对象上一样,我们称之为“对常量的引用”

  • 与普通的引用不同的是,对常量的引用不能被用作修饰它所绑定的对象:

const int ci = 1024;

const int &r1 = ci; //正确,引用到常量上

r1 = 42; //错误,不能对常量的引用进行修改

int &r2 = ci; //错误,不能让一个非常量引用指向一个常量对象

//因为引用可以通过改变自身值而改变所引用的值,所以为了防止引用改变值,禁止使用普通引用引向const常量

初始化和对const的引用

  • 在引用的文章中介绍,引用的类型必须与其引用的对象类型一致,但是有两个例外:

    • ①在初始化常量引用时允许用任意表达式作为初始值,只要该表达式的结果能转成引用的类型即可(见下面代码段1)

    • ②允许为一个常量引用绑定非常量的对象、字面值、甚至是个一般表达式(见下面代码段2)

//代码段1

double dval = 3.14;

const int &ri = dval;//正确

/*

上面的代码会生成一个int类型的临时变量,然后将临时变量赋值给ri,因此上述代码可以扩展为:

double dval = 3.14;

const int temp = dval; //临时变量

const int &ri = temp ;

*/

//代码段2

int i = 42;

const int &r1 = i; //正确,允许将const int&绑定到一个普通对象上

const int &r2 = 42; //正确

const int &r3 = r1 * 2;//正确

int &r4 = r1 * 2; //错误

四、常量和指针

  • 也可以用const来修饰指针,指向常量的指针不能用于改变其所指对象的值

  • 常量只能由常量指针来指向,不能由非常量指针来指向

const double pi = 3.14;

double *ptr = π //错误。ptr是非常量的

const double *cptr = π//正确

  • 可以使用常量指针指向一个非常量对象:

double dval = 3.14;

const double *cptr = &dval; //正确

  • 不能通过常量指针改变所指对象的值:

const double dval = 3.14;

const double *cptr = &dval; //正确

*cptr = 6.28; //错误

double dval2 = 3.14;

const double *cptr2 = &dval; //正确

*cptr2 = 6.28; //错误

五、常量指针、指针常量、常量指针常量

  • 常量指针:(指向常量的指针)。指向可以改,但是不能通过该指针改变所指向的值

    • 这种类型的const也被称为“底层const”:表示指针所指向的值是个常量

  • 指针常量:(指针的常量)。指向不可以改,但可以通过该指针改变所指向的值

    • 这种类型的const也被称为“顶层const”:表示指针本身是个常量

  • 常量指针常量:不可以修改指向,也不可以修改所指向的值

const int* pa; //常量指针

int const* pb; //常量指针

int * const pc; //指针常量

int const* const pd;//常量指针常量

如果通过const的位置来判断const对什么起作用:

  • const对左边的类型起作用,当const左边没有东西时,才对右边的起作用,因此有以下规则:

    • 常量指针时,const左边为int或const左边无内容右边有int,因此只对int(值)生效,所以为常量指针

    • 指针常量时,const左边为*(代表指针),所以为指针常量

    • 常量指针常量时,有两个const,对int(值),*(指针)都生效,因此为常量指针常量

  • 当然,上面的规则可以简化为下面一句话:

    • const出现在“*”号的左边,代表所指之物是常量

    • const出现在“*”号的右边,代表指针自身是个常量

初始化与使用

  • 常量指针,因为所指对象是个常量,所以有下面的规则

    • 可以常量指针指向于常量或非常量

    • 但是不能修改值

int a = 1;

const int b = 2;

const int *pa = &a; //正确,可以指向非常量

pa = &b; //正确,指向可以改变

*pa = 1; //不能通过常量指针修改所指对象的值

  • 指针常量,因为指针是个常量,而不是类型是常量,因此有下面的规则:

    • 只能指向于非常量,不能指向于常量(因为放置指针常量修改常量的值)

    • 不可以改变指针常量的指向,因为指针自身是个常量

int a = 1;

const int b = 2;

int c = 3;

int* const pa = &a; //正确,a是非常量

int* const pb = &b; //错误,b是常量

*pa = 10; //正确,可以修改指向对象的值

pa = &c; //错误,不能修改pa的指向(因为指针自身是个常量)

  • 常量指针常量,有如下规则:

    • 可以使用常量、非常量赋初值

    • 不能改变值、不能改变指向

int a = 1;

const int b = 2;

const int *const p1 = &a; //正确

const int *const p2 = &b; //正确

*p1 = 2; //错误

p1 = &b; //错误

之间的转换

  • 转换的规则是:非常量可以转换为常量,反之不行

int i = 0;

int j = 0;

const int ci = 42;

const int *p2 = &ci;

int *const p1 = &j;

const int *const p3 = p2;

p3 = p1; //错误,p3的指向也不能更改

int *p = p3; //错误,p3包含const,而p没有

p2 = p3; //正确,p2和p3都包含底层const

p1 = p3; //错误,p1的指向不能更改

c++ 表达式必须包含指向类的指针类型_C++:18const关键字(附常量指针、指针常量、常量指针常量)...相关推荐

  1. C++报错E0131 表达式必须包含指向类的指针类型

    尝试构建链表的时候写了一个attach函数,报错如下   改正: 后来发现这是结合优先级的问题,pRear是一个指向PolyNode类型指针的二重指针(PolyNode是一个结构体),并没有问题.理论 ...

  2. C语言数据类型——基本类型,构造类型,枚举类型,指针类型

    目录 一.基本类型 1.1.整型int 1.2.实型(浮点型) 1.3.字符型char 二.构造类型 2.1.数组类型[] 2.1.1.字符数组 2.1.2.一维数组 2.1.3.二维数组 2.1.4 ...

  3. 指针类型和指向的数据类型

    1.指针类型和指向的数据类型不同时 #include <stdio.h> //指针除了指明地址以外,还指明了类型,类型决定了数据的大小和数据的解析方式 int main() {char c ...

  4. 函数指针和函数指针类型

    参考:https://blog.csdn.net/candyliuxj/article/details/6339414 函数指针 1.     定义 每一个函数都占用一段内存单元,它们有一个起始地址, ...

  5. 初识C语言-----指针和指针类型

    1.指针是什么 1.指针是内存中一个最小单元的编号,也就是地址. 电脑中的内存是如何管理的呢,先举个例子:每栋楼是如何进行管理的呢,是通过给每个房间进行了编号即每个房间有各自的房间号,这样才方便对整栋 ...

  6. c语言 void**类型转换,void指针类型强制转换

    如何将一个void*强制转换成行指针类型? void*指针可以转换成任何类型的指针. 强制转换即可,比如 (int *)(void *)p; 假设你的数组有N行M列的int型数据. int arr[N ...

  7. gorm存指针数据_C语言重点——指针篇(一篇让你完全搞懂指针)

    一. 前言 C语言是比较偏底层的语言,为什么他比较偏底层,就是因为他的很多操作都是直接针对内存操作的. 这篇我们就来讲解C语言的一大特点,也是难点,指针和指针操作. 这篇文章我会先从基本类型的存储过程 ...

  8. printf 指针地址_c语言入门 第十四章指针

    我们之前研究的数据类型, 语句, 函数等等,这些内容可以认为是编写程序的基础,除了c语言之外,在其他的编程语言当中也会有相似的内容 我们接下来要研究的指针,可以认为是c语言独有的特性,学会如何的使用指 ...

  9. 表达式必须包含指向对象的指针类型,但他具有“int“?

    xdm,今天在写逆序函数的时候遇到了这样一个问题--表达式必须包含指向对象的指针类型,但他具有"int"?原来问题出在这里... 首先来看看题目 创建一个整型数组,完成对数组的操作 ...

最新文章

  1. ndarray.shape[]返回值的意义
  2. PopUpWindow使用详解(二)——进阶及答疑
  3. 蓝桥杯-区间k大数查询(java)
  4. android studio标题怎么改,如何在Android Studio中将应用标题更改为徽标
  5. Processing--鼠标响应(1)
  6. [kubernetes] 解决k8s.gcr.io Image 导入导出 等问题
  7. Ext.js 进入页面直接加载数据、输入框设置初始值
  8. Linux终端基本命令
  9. 两张图片合成一张_利用溶图技巧把多张图片合成一张奇幻风格图片教程
  10. ios Xcode 版本兼容及真机调试
  11. 【好书推荐】学习软件工程的必经之路 | 《人月神话》
  12. Aspose word pdf 相互转换
  13. 一文回顾腾讯数字生态大会·微搭低代码专场
  14. 2020 cr节目源_2020最新直播源
  15. 使用谷歌浏览器下载的图片webp怎么转成jpg格式图片
  16. Html代码问题:用鼠标悬停在文字上文字的颜色就变颜色的效果
  17. 基于TI Davinci架构的多核/双核开发快速扫盲(以OMAP L138为例),dm8168多核开发参考以及达芬奇系列资料user guide整理...
  18. Rietveld, or “How to revamp your code review process”
  19. 【导数术】14.凹凸反转
  20. 传统营销与网络营销的整合

热门文章

  1. STM32 - 定时器基础应用说明 - 03 - Application: timer clocking using external clock-source on ETR timer input
  2. 未能将管道连接到虚拟机: 所有的管道范例都在使用中。_山西大同超高压管道连接器维修方便厂家...
  3. tomcat最大连接数_SpringBoot内嵌Tomcat自定义配置用法
  4. hexo+git+github+域名搭建个人博客提示404_不用花一分线,松哥手把手教你上线个人博客...
  5. php无限评论回复_php如何制作无限级评论功能?
  6. rip协议中周期性广播路由信息的报文_RIP路由理论知识详解(一)
  7. oracle procedures批量删除带索引条件数据很慢_redis数据结构、持久化、缓存淘汰策略...
  8. 查询各个年级的平均分_艰难困苦终生志,玉汝于成竟英才——高三年级期中考试总结暨优秀学生表彰会...
  9. echarts 3d饼图_echarts构建关系图,节点可收缩和展开,可添加点击事件
  10. 自动拷贝文件至服务器,自动拷贝远程服务器文件