指针篇:指针与const关键字
const关键字为C++/C中的关键字,const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。这个常类型可以是指针,也可以是int等变量。
const的用法常见有以下几种:
//const在*左边的情况:常量指针
const int *pt = &n;
int const *pt = &n;
//const在*右边的情况:指针常量
int *const pt = &n;
//比较复杂的情况
const int *const pt = &n;
const int const* pt = &n;
来看第一种:const int* pt
#include <iostream>
using namespace std;
int main(void)
{
int a = 10;
const int* pt = &a;
int b = 11;
pt = &b;//可以修改指向关系
*pt = 12;//系统报错:不允许通过指针修改值
a = 14;//变量可以通过其他引用修改值
return 0;
}
来看第二种:int const* pt
#include <iostream>
using namespace std;
int main(void)
{
int a = 10;
int const* pt = &a;
int b = 11;
pt = &b;//可以修改指向关系
*pt = 12;//系统报错:不允许通过指针修改值
a = 14;//变量可以通过其他引用修改值
return 0;
}
第三种:int *const pt
#include <iostream>
using namespace std;
int main(void)
{
int a = 10;
int* const pt = &a;
int b = 11;
pt = &b;//系统报错:不可以修改指向关系
*pt = 12;//允许通过指针修改值
a = 14;//变量可以通过其他引用修改值
return 0;
}
第四种:const int *const pt
#include <iostream>
using namespace std;
int main(void)
{
int a = 10;
const int* const pt = &a;
int b = 11;
pt = &b;//系统报错:不可以修改指向关系
*pt = 12;//系统报错:不允许通过指针修改值
a = 14;//变量可以通过其他引用修改值
return 0;
}
第五种:const int const* pt
#include <iostream>
using namespace std;
int main(void)
{
int a = 10;
const int const* pt = &a;
int b = 11;
pt = &b;//可以修改指向关系
*pt = 12;//系统报错:不允许通过指针修改值
a = 14;//变量可以通过其他引用修改值
return 0;
}
综上我们可以得到:
const在*号右侧 | int *const p | 指针常量:指针本身是个被const的常量 | 可以通过指针修改值,指针的指向关系不可变 |
const在*号左侧 | const int *p | 常量指针:指针的内容是被const的常量 | 不可以通过指针修改值,指针的指向关系可变 |
另外C++中规定不允许讲const类型得变量赋值给非const指针,想要打破这种限制必须强制类型转换(const_cast)。当然,如果你采用了指向指针得指针,这种情况会更复杂,维护难度也是指数级上升。比如当你使用一级或者多级间接关系时,不允许最上层的指针向进行const,这样是无效的,所以当你使用const时尽量避免多层间接关系,或者说避免指针与指针之间的const,比如以下两种情况应避免:
int n = 10;
int *pt = &n;
const int* pn = pt;//无效,避免多层套娃
const int **pp;
int *p1;
const int n = 10;
*pp = &n;//有效,将const类型的变量n地址赋值给*pp,并借用**pp进行访问
pp = &p1;//无效,不允许将非const类型指针用const类型指针访问
*p1 = 11;//第二步的前提下,原*p1的值并不是10,并且当p1的地址在部分操作系统下会随机访问到计算机禁止访问的空间,此时程序崩溃!!!
补充:const声明为内部链接,因此需要注意当const在头文件中使用时,所声明的变量只存在于包含于该头文件的c文件中,即使其他c文件也包含了同一个头文件,其内部的const变量和当前的C文件const变量内存地址不一致。
本文来自博客园,作者:{张一默},转载请注明原文链接:https://www.cnblogs.com/YiMo9929/p/16586149.html