c++指针常量和常量指针概述
个人理解,欢迎指正
这个简单,简单,简单(不要有心里压力:认为很难)
本文将会解决:
A、变与不变
B、判断指针常量和常量指针。
C、常量指针指针常量。本文不涉及。
1、概述
A、指针: 说到底,还是地址, 但是这个地址需要用一个变量保存起来,
B、为什么? 因为地址随机化。每个进程被创建的时的起始地址时不一样,基址不一样(为什么不一样?可以找下相关资料,每台计算机的运行情况不同,那么内存使用也是不同的,这就形成了地址多样化,如果固定进程起始地址,A机器可以运行程序,到了B机器可能就无法了,程序的起始地址在B机器山上被占用。),程序中对应的每个变量的地址也是变化的。 公式: 实际地址 = 基址 + 偏移 。这样的好处真是多多。
C、公式中,基址和实际地址是两个变量,实际地址随基址的变化而变化。(扯远了,这就是为什么要用一个变量来保存地址的原因(个人猜想))。所以,咱们常说的指针其实就包含了三部分: 指向的地址 、 变量本身的地址 和 指向地址的值。
D、实际使用中,我们经常的是指向的地址,很少用到变量本身的地址。 指针变量名就代表指向的地址, 比如 char *parr = "1234"; parr 代表了字符串“1234”的起始地址,而非parr变量本身的地址。 &parr 才表示变量本身的地址。
2、形式
这里,以int为例。
| int a = 1; |
| int b = 2; |
A、指针常量: 类型 * const 指针变量名。比如:
| int * const pp = &a; |
B、常量指针: const 类型 * 指针变量名。 比如
| const int *p = &a; |
形如上面,如果不写出来,怎么知道哪个是 指针常量 和 常量指针
3、判断(重点)
细心点就能发现, 这两个名词中的关键字就两个, 指针和常量。 const 就表示的是常量, * 理解为地址解析运算符(个人见解),简单点,我们就理解为指针。
A、解读顺序, 以指针表达式为例,默认从左到右。
B、举例说明: cosnt int *p = & a; 首先解读的是 const ,其次才是 * (地址解析运算符)。所以,这是个 常量指针。谁在前,就先读谁。const 在前, 就先读 const, * 在前,就先读 * 。
C、还不会判断? 找几个例子,多试试就会了。 很简单。
4、定义
| 常量指针 | 指向的地址可以变, 但是指向地址的内容不能变 |
| 指针常量 | 指向的地址不能变, 但是指向地址的内容可以变 |
5、变与不变(重点)
A、这里有一个参考点: 那就是const。
B、const 的位置决定了什么变,什么不变。 const 后面紧跟的是什么, 变量名 还是 类型
C、举例A
const int *p = &a;
这是一个常量指针。 按照const后面紧跟的是什么, 赋值运算符左边的表达式被分为两部分: const int 和 *p
const int : 表示 类型是一个不可变整形。
*p:表示指向地址的内容。
连起来就是: 指向地址的内容的类型是一个不可变整形。
所以,执行 *p = 2; 就会报错。
D、举例B:
int * const pp = &a;
这是一个指针常量,按照 const 后面紧跟的是什么。 赋值运算左边被分为3部分。 int 、* 和 const pp
int :整形,指向地址的内容的类型
const pp : pp代表的就是指向的地址, 再加上const, 就是说,指向的地址是一个常量。
* : 地址解析运算符。
连起来: 指向的地址是一个常量,指向地址的内容是整形。
所以, *pp = 3; 可以修改成功。
6、一个例子
上面的还是太抽象,来个实际的帮助理解。
A、定义和声明如下(自己先判断下,哪个是指针常量,哪个是常量指针):
| int a = 1; |
| int b = 2; |
| const int *p = &a; |
| int * const pp = &a; |
B、查看上面的变量的地址和值是多少
| cout << "\n\n &a = " << &a << ", a= " << a << endl; |
| cout << "&b = " << &b << ", b= " << b << "\n\n"; |
| cout << "&p = " << &p << ", p = " << p << ", *p = " << *p << endl; |
| cout << "&pp = " << &pp << ", pp = " << pp << ", *pp = " << *pp << endl; |
C、我这里显示的结果:

D、解读
上面的代码发现, 指针变量名就是指针指向内容的地址。
E、下面尝试修改指针指向的内容。
| cout << "\n\n--下面开始尝试修改值----\n\n"; |
| p = &b; // 常量指针, 指向的地址可以变, 但是指向地址的内容不能变, OK |
| cout << "&p = " << &p << ", p = " << p << ", *p = " << *p << endl; |
| // *p = 2; // 常量指针, 指向的地址可以变, 但是指向地址的内容不能变。error. |
| *pp = 3; // 指针常量, 指向的地址不能变, 但是指向地址的内容可以变。 |
| cout << "&pp = " << &pp << ", pp = " << pp << ", *pp = " << *pp << endl; |
D、结果:

