C语言学习之const

目录

1.const的理解

2.const修饰变量

       总结

 3.const修饰函数

       1.const修饰函数返回值

       2.const修饰函数参数

       3.总结

 4.const修饰指针变量

       总结


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

  • 10
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忆梦初心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值