#const#const int *p 为何可以不初始化
摘自http://www.myexception.cn/cpp/1900041.html
const int *p 为什么可以不初始化?
c++ primer 5th
P53 写道:const 对象一旦创建后其值就不能再改变,所以const对象必须初始化。
但在 P57 中练习2.28的第(e)题为什么判断为合法呢?为什么可以不用初始化呢?
(e)const int *p; // legal. a pointer to const int
------解决思路----------------------
const int *p; // p是指针,指向const int类型数据
int * const p; // p是常指针,指向int类型数据
const int * const p; // p是常指针,指向const int类型数据
------解决思路----------------------
const 对象一旦创建后其值就不能再改变,所以const对象必须初始化。
LZ对于这句话中的const对象要弄清楚:
const int *p中,const对象是*p(即*p的值是只读),而对于此句“const对象必须初始化”,一般用法中我们是要给指针p初始化,而不是给*p初始化。所以在此可以不初始化。即使在声明是进行初始化(const int* p = 0x123456),也是在对指针p初始化,等价于如下一般用法:
对此的用法一般如下:
const int *p;
p = 0x123456;(此时是在给指针p赋值,而不是给*p赋值)
int* const p中,const对象是p,此时在指针p声明时必须初始化。
一般用法:
int* const p = 0x123456;
------解决思路----------------------
遇到const修饰的指针,需要注意有两种可能:
1、指针变量指向的值无法改变
2、指针变量本身无法改变
例如:
int a = 10;
const int *p;
p = &a;
*p = 3; // 错误,通过此指针改变指向的值
int b = 5;
p = &b; // 正确 int c = 10;
int * const p = &c;
*p = 5; // 正确
int d = 5;
p = &d; // 错误,指针变量不能改变
------解决思路----------------------
(1) int *p -- p是个非const指针,指向的对象是int;
(2) const int *p -- p是个非const指针,指向的对象是const int;
(3) int * const p -- p是个const指针,指向的对象是int;
(4) const int * const p -- p是个const指针,指向的对象是const int。
以上四个都是定义指针p,如果初始化是指初始化指针p,而不是它所指向的对象,由于(3)和(4)中指针p是const的,所以必须初始化。(1)和(2)中的指针p是非const的,可以不初始化。
#const#const int *p 为何可以不初始化的更多相关文章
- const int *pi与int&nbs…
此质料是摘要:<<彻底搞定C 指针 >>,自己感觉比较有价值,现与大家分享. 1. 从const int i 说起 你知道我们声明一个变量时象这样int i :这个i是可能在它 ...
- int *p,cons int *p,int const *p,int * const p,const int * const p,int const * const p的差别
加有constkeyword的几种情况的辨析 const修饰的代码 含义(特点) 等价性 int *p = # 1. 能够读自己 2. 能够通过*p改自己 ...
- C++中类中常规变量、const、static、static const(const static)成员变量的声明和初始化
C++类有几种类型的数据成员:普通类型.常量(const).静态(static).静态常量(static const).这里分别探讨以下他们在C++11之前和之后的初始化方式. c++11之前版本的初 ...
- int *const && int const * && const int *的区别
ANSIC允许声明常量,常量和变量不同,常量就是不可以改变的量,用关键字const来修饰 比如:const int a int const a 以上两种声明方式是一样的,我们不需要考虑const和in ...
- c语言检测文件是否存在int __cdecl access(const char *, int);
最近写代码,遇到很多地方需要判断文件是否存在的.网上的方法也是千奇百怪,“百家争鸣”. fopen方式打开的比较多见,也有其他各种方式判断文件是否存在的,由于其他方法与本文无关,所以不打算提及. 笔者 ...
- const volatile int i
问题: const volatile int i=10:这行代码有没有问题?如果没有,那 i 到底是什么属性? 回答: 没有问题,例如只读的状态寄存器.它是volatile,因为它可能被意想不到地改变 ...
- const vector<int> 和 vector<const int>问题讨论
1.const vector <int> vec(10) —— 与const int a[10]是一回事,意思是vec只有10个元素,不能增加了,里面的元素也是不能变化的 vector&l ...
- C++学习五 const vector<int>类型的迭代器使用
一情景: 算法功能:对于传入的vector, 能够找到两个数字,使其相加之和为target,然后返回这两个数字的位置(也就是秩) 最开始是这样的一个问题: 对于一个传入的const vector< ...
- char * const * (*a) (int b)
char * const * (*a) (int b), 按照c++ program language的读法,从右往左读,* 读作pointer to 把(*a) (int b看作整体, (*a) ( ...
随机推荐
- Vue2.0 脚手架代码详解
参考作者:https://www.jianshu.com/p/2b661d01eaf8 只是为了方便个人学习. 来看一下脚手架创建后的项目目录 说明:在*.vue文件,template标签里写htm ...
- php算法题2
一群猴子排成一圈,按1,2,…,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大 ...
- 【C++ mid-term exerises】
1. 用掷骰子方式,模拟班级每个学号被随机抽点的概率. (12分) 具体要求如下: (1)设计并实现一个骰子类Dice. ① 数据成员sides表示骰子面数.构造时,指定骰子是6面,8面,还是其它数值 ...
- 前端自动化构建工具webpack (一)之webpack安装 和 设置webpack.confi.js
目的: 模块化开发,组件化开发,让代码符合开发规范,更高效 webpack作用:从pack,就知道这是包的意思,比较专业点叫做前端自动化打包构建工具,代码错误检查,预处理,文件合并(打包),代码压缩 ...
- python3读文件时报错UnicodeDecodeError: 'gbk' codec can't decode byte 0x9f in position 2: illegal multibyte sequence
- 补充:javascript
写法分类:1.行内(内联)写在标签里面,以属性的形式表现,属性名是事件属性名例如:<button onClick="js代码"></button>2.内嵌写 ...
- Linux命令更新系统时间,更新所有文件的时间(转)
https://blog.csdn.net/ccj2020/article/details/76026606
- python->读写excel
from openpyxl import load_workbook#将一个excel文档中的数据存放内存中,即变量wb保存了该excel的所有信息wb = load_workbook(r" ...
- jQuery 学习笔记(5)(事件绑定与解绑、事件冒泡与事件默认行为、事件的自动触发、自定义事件、事件命名空间、事件委托、移入移出事件)
1.事件绑定: .eventName(fn) //编码效率略高,但部分事件jQuery没有实现 .on(eventName, fn) //编码效率略低,所有事件均可以添加 注意点:可以同时添加多个相同 ...
- OAuth2认证和授权入门
OAuth2四种授权方式 四种授权方式 OAuth 2.0定义了四种授权方式. 密码模式(resource owner password credentials) 授权码模式(authorizatio ...