权限与初值
一个const
#include <iostream>
int main() {
int x = 1;
int y = 2;
const int* ptr1 = &x;
int const* ptr2 = &x;
int* const ptr3 = &x;
//*ptr1 = 3;
ptr1 = &y;
//*ptr2 = 3;
ptr2 = &y;
*ptr3 = 3;
//ptr = &y;
return 0;
}
从左往右看,有指针了,就是改值和改指向的问题
总的来说const只能作用一个,要么是 *,要么是变量ptr;从左往右挑近的限制(缩小权限)
限制效果如下:
1.指针变量 可以通过解引用更改值,不可以更改指向 常量指针 (必须要赋初值)ptr3
2. * 不可以通过解引用更改值,可以更改指向 非常量指针(可以不赋初值) ptr1,2
注:不是不可以解引用
顾名思义,常量(不能修改的)指针(指向一个变量),那么就是只能指向一个且一次,那就一定要赋初值,(有妻且不能离婚)
两个const
#include <iostream>
int main() {
int x = 1;
int y = 2;
const int* const ptr4 = &x;
const int const* ptr5 = &x;
int const* const ptr6 = &x;
cout << *ptr4 << endl;
//*ptr4 = 3;
//ptr4 = &y;
//*ptr5 = 3;
ptr5 = &y;
//*ptr6 = 3;
//ptr6 = &y;
return 0;
}
也是非常简单,有//的语法错
这个ptr5和上面的ptr1,ptr2 一样
ptr4和ptr6就只能通过解引用读取里面的值 不能更改指向和更改值
有个关于typedef的坑
#include <iostream>
using namespace std;
typedef int* pint;
int main() {
int x = 1;
int y = 2;
const pint ptr7 = &x;
*ptr7 = 3;
//ptr7 = &y;
cout << typeid(ptr7).name() << endl;
return 0;
}
一般都会认为 等价于 const int* ptr7
实际上是int* const ptr7
typedef定义的新的名字会放在最前面