首先快速复习一些基础。

考虑下面的声明兼定义式:

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与指针的关系的更多相关文章

  1. [001]const和指针

    很经典的: const int* p: int* const p: 前者表示指针指向的值是const,指向的值不可变,但是指针本身是可变的:后者表示改指针是const,指针不可变,但是指向的值是可变的 ...

  2. 弄清const与指针、引用之间的关系

    const和 define在常量定义上的差别 在C++中,我们可以使用const 或者 宏define来定义常量.但是C++鼓励使用const定义常量,而不是宏define.原因有很多. 1.defi ...

  3. C/C++中数组与指针的关系探究

    数组与指针 长期以来,在C/C++中,数组名和指向数组首元素的指针常量到底是以一种什么关系,一直困扰着很多人.很多地方,甚至是一些教科书中都在说,"数组名就是一个指向数组首元素的指针常量&q ...

  4. C++ const 引用 指针

    先简单回忆一下常量的性质: int main() { const int buffSize = 512; buffsize = 512; //× buffSize是常量 } 初始化时: const i ...

  5. 第12课.经典问题解析(const;指针和引用)

    问题1:const什么时候为只读变量?什么时候是常量? const常量的判别准则: a.只有用字面量初始化的const常量才会进入符号表(直接初始化过的const为常量) b.被使用其他变量初始化的c ...

  6. C++中的const和指针组合

    在C++里,const修饰指针有以下三种情况 (1)指针常量:即指向常量的指针 const  int *p或者int const *p const在*前,,可以这样理解它的功能,因为const在*前, ...

  7. 面试集锦-常量,const, const 对指针的影响

    在C语言中不可改变的数据(量)就是常量    在C语言中有三种常量        字面量(直接量),就是直接写出来的,从写法上就可以看出值与类型等,例如:19,123.456等        名字常量 ...

  8. C语言 const与指针

    //const与指针 #include<stdio.h> #include<stdlib.h> void main(){ ; ; const int *p; p = & ...

  9. const修饰指针

    关于const修饰指针的情况,一般分为如下4种情况: ; const int *a =&b; //情况1 int const *a =&b; //情况2 int* const a =& ...

随机推荐

  1. Linux- 常用命令, Vim编辑器操作

    1.Linux命令: ls >查看列表(蓝色为文件夹,白色为文件) ls -a >显示包括隐藏文件的所有文件 ls -l >以列表的形式显示 ls -lh >类似于ls -l ...

  2. kali中的postgres怎么连接

    metasploit,默认使用的是postgresql数据库.在BT5或是Kali等专业的渗透系统中,postgresql已经被默认安装. 执行msfdb init会自动创建一个默认的用户名密码都是m ...

  3. vue 项目中当访问路由不存在的时候默认访问404页面

    前言: 在Vue项目中,当访问的页面路由不存在或错误时,页面显示为一片空白.然而,通常我们需要对访问url不存在或者错误的情况下添加默认的404页面,即not found页面. 一般的处理方法是: 在 ...

  4. UOJ #269. 【清华集训2016】如何优雅地求和

    UOJ #269. [清华集训2016]如何优雅地求和 题目链接 给定一个\(m\)次多项式\(f(x)\)的\(m+1\)个点值:\(f(0)\)到\(f(m)\). 然后求: \[ Q(f,n,x ...

  5. background问题

    1.如果是小图的背景图 background: url("@{images-dir}/homepage/our_pro_2x.png") no-repeat 0 0; backgr ...

  6. Linux新手随手笔记1.5

    FHS Linux / 代表根目录 /root  管理员的家目录 /boot  启动引导文件,以及开机菜单都会保存在里面 /bin     保存我们系统中命令的目录,不止bin,只要带bin的比如sb ...

  7. Docker 核心技术之网络管理

    为什么需要Docker网络管理 容器的网络默认与宿主机.与其他容器都是相互隔离. 容器中可以运行一些网络应用(如nginx.web应用.数据库等),如果要让外部也可以访问这些容器内运行的网络应用,那么 ...

  8. 关于echarts.js 柱形图

    echarts.js官网: http://www.echartsjs.com/index.html 这是我所见整理最详细echarts.js 柱形图博客: https://blog.csdn.net/ ...

  9. 【微信小程序】rpx尺寸单位的应用

    前言:微信小程序中的rpx尺寸单位用起来很方便.他是怎么实现计算的呢?(这里要注意的是,常规浏览器解析css代码的时候会把font-size小于12px的字体转成12px,不会让他小于12px的,而微 ...

  10. Linux(Ubuntu)使用日记------Mysql编码(utf-8)的设置

    Mysq版本:5.7.21 操作系统:Linux(Ubuntu) 整个操作的基本思路如下(包括问题的解决思路,想要直接解决问题的可以先看最后的命令总结) 检查mysql编码 找到Mysql的配置文件 ...