摘自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 为何可以不初始化的更多相关文章

  1. const int *pi与int&nbs…

    此质料是摘要:<<彻底搞定C 指针 >>,自己感觉比较有价值,现与大家分享. 1. 从const int i 说起 你知道我们声明一个变量时象这样int i :这个i是可能在它 ...

  2. int *p,cons int *p,int const *p,int * const p,const int * const p,int const * const p的差别

     加有constkeyword的几种情况的辨析 const修饰的代码 含义(特点) 等价性 int *p = &num; 1.       能够读自己 2.       能够通过*p改自己 ...

  3. C++中类中常规变量、const、static、static const(const static)成员变量的声明和初始化

    C++类有几种类型的数据成员:普通类型.常量(const).静态(static).静态常量(static const).这里分别探讨以下他们在C++11之前和之后的初始化方式. c++11之前版本的初 ...

  4. int *const && int const * && const int *的区别

    ANSIC允许声明常量,常量和变量不同,常量就是不可以改变的量,用关键字const来修饰 比如:const int a int const a 以上两种声明方式是一样的,我们不需要考虑const和in ...

  5. c语言检测文件是否存在int __cdecl access(const char *, int);

    最近写代码,遇到很多地方需要判断文件是否存在的.网上的方法也是千奇百怪,“百家争鸣”. fopen方式打开的比较多见,也有其他各种方式判断文件是否存在的,由于其他方法与本文无关,所以不打算提及. 笔者 ...

  6. const volatile int i

    问题: const volatile int i=10:这行代码有没有问题?如果没有,那 i 到底是什么属性? 回答: 没有问题,例如只读的状态寄存器.它是volatile,因为它可能被意想不到地改变 ...

  7. const vector<int> 和 vector<const int>问题讨论

    1.const vector <int> vec(10) —— 与const int a[10]是一回事,意思是vec只有10个元素,不能增加了,里面的元素也是不能变化的 vector&l ...

  8. C++学习五 const vector<int>类型的迭代器使用

    一情景: 算法功能:对于传入的vector, 能够找到两个数字,使其相加之和为target,然后返回这两个数字的位置(也就是秩) 最开始是这样的一个问题: 对于一个传入的const vector< ...

  9. char * const * (*a) (int b)

    char * const * (*a) (int b), 按照c++ program language的读法,从右往左读,* 读作pointer to 把(*a) (int b看作整体, (*a) ( ...

随机推荐

  1. C# word 图片大小

    通过Office自带的类库word文档中插入图片,图片大小的单位为磅 而文档中,图片的大小已经固定,为CM. 实际工作中,首先将图片插入到word中,根据目前的大小,计算转换为目标大小的比率,将长宽按 ...

  2. 微信原始坐标转换成百度坐标 lat lng

    如有帮到你记得结合我这篇博客里的方法.... http://www.cnblogs.com/zc290987034/p/8294988.html {:wx_jssdk_config("fal ...

  3. mysql提权常用方法。 hack某某

    一般是root权限,知道mysql root权限,root账号密码 启动项提权:原理:利用高权限的root写入一个vbs脚本到启动项,再通过一些方法如ddos,社工管理员之类的方法来让服务器重启,运行 ...

  4. awt多线程聊天

    public class ChatServer { boolean started = false; ServerSocket serverSocket = null; public void sta ...

  5. 解决adb:error: unknown host service

    1.在使用adb命令跑程序时出现adb: error: failed to get feature set: unknown host service 输入adb shell 时提示error: un ...

  6. opencart3如何安装模板

    opencart 3模板采用twig模式,安装模板也有点不大一样,随ytkah一起来看看opencart3如何安装模板吧1.下载模板文件,用ftp上传到对应的位置,一般有几个文件夹,比如:admin. ...

  7. Oracle 数据库逻辑结构2.md

    Oracle 数据库逻辑结构一.存储关系Oracle 数据库逻辑上是由一个或多个表空间组成的,表空间物理上是由一个或多个数据文件组成的:而在逻辑上表空间又是由一个或多个段组成的.在Oracle 数据库 ...

  8. 【Java】NO.83.Tool.1.GlassFish.1.001-【GlassFish 5 安装使用】-

    1.0.0 Summary Tittle:[Java]NO.83.Tool.1.GlassFish.1.001-[GlassFish 5 安装使用]- Style:EBook Series:Java ...

  9. 2019.04.13 python基础

    第一节    主要讲python背景  没什么要注意的  了解记住概念就好 python官网  python.org  自带shell  可以运行python代码 在IDLE中怎么运行代码 新建文本  ...

  10. 取数游戏II

    传送门 #include <bits/stdc++.h> using namespace std; #define ll long long #define re register #de ...