C语言中的const,大家get到了吗?

一、const是什么?

const是一个C语言(ANSI C)的关键字,具有着举足轻重的地位。它限定一个变量不允许被改变,产生静态作用。使用const在一定程度上可以提高程序的安全性和可靠性。另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一定帮助。

我们称const为常量修饰符,表示一个变量如果被const修饰了,那么它就不具备了变量的属性,而是具有一定的常量属性,像常量一样不可被修改。
这里为什么我们不说绝对一点,表示它修饰的内容就是常量呢?看下面这幅图。我们知道定义一个数组的时候(非C99),不能使用变量来定义数组大小,而是使用常量,如果说const修饰的就是一个常量,那么这里编译器是不会报错的,由此看来,const修饰的内容仍然保留了一部分变量的属性。我们可以说const是将一个变量常量化了,这个被修饰的变量可以被称为常变量
在这里插入图片描述

二、const的一些用法

1.const修饰变量

当const修饰了这个n变量之后,这个n后续是不可被更改的,我们查看报错就能发现,这个n在之后是不能被当作左值修改的。
在这里插入图片描述
还有一种错误写法:注意const修饰变量的时候,必须初始化
在这里插入图片描述
下面是正确的写法:

const int a = 10;

当然了修饰变量的时候,改变const的位置没有影响的。const和int的位置互换与上面一样的结果

int const a = 10;

2.const修饰指针

这时候我们就需要考虑到const,int ,*三者之间的位置关系了。

const int *p; int const *p ; int *const p; const int *const p

const int *p

const 的位置在*的左边,所以它修饰的是*p,即*p不能改变,也就是p指向的地址的数据是常量。

下面举例说明:
错误示例(想要改变*p)

int main()
{
	int n = 0;
	const int* p = &n;
	*p = 20;
	return 0;
}

在这里插入图片描述
正确示例:能够更改的应该是p而不是*p的内容

int main()
{
	 int n = 0;
	const int* p = &n;
	//定义一个新的变量
	int m = 100;
	p = &m;
	printf("%d", *p);//我们通过更改p指向的地址,从而改变了*p的值
	return 0;
}

int const *p

这里的分析就是类似于上面那个,const此时是在*的左边,所以它修饰的是*p,即*p不能改变,也就是p指向的地址的数据是常量。

此处示例代码同上

int *const p

const此时放在了*的右边,那么它此时修饰的是p,即p是不能够更改的,也就是p指向的地址是不变的,但是这个地址存放的值可以更改

下面举例说明:
错误示例:(想要去更改p指向的地址

int main()
{
	int n = 0;
	int* const p = &n;
	int m = 100;
	p = &m;
}

在这里插入图片描述
正确示例:
改变的是p那块地址中的内容,而不能改变这块地址的位置

int main()
{
	int n = 0;
	int* const p = &n;
	*p = 100;//可以改变*p
	printf("%d", *p);
}

const int *const p

这里有两个const,对于第一个const来说,它在*的左边,它修饰的是*p,也就是说*p是不可更改的,对于第二个const来说,它在星的右边,那么它修饰的就是p,也就是p指向的地址是不变的,两者结合来看,意思就是地址与地址所存储的值都是不可更改的

这里的没什么好示例的,因为无法对*p以及p进行更改了。

总结

对于const修饰指针来说,其实重要的就是看它与*的位置

拓展思考二级指针与const

const int** ppa

int main()
{
	int a = 10;
	int* pa = &a;
	int m = 100;
	int* pb = &m;
	//const修饰的是**pa
	const int** ppa = &pa;
	//错误写法:不能更改**ppa,但是*ppa可以更改,ppa也可以
	//**ppa = 100;
	//正确写法:
	*ppa = &m;
	printf("%dn", **ppa);
	m = 1000;
	ppa = &pb;
	printf("%d", **ppa);
	return 0;
}

int* const* ppa

int main()
{
	int a = 10;
	int* pa = &a;
	
	int m = 100;
	int* pb = &m;
	int* const* ppa = &pa;
	//错误示例:const修饰的是*ppa,所以*ppa无法更改,但是ppa可以,**ppa也可以
	//*ppa = &m;
	//正确示例:
	ppa = &pb;
	printf("%dn", **ppa);
	**ppa = 1000;
	printf("%d", **ppa);
}

int** const ppa

int main()
{
	int a = 10;
	int* pa = &a;
	
	int m = 100;
	int* pb = &m;
	int** const ppa = &pa;
	//const修饰的是ppa,所以无法更改ppa
	//错误示例
	//ppa = &pb;
	//正确示例:*ppa和**ppa可以更改
	*ppa = pb;
	printf("%dn", **ppa);
	**ppa = 1000;
	printf("%dn", **ppa);

	return 0;
}

为什么会出现const?

百因必有果,C语言经历了漫长的发展才有了现在的一些语法,const的出现一定是有它的道理的。

const与误操作

我们来看看C语言底层实现字符串拷贝的函数strcpy,这里为什么我们要设置成const呢?我们已知是想要把strSource这个字符指针指向的字符串拷贝到strDestination中,如果在实现这个函数的内部,我们一不小心对strSource进行了误操作,那拷贝过去的结果还会是正确的吗?显然不是,使用const其实是一种保护措施,能够更方便让编译器知道这个变量是需要常量化,不可更改,及时的为我们警告
在这里插入图片描述

PS:考完试刚补上的博客,如果大家看到有什么问题,请多多指正我!!!

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
  

)">
下一篇>>