[C++] const与指针的关系
首先快速复习一些基础。
考虑下面的声明兼定义式:
int p = 10;
p的基础数据类型是int。
考虑下面的声明兼定义式:
const int a = 10;
a的基础数据类型是int,a是一个常量对象,所以必须在声明时初始化。
考虑下面的语句:
const int a = 10; int *ptr = &a;
错误,不能将整型指针指向整型常量对象。
const int* ptr = &a; //正确!
注意,指针的左侧若有const修饰符,则称它为“指向常量的指针”。顾名思义,当你声明并初始化了这样的指针,编译器便默认该指针指向的是“一个常量”。为什么这里的“一个常量”要打双引号呢?因为其实所谓的“指向常量”只是该指针“自己认为”的,实际上你可以将“指向常量的指针”指向一个非常量对象,比如:
double x = 10.1; const double* ptr = &x;
在这里,ptr这个“指向常量的指针”以为自己指向的是一个常量,实际上操作者可以自己对x进行随意赋值,只是不能用ptr指针对x进行修改罢了。
Hint: 形如const type*的指针的特点是不能改变所指对象的值
考虑下面的声明兼定义式:
double num = 1.1; double* const ptr = #
注意,该指针的右侧有const修饰符,则称它为”常量指针”。
如何理解呢?如果说“指向常量”代表该指针指向的是一个“常量对象”,那么“常量指针”表示该指针本身的值是一个不变的常量。
建议习惯从右往左理解声明式的意义。例如double* const ptr = #,从左往右,const ptr我们可知ptr本身是一个常量对象,而 *const ptr则表示ptr是一个“常量指针”,左侧的double表明了它所指对象的基础数据类型。
指针储存的值是什么呢?当然是所指对象的地址。所以,更具体的理解便是,“常量指针”声明时必须初始化并得到一个对象的地址,由于该指针本身的值,也就是所指对象的地址是不能改变的.
所以“常量指针”一旦指向了某个对象便必须永远指向它,类似下面的语句是非法的:
double num = 1.1;
double num2 = 1.2;
double* const ptr = #
ptr = &num2: // invalid!!!
考虑下面的声明兼定义式:
int m = 10;
const int* const pip = &m;
综合上面的叙述,相信这个表达式已经难不倒你了。
从右往左阅读,const pip表示pip是一个常量对象,int* const pip表示pip是一个int型的常量指针,再加上左侧的const表示pip指向“一个常量”。综合起来,就是pip是“指向常量的常量指针”。
[C++] const与指针的关系的更多相关文章
- [001]const和指针
很经典的: const int* p: int* const p: 前者表示指针指向的值是const,指向的值不可变,但是指针本身是可变的:后者表示改指针是const,指针不可变,但是指向的值是可变的 ...
- 弄清const与指针、引用之间的关系
const和 define在常量定义上的差别 在C++中,我们可以使用const 或者 宏define来定义常量.但是C++鼓励使用const定义常量,而不是宏define.原因有很多. 1.defi ...
- C/C++中数组与指针的关系探究
数组与指针 长期以来,在C/C++中,数组名和指向数组首元素的指针常量到底是以一种什么关系,一直困扰着很多人.很多地方,甚至是一些教科书中都在说,"数组名就是一个指向数组首元素的指针常量&q ...
- C++ const 引用 指针
先简单回忆一下常量的性质: int main() { const int buffSize = 512; buffsize = 512; //× buffSize是常量 } 初始化时: const i ...
- 第12课.经典问题解析(const;指针和引用)
问题1:const什么时候为只读变量?什么时候是常量? const常量的判别准则: a.只有用字面量初始化的const常量才会进入符号表(直接初始化过的const为常量) b.被使用其他变量初始化的c ...
- C++中的const和指针组合
在C++里,const修饰指针有以下三种情况 (1)指针常量:即指向常量的指针 const int *p或者int const *p const在*前,,可以这样理解它的功能,因为const在*前, ...
- 面试集锦-常量,const, const 对指针的影响
在C语言中不可改变的数据(量)就是常量 在C语言中有三种常量 字面量(直接量),就是直接写出来的,从写法上就可以看出值与类型等,例如:19,123.456等 名字常量 ...
- C语言 const与指针
//const与指针 #include<stdio.h> #include<stdlib.h> void main(){ ; ; const int *p; p = & ...
- const修饰指针
关于const修饰指针的情况,一般分为如下4种情况: ; const int *a =&b; //情况1 int const *a =&b; //情况2 int* const a =& ...
随机推荐
- Jalor 5学习心得
jalor5是一套功能强大的框架,该框架集成了spring.mybatis.cxf.日志.异常等组件,和其它未提及的部分组件,如消息组件. 它还自带了权限管理,内容管理,国际化等功能,该框架在项目开发 ...
- Cordova plugin
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010106153/article/details/53418528Cordova plugin工程 ...
- Mongo C# Driver 聚合使用---深入浅出
聚合查询结构体系 我们都知道Mongo中聚合是由$match,$project等聚合项组成,所以在C# Driver中具有两种类型:聚合管道(PipelineDefinition)和聚合管道项(I ...
- Angular CLI 升级 6.0 之后遇到的问题
Angular CLI 1.7.4 在使用 ng build --prod 会构建失败,而 ng build 是正常的.比较好的解决办法是使用 ng build --prod --extract-li ...
- 使用try-with-resources优雅的关闭IO流
Java类库中包括许多必须通过调用close方法来手工关闭的资源.例如InputStream.OutputStream和java.sql.Connection.客户端经常会忽略资源的关闭,造成严重的性 ...
- JDK8中HashMap
引用别人的一句话: JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里.但是当位于一个桶中的元素较多,即hash值相等的元素较多 ...
- C++购书系统
C++购书系统——来自班里某位同学的小学期作业 这是一个购书系统,模拟网上购书的流程.用户可以在这个小程序里输入对应的数字进行浏览书籍信息,查看用户信息,查找书籍,购买书籍以及查询个人订单的操作. 以 ...
- Docker 核心技术之Dockerfile
Dockerfile 简介 什么是Dockerfile Dockerfile其实就是根据特定的语法格式撰写出来的一个普通的文本文件 利用docker build命令依次执行在Dockerfile中定义 ...
- P1339 [USACO09OCT]热浪Heat Wave
我太lj了,所以趁着夜色刷了道最短路的水题....然后,,我炸了. 题目描述: The good folks in Texas are having a heatwave this summer. T ...
- 树莓派3B+(三)
上一篇中,我们配置好了基本的raspbain系统,接下来我们可以用xrdp或者vnc在Windows上远程连接树莓派. 一.安装xrdp xrdp和vnc是两种常见的远程桌面协议,可以进行可视化界面远 ...