C语言const解析
一、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("%d\n", **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("%d\n", **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("%d\n", **ppa);
**ppa = 1000;
printf("%d\n", **ppa);
return 0;
}
为什么会出现const?
百因必有果,C语言经历了漫长的发展才有了现在的一些语法,const的出现一定是有它的道理的。
const与误操作
我们来看看C语言底层实现字符串拷贝的函数strcpy,这里为什么我们要设置成const呢?我们已知是想要把strSource这个字符指针指向的字符串拷贝到strDestination中,如果在实现这个函数的内部,我们一不小心对strSource进行了误操作,那拷贝过去的结果还会是正确的吗?显然不是,使用const其实是一种保护措施,能够更方便让编译器知道这个变量是需要常量化,不可更改,及时的为我们警告
PS:考完试刚补上的博客,如果大家看到有什么问题,请多多指正我!!!