目录
这篇文章的目的是为了理解"常量指针"和"指针常量"两个概念,很是头疼;
后来发现了一种方法,能够方便的记忆,这种方式就是抛弃这两个中文词汇;
为什么要记忆这两个词汇呢,明白其作用以及用法,就已经足够了啊;
如果面试被问到,也没有关系;
那么,从现在开始,先忘记这两个词汇,按照下面的步骤进行理解记忆:
首先,理解常量和指针两个概念,下面分别定义了一个int
类型的常量,以及一个指向int
类型变量的指针:
定义一个int
类型的变量, 下面两种定义方式都是可以的:
// int 类型的常量
const int a = 10; // 常量声明时,必须初始化;
int const a = 10; // 这种定义方式也是可以的
定义一个指向int
类型变量的指针:
int a = 10; // 定义一个int类型的变量
int * ptr = &a; // 定义一个指向int类型变量的指针;
重点来了,
其次,对于c++中的基本数据类型,例如int
, double
等都有变量, 常量之分;
同样,对于指针*
,也属于c++中的一种数据类型,肯定也有对应的常量;
那我们就想了,常量这个词代表的含义是不变,那么有两种角度来描述不变这种性质:
- 指针本身是常量:表示指针的指向是不能被改变的;
- 指针指向的对象是常量: 表示指针所指向的对象是个不能被改变;
(有没有发现,两者是一种的深度上递进的关系)
最后,最重要的是如何看懂代码和写出代码呢?
要有一个清晰的概念,在指针标识符*
前面的是用于修饰指针所指向的对象,指针标识符*
后面的用于修饰指针本身;
如何记住上面这句话呢,例如,我们创建一个指针变量,方式如下:
int * ptr = &a;
指针标识符前面的int
表示的是指针所指向对象的类型,因此,指针标识符*
前面的都是用来修饰指针所指向对象的状态;
所以,想要表示一个指针指向的对象是常量, 如下:
int a = 10;
const int * ptr = &a;
int const * ptr = &a; // 常用前者
表示一个指针本身是常量:, 如下;
const int a = 10;
int * const ptr = &a;
测试程序如下:
#include <iostream>
using namespace std;
int main(){
// 指针所指向的对象是常量,指向的对象不可以改变;
int a = 10;
const int * ptr = &a;
int b = 20;
ptr = &b;
// 指针本身是常量,指针的指向不可改变
int c = 30;
int * const ptr1 = &c;
*ptr1 = 40;
return 0;
}