Fork me on GitHub

指针篇:指针与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变量内存地址不一致。

posted @ 2022-08-14 19:45  张一默  阅读(65)  评论(0编辑  收藏  举报