常量指针 与 指针常量(指针是常量)
记忆/摘要
常量指针:
1、含义:常量的指针——指针指向的内容是常量
2、语法:常量前,指针后,所以const在前,*在后——const *
指针常量:
1、含义:指针的常量——指针本身是个常量
2、语法:指针前,常量后,所以*在前,const在后——*const
常量指针(常用!重点!)
常量指针:指针指向的内容是常量
语法:const *
1、常量指针说的是不能通过这个指针改变变量的值
但是可以通过其他的引用来改变变量的值。
int main() {
//-------------------------------------- 验证: 不能通过常量指针来改变变量的值
int const *p1; // 常量指针
int a = 4;
p1 = &a;
// *p1 = 5; // 编译错误,不能通过常量指针p来改变值
//-------------------------------------- 验证: 变量中的值可以通过其他的引用、或变量自身来改变
a = 5; // 正确,此时*p==5
int *p2 = &a; // 另一个指针
*p2 = 6; // 正确,此时*p==6
}
2、常量指针指向的值不能改变,但是这并不意味着指针本身不能改变,
常量指针可以指向其他的地址。
//-------------------------------------- 验证: 常量指针指向的地址可以更改
int main() {
int a = 4;
int b = 5;
const int *p; // 常量指针
p = &a; // 正确,此时*p==4
p = &b; // 正确,此时*p==5
// *p = 6; // 编译错误,不能通过常量指针p来改变值
}
指针常量(不常用)
指针常量是指 指针本身是个常量,不能再指向其他的地址
语法:*const
1、指针常量指向的地址不能改变,但是地址中保存的数值是可以改变的,
可以通过其他指向 该指针的地址 的指针来修改。
int main() {
//-------------------------------------- 验证: 指针常量指向的地址不能改变,但是地址中保存的数值是可以改变的
int a = 4;
int b = 5;
int *const p = &a; // 指针常量 // 要马上初始化(同常量),之后无法赋值
// p = &b; // 错误,无法赋值
*p = 10; // 正确
//-------------------------------------- 验证: 可以通过其他指向 该指针的地址 的指针来修改(不重要,几乎不会用到)
int **pp = &p; // 正确,但会出现警告
printf("%d", *p);
*pp = &b; // 正确
printf("%d", *p);
}
指向常量的指针常量(不常用)
指向常量的常指针是以上两种的结合
语法:const * const
int const *const p;