快速理解const修饰指针

  • Post author:
  • Post category:其他



目录


什么是const?


为什么const要与指针结合?


const与指针结合三种情况的快速掌握


什么是const?

#include <iostream>
using namespace std;

int main() {
	const int a = 10;
	//a = 20; 解开注释后报错信息:表达式必须是可修改的左值
}

const是常量限定符,限定某一变量不可被修改。如上述在win10系统下的VS2019环境下运行的C++代码,如果在使用const修饰变量a后再去修改a的值,就会出现报错,报错信息则是“表达式必须是可修改的左值”。也就是说,在使用const修饰了某一个变量后,这个变量就不可以再被修改了。

为什么const要与指针结合?

#include <iostream>
using namespace std;

int main() {
	int a = 10;
	int* pa = &a;// 此时(*pa)==10

	int b = 20;
	pa = &b;// 此时(*pa)==20
}

因为普通的指针在使用中并不安全,很可能会被随意指向别的空间,使程序具有安全隐患。如以上C++代码,指针pa可以随意指向变量a或者b,这正是指针的方便之处,但同时也是它的隐患。所以需要使用const来限制指针,降低风险,如下述C++代码。

#include <iostream>
using namespace std;

int main() {
	int a = 10;
	int* const pa = &a;// 此时(*pa)==10

	int b = 20;
	//pa = &b; 解开注释后报错信息:E0137 表达式必须是可修改的左值
}

可以看到在给指针变量加了const后,再将指针变量pa指向变量b后就会出现报错,这是const与指针结合的第一种情况,共三种情况,将在下文中仔细阐述。

const与指针结合三种情况的快速掌握

在初次接触const与指针结合时,难免有些手足无措,但通过分析,仍可以快速掌握。用const修饰的指针有三种,常量指针,指针常量,指向常量的指针常量。看名字确实不好理解,下面有方便的方法快速理解。这个方法只需要观察const后的表达式即可。

#include <iostream>
using namespace std;

int main() {
	int a = 1;
	int b = 2;
	int c = 3;

	int* const pa = &a;//情况一:指针常量。
	const int* pb = &b;//情况二:常量指针。
	//int const * pb = &b;情况二:常量指针。
	const int* const pc = &c;//情况三:指向常量的指针常量。

	//pa的值是a的地址(pb、pc同理)
	//(*pa)的值是a的值((*pb)、(*pc)同理)
}

前提:如上述C++代码。首先我们需要知道pa、pb、pc均为指针变量,pa的值就是a的地址(pb、pc同理)。(*pa)则是对指针变量解引用,它的值就是a((*pb)、(*pc)也同理)。

情况一:指针常量。如 int* const pa = &a 这样的,const后直接跟指针变量pa,代表pa的值不变,也就是说pa不可以再指向别的变量(如果指向别的变量,pa就会保存别的变量的地址,就会被改变,这是不被允许的)。但a的值可以改变,因为这样做并不会改变a的地址。

情况二:常量指针。如 const int* pb = &b (它与 int const * pb = &b 是等价的)这样的,const后跟的是 *pb,(*pb)也就是b,这代表b的值不可以改变。但是可以改变pb指向的变量。

情况三:指向常量的指针常量。如 const int* const pc = &c 这样的。它有两个const,第一个const后跟的是 *pc,代表c的值不可以改变,第二个const后跟的是pc,代表pc不可以指向别的变量。所以这样的情况下,pc即不可以指向别的变量,又不可以通过解引用来修改c的值。



版权声明:本文为weixin_57761086原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。