const的使用
const int*x与int* const x分别指指针指向常量 和 指针常量
可以形象写为(const int )* x 与 int *(const x)
#include<stdio.h>
int main(){
int x=1,y=2;
int* const m=&x;
const int* n = &y;
y++;
(*n)++;
x=2;
m=&y;
}
m是指针常量,对m的重新赋值非法。
对n的重新赋值可以。
n是指向常量的指针,所以不能通过解引用n的方式进行自增自减等操作,但是对y本身操作没有问题,因为y没有限定为常量。同时,可以修改n的地址。
常量指针可以指向普通变量
int x=1;
const int*a=&x;
此时x可以修改,但不能通过*a的形式修改
尽量不要用普通指针指向常量,可能发生未知错误。
const类型指针转换
非const可以以赋值形式隐式转型成const(若以高阶低阶来理解,那么就是非const低于const
const变量如果想赋值给非const变量必须要显式转型。
int main(){
int x=1;
const int y=3;
const int* a=&y;
int* b=&x;
const int*a1=b;//合法,非const隐式转型
int*b1;
b1=a; //非法
b1=(int*)a;//合法
return 0;
显示转型不改变原变量类型
int main(){
const int* a;
const int x=1;
a=&x;
(*(int*)a)++;//x=2
(const int*)a;
(*a)++;//报错
return 0;
}
对a第一次解引用时发生显式转型,把a从原本的const int*类型看成普通的int*类型,解引用并改变值的操作合法。
但是,这里的显式转型是暂时的,并不改变a的类型。也可以说,显式转型只是在操作的时候用另外的方法读取变量而已,并不涉及对变量本身属性的更改。
第二次解引用时,a仍然是const int*变量,再解引用并自增就会报错。