目录
1.const的理解
const是C/C++中的一个关键字,用于修饰变量。当一个变量被const修饰,这个变量就被赋上了只读属性,该变量里的数据只能被访问。如果后续用户想要对其中的值直接进行修改,则编译器将会报错。
2.const修饰变量
我们来看下面一段代码:
#include<stdio.h>
int main()
{
const int a = 10; //const修饰a
a = 9; //对a直接进行修改
return 0;
}
我们可以看到,以上代码是无法通过编译的,编译器提示我们a是const对象,是不可修改的左值。因此我们不可以直接进行修改。
但是,a的值可以通过指针的方式间接修改,如下:
#include<stdio.h>
int main()
{
const int a = 10;
printf("before : %d\n", a);
int* p = &a; //取出a的地址
*p = 9; //间接修改a
printf("after : %d\n",a);
return 0;
}
我们运行代码可以发现编译器并没有报错,成功修改了a的值。
既然const修饰的变量具有常属性,那它可不可以在定义数组的时候用来表示数组的大小呢?
#include<stdio.h>
int main()
{
const int a = 10;
int arr[a] = { 0 }; //开辟一个大小为10的数组
return 0;
}
显然我们发现这是不行的。虽然a具有了常量的性质,不可被修改,但它本质上还是个变量,因此const修饰的变量可以也可以叫做常变量。
总结
1.const修饰的变量,不可直接被修改,可以间接修改(使用指针)。
2.const修饰的变量,本质是变量,只是具有了常属性。
3.const修饰函数
1.const修饰函数返回值
当函数的返回值是通过"值传递"返回时,此时加上const则没有意义。因为函数会把返回值复制到外部寄存器中,然后再对这个寄存器的值进行操作,如下:
#include<stdio.h>
const int text01() //没有意义的
{
const int a = 10;
return a;
}
int main()
{
int b = text01();
b++;
return 0;
}
此时运行程序可以正常通过编译,b自增变为11
而如果返回值是以"地址传递"的方式进行返回时,此时函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。如下:
#include<stdio.h>
const int* text01() //const修饰int*
{
static int a = 10;
return &a;
}
int main()
{
const int* b = text01();
*b = 10; //error,b所指向的内容不可被修改
return 0;
}
此时编译器则会报错,因为b所指向空间(即a)中的数据是不可修改的
2.const修饰函数参数
当我们不希望在函数中对我们的原始数据进行修改时,我们就可以使用const修饰函数参数,使得我们的代码更加安全。如下:
#include<stdio.h>
void text02(const int* p1)
{
printf("value=%d", *p1); //打印a的内容10
*p1 = 5; //错误
}
int main()
{
int a = 10;
text02(&a);
return 0;
}
当我们对p1指向空间的数据进行打印时,编译器成功打印出a的值10;而当我们试图对a的数据进行修改时,编译器就会报错。
3.总结
无论是const修饰函数参数还是修饰返回值,都可以避免重要数据被无意间更改,导致程序出错。
4.const修饰指针变量
const修饰指针变量有以下几种情况:
int a = 10;
const int* p = &a; //情况1
int const* p = &a; //情况2
int * const p = &a; //情况3
const int * const p = &a; //情况4
对于const修饰指针,我们有一个原则就是“近水楼台先得月”。
首先我们要清楚,当p和*p充当左值时,p代表的是指针变量,存储着a的地址;而*p则代表内存空间a,存储着数据10。
对于情况1,由于p离*最近,则p先与*组合,const修饰的就是*p,说明内存空间a的数据10不可被修改。
对于情况2,由于p离*最近,则p先与*组合,const修饰的就是*p,与情况1一致。
对于情况3,由于p离const最近,则p先与const组合,const修饰的就是p,即代表p存储的内容不可被修改。
对于情况4,由于p和*p同时被const修饰,则说明无论是a的内容,还是p存储的内容都不可以被修改。
总结
const修饰指针变量遵循"就近原则"。
以上,就是本期的全部内容。
制作不易,能否点个赞再走呢qwq