[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 =& ...
随机推荐
- SQL 行转列 PIVOT 学习示例
CREATE TABLE [StudentScores] ( ), --学生姓名 ), --科目 [Score] FLOAT, --成绩 ) select * from [StudentScores] ...
- Linux学习历程——Centos 7 ls命令
一.命令介绍 ls命令用于显示目录中的信息. ----------------------------------------------------------------------------- ...
- VS与Windbg调试
原文 : https://blog.csdn.net/fin86889003/article/details/20126593 原文 : https://blog.csdn.net/u014339 ...
- leetcode 54. Spiral Matrix 、59. Spiral Matrix II
54题是把二维数组安卓螺旋的顺序进行打印,59题是把1到n平方的数字按照螺旋的顺序进行放置 54. Spiral Matrix start表示的是每次一圈的开始,每次开始其实就是从(0,0).(1,1 ...
- 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading)
前言 接下来会陆续详细讲解EF Core 2.1新特性,本节我们来讲讲EF Core 2.1新特性延迟加载,如果您用过EF 6.x就知道滥用延迟加载所带来的灾难,同时呢,对此深知的童鞋到了EF Cor ...
- Elastic Stack-Elasticsearch使用介绍(五)
一.前言 前4篇将Elasticsearch用法的API和原理方面东西介绍了一下,相信大家对Elasticsearch有了一定的认知,接下我们主要从索引的建立到后期的一些优化做一些介绍: 二. ...
- ABP之session
ABP提供了一个IAbpSession接口,可以在不使用ASPNET的session的情况下获取当前用户和租户.IAbpSession还被ABP中的其他结构(如设置和授权系统)完全集成和使用. 注入s ...
- 浅谈background-size的几个属性值
前言: css应用中,我们常会碰到background-size的用法,不妨下面总结一下,以便后续查看. 一.先弄个简单的box框. <!DOCTYPE html> <html la ...
- Go之运算符
逻辑运算符用于连接布尔型表达式.在Java中不同于数学的逻辑表达 3<X<5 ,java 中应该写成 x>3 & x<5 "&" 和&quo ...
- golang项目练习
一.记账系统 1.该软件能够记录收入.支出,并能够打印收支明细表 2. 代码 package main import ( . "fmt" ) func menu() string{ ...