1. 指针常量
也叫常指针,顾名思义,也就是指针的值在初始化之后就不能改变了,即不能改变该指针的初始化指向。
int *cosnt p
这里const
是用来修饰限定p
的,所以p
是一个常量,但是*p
是一个变量,也就是说p
不能指向新的内存单元(赋予新地址值),但是*p
的值可以被改变,同时也改变了p
指向内存单元(地址)的值(比如下面的a),同理,改变p
所指向的内存单元的值(比如下面的a),也就改变了*p
的值。
int a = 10;
int b = 20;
int *const p = &a; //常指针在初始化的时候指向a;
p = &b; //错误,p不能改变指向的内存单元,也就是p的值不能改变
*p = 11;
//*p是变量 因为它不是由const直接修饰的
//所以它可改变指向内存单元地址的值
//也就是a的值可以被改变 此处a被修改为11
printf("%d",a); //a = 11;
a = 12;
printf("%d",*p); //*p = 12;//也可以通过改变a的值来改变*p的值
2. 常量指针
也叫指向常量的指针,也就是不能通过指针本身去间接修改所指向的常量的值。
const int *p
首先,这里的const
是用来修饰限定*p
的,*p
是常量,即不能修改它所指向的内存单元的值。其次,p
并没有const
修饰限定,所以p
是变量,因此可以修改p
的值,即可以修改p
指向的内存单元(地址),p
可以有新的指向。
int a = 10;
int b = 20;
const int *p = &a; //指向a
*p = 11; //错误 不可通过改变指针本身去间接修改指向内存单元的值
p = &b; //正确 可以修改p的指向,因为p是变量
printf("%d", *p);//*p = 20;
3. 巩固练习
const int a = 10;
int *p;
p = &a; //赋值不合法 const int 型数据的地址赋值给int指针 不合法
p = (int *)&a; //合法赋值 强制转换
*p = 20;
printf("%d", a);//a的值并没有因为指针的赋值而改变 因为a是只读变量 不能被改变值
printf("%d", *p); //*p=20 可以改变