7、源码:
int a = 1;
int b = 2;
const int *p = &a;
int * const pp = &a; cout << "\n\n&a = " << &a << ", a= " << a << endl;
cout << "&b = " << &b << ", b= " << b << "\n\n"; cout << "&p = " << &p << ", p = " << p << ", *p = " << *p << endl;
cout << "&pp = " << &pp << ", pp = " << pp << ", *pp = " << *pp << endl; cout << "\n\n--下面开始尝试修改值----\n\n";
p = &b; // 常量指针, 指向的地址可以变, 但是指向地址的内容不能变, OK
cout << "&p = " << &p << ", p = " << p << ", *p = " << *p << endl;
// *p = 2; // 常量指针, 指向的地址可以变, 但是指向地址的内容不能变。error.
*pp = 3; // 指针常量, 指向的地址不能变, 但是指向地址的内容可以变。
cout << "&pp = " << &pp << ", pp = " << pp << ", *pp = " << *pp << endl;
c++指针常量和常量指针概述的更多相关文章
- C和指针 第三章 指针常量与常量指针
c语言中声明常量的两种方式 const int value int const value 如果要声明常量的指针,即指向常量的指针,则可以参考上面的常量声明修改一下 const int *ptr in ...
- c++ 指针常量,常量指针
当const遇到指针 一般来说,const修饰指针可以分为下面的集中情况. 描述 例子 含义 备注 const在*的左边 const int *b=&a; int const *b=& ...
- C++中指针常量和常量指针的区别
在C++学习使用过程中,每个人都不可避免地使用指针,而且都或多或少的接触过常量指针或指针常量,但是对这两个的概念还是很容易搞糊涂的. 本文即是简单描述指针常量和常量指针的区别. 常量指针 定义: 又叫 ...
- 【转】C++易混知识点1: 指针常量和常量指针的区别,附有详细案例解释
熟悉C++也已经有一些年头了,今天突然翻出当年浏览的书籍,对一些概念居然生疏了,指针常量和常量指针由于 指针 这一特殊的对象而变得难以区别.因此,在思考再三之后,决定写下该篇总结,加强对他们的区别: ...
- 【转】const int *p和int * const p的区别(常量指针与指向常量的指针)
[转]作者:xwdreamer 出处:http://www.cnblogs.com/xwdreamer 对于指针和常量,有以下三种形式都是正确的: const char * myPtr = &am ...
- C++ 指针常量和常量指针
1.指针常量(*const):对应指针变量,即指针本身是常量,指针指向的内容可以被修改. 2.常量指针(const*):常量的指针,即指针指向的内容不能被修改,但指针本身是变量,可以被修改.
- c语言常量指针赋值给变量指针导致警告
常量指针定义:常量是形容词,指针是名词,以指针为中心的一个偏正结构短语.这样看,常量指针本质是指针,常量修饰它,表示这个指针乃是一个指向常量的指针.指针指向的对象是常量,那么这个对象不能被更改.常量指 ...
- 数组/指针/const/字符串常量的使用传值问题
#include<stdio.h> #include<string.h> int main() { ] = "abcd"; //常指针a指向字符串常量&qu ...
- 再学C/C++ 之 指针常量 和 常量指针
(1)指针常量,将指针的指向当成常量.即指针变量的值只能在定义的时候初始化,定义后不能修改,也就是说不能改变指针变量的指向.但是不影响所指对象的访问特征.其定义形式为: 类型 * const 指针 / ...
随机推荐
- 洛谷 P6860 - 象棋与马(找性质+杜教筛)
题面传送门 首先我们来探究一下什么样的 \((a,b)\) 满足 \(p(a,b)=1\).不难发现只要点 \((1,0)\) 能够到达,那么网格上所有点都能到达,因为由于 \((1,0)\) 能够到 ...
- IOI 2020 国家集训队作业
\(\checkmark\) 试题一 完成情况 试题二 完成情况 试题三 完成情况 cf549E cf674G arc103_f \(\checkmark\) cf594E agc034_f agc0 ...
- Java培训班学员如何找工作?如何过试用期?
在本文里,首先将结合我了解的多家培训班辅导学员就业的情况,来讲讲培训班学员如何高效找工作.由于本人在周末会兼职在培训班讲课,也帮助过不少学员成功入职,所以下文还会给出"培训班学员如何快速适应 ...
- mysql—mysql错误Every derived table must have its own alias解决
Every derived table must have its own alias 这句话的意思是说每个派生出来的表都必须有一个自己的别名. 一般在多表查询时,会出现此错误. 因为,进行嵌套查询的 ...
- Redis | 第8章 发布订阅与事务《Redis设计与实现》
目录 前言 1. 发布订阅 1.1 频道的订阅与退订 1.2 模式的订阅与退订 1.3 发送消息 1.4 查看订阅消息 2. 事务 2.1 事务的实现 2.2 WATCH 命令的实现 2.3 事务的 ...
- R2CNN模型——用于文本目标检测的模型
引言 R2CNN全称Rotational Region CNN,是一个针对斜框文本检测的CNN模型,原型是Faster R-CNN,paper中的模型主要针对文本检测,调整后也可用于航拍图像的检测中去 ...
- vim文本编辑器的基本使用
vim文本编辑器的基本使用 1. vi和vim的区别和联系 可以说vim是vi的增强版,在使用vim编辑文本时,可以根据字体颜色来判断编写程序的正确性. 2. vim文本编辑器的常用命令 1. 编辑指 ...
- 学习java的第七天
一.今日收获 1.看完全学习手册上java关键字与标识符两节 2.了解了java的关键字与标识符 二.今日难题 1.基本都理解 三.明日目标 1.继续看完全学习手册上的内容 2.加油!
- kafka安装(单机版)
一.安装kafka(单机版) 因为现在的kafka安装包都自带zookeeper,所以如果是安装本地单机版kafka,不需要额外去安装zookeeper,使用自带的就可以了. 1.下载kafka 2. ...
- 学习Vue源码前的几项必要储备(一)
从接下来的一段时间里,Mg要进行阅读源码的工作.再阅读源码前,梳理一下准备工作. 7项重要储备 Flow 基本语法 发布/订阅模式 ES6+ 语法 原型链.闭包 函数柯里化 event loop 1. ...