1. 常量指针:
形式:const 数据类型* 指针名称;
const int* p = &a;
'*'代表指针,由于const在*号之前,因此中英文都称之为常量指针。const后面爱着的是int*,因此const关键词修饰的是指针。因此*解引用的操作是不被允许的。即:指针代表的地址可以发生更改,但是不可以通过解引用的方式对指针代表的地址内的数据进行更改。
2. 指针常量:
形式:数据类型* const 指针名称;
int* const p = &a;
‘*’代表指针,const关键词位于*之后,因此按照中英文翻译,都应该是指针常量。由于const修饰的是指针名称p,因此对指针p的再赋值是不被允许的,而通过解引用的方式修改指针p代表的地址内的数据是可行的。
3. 常量指针常量:
形式:const 数据类型* const 指针名称;
const int* const p = &a;
非常简单,const既修饰指针,又修饰名称p,因此解引用*的方法与修改p的方法都是不合法的。,指针不可以被再赋值其他的地址,也不可以通过解引用修改指针代表的地址内的数据。
#include<iostream>
using namespace std;
int main() {
//const修饰的指针
int a = 10;
int b = 20;
//情况一:常量指针
//形式:中文中常量在指针的前面,因此const在声明的最前面
const int* p;
//对于常量指针,指针代表的地址可以更改,但是这阵代表的地址内存放的数据不可以更改
//合法,因为原先指针p存放的是整型数据a的地址,现在存放的是整形数据b的地址,指针代表的地址发生改变,是可行的
p = &b;
//不合法
//*p = 40;表达式必须是可以修改的左值,因此我们不可以通过解引用的方式通过常量指针修改指针代表的数据内的数值
//情况二:指针常量
//形式:中文中指针在常量的前面,因此*号要在const之后。毕竟const修饰q,因此const q作为一个整体,已经是常量的存在
int* const q = &a;
//对于指针常量,指针代表的地址不可以更改,带视地址内存放的数据是可以更改的
//不合法,因为q是指针常量,指针一开始代表的地址是a的,而现在又将b的地址赋值给指针q,因此不满足定义
//q = &b;
//合法,虽然指针常量的地址不可以更改,但是他代表的地址内存放的数据是可以更改的,因此我们可以通过解引用的方式
//通过指针常量修改地址内的数值
*q = 50;
//情况三:const修饰指针修饰常量
const int* const w = &b;
//不论是地址还是地址内的数值,都不可以修改
system("pause");
return 0;
}
附录:常量指针,试图修改指针代表的地址内的数据:
指针常量,视图修改指针代表的地址: