C/C++ const修饰指针变量的三种情况

在C/C++中, const修饰指针变量, 有三种情况, 以 int* 为例, 三是以下种情况

原则: const修饰谁, 谁就不能被修改, 否则编译出错

第一种 和 第二种: const int* p; 和 int const * p;

这两种情况是相同的, 这两种情况变量p的类型是const int* 型, 此时const修饰的就是p所指向的内容, 也就是说p解引用之后的值不

能被修改,  这种情况可以不用在定义变量时初始化 .

第三种 : 情况是 int* const p = &a;

这种情况p的类型为int* const, 此时const修饰的是指针变量p, 所以说p的值不能变, 换句话说就是指针指向不能改变

这种情况下, 常指针变量必须在定义时初始化, 也就是在定义时就给常指针一个值, 如: int* const p = &a; 

不光是常指针, 所有的常量都只能在定义时给初值, 之后不能再改变常量的值.  所以说, 定义常指针不给赋初值的行为, 虽然编译器

扫描二维码关注公众号,回复: 9655667 查看本文章

不会报错, 但这种行为是无意义的, 因为这个常指针是一个野指针, 还不能给它再赋值, 程序中也就不能使用. 所以说要在定义时初始化.

扩展 :

那么const int* const p = &a; 或 int const * const p = &a; 呢?

这两个声明含义相同, 是第一(二) 种 和 第三种 的结合, const即修饰了指针所指内容, 也修饰了指针本身, 所以不管是指针的指向

还是指针所指的内容, 都不可改变

const int const * const p = &a; 这种写法是错的, int左右的两个const 重复修饰了p所指向的内容, 编译报错

第一种 举例如下:

#include<stdio.h>
int main() {
	int arr[10];
	int a = 10;
	const int* p1;
	const int* p2;
	//可以在定义时初始化
	//如const int* p1 = arr; 
	//const int* p2 = &a;
	p1 = arr;//正确
	p2 = &a;//正确

	*p1 = 10;//错误
	*(p1 + 1) = 10;//错误
	p1[0] = 10;//错误
	p1[1] = 10;//错误

	*p2 = 20;//错误

	p1 = &a;//正确
	p2 = arr;//正确
	return 0;
}

第二种 举例如下:

#include<stdio.h>
int main() {
	int arr[10];
	int a = 10;
	int const * p1;
	int const * p2;
	//可以在定义时初始化
	//如int const * p1 = arr; 
	//int const * p2 = &a;
	p1 = arr;//正确
	p2 = &a;//正确

	*p1 = 10;//错误
	*(p1 + 1) = 10;//错误
	p1[0] = 10;//错误
	p1[1] = 10;//错误

	*p2 = 20;//错误

	p1 = &a;//正确
	p2 = arr;//正确
	return 0;
}

第三种 : 举例如下

#include<stdio.h>
int main() {
	int arr[10];
	int a = 10;
	int* const p1 = arr;
	int* const p2 = &a;
	int* const p3;//编译不会报错, 但没有意义
	int* const p4;//编译不会报错, 但没有意义
	p3 = arr;//错误
	p4 = &a;//错误

	*p1 = 10;//正确
	*(p1 + 1) = 10;//正确
	p1[0] = 10;//正确
	p1[1] = 10;//正确

	*p2 = 20;//正确

	p1 = &a;//错误
	p2 = arr;//错误
	return 0;
}
发布了223 篇原创文章 · 获赞 639 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_41071068/article/details/103059836