【C语言】关于CONST你怎么看?

我在看《C和指针》一书时,看到这样一句话“ANSI C允许你声明常量,常量的样子和变量完全一样,只是它们的值不能修改,可以使用关键字const来声明常量”,看到这句话的时候总感觉怪怪的,在我的印象中,const修饰的变量虽然属性和常量类似,但是不应该把两者画上等号吧,所以翻了下《C Primer Plus》,书中是这么对const进行解释的:const关键字,用于限定一个变量为只读。我感觉这个解释更贴切我的认知,正好借这个点把const翻出来捋一捋。
由于C语言灵活的语法特性,就导致const的位置不受到太大约束,且放在不同的位置时可能限定范围有所不同,首先看两个不同位置的const:

int const a = 1;
const int a = 1;

由于const并不限定数据类型,只对变量进行限定,所以这两种写法下,const的限定范围都是相同的,限定变量a为只读属性。
再来看一下以下两种情况:

int * const ptr;
int const * ptr;

首先,两者基本功能是一致的,都是定义了一个指针,且使用了const进行限定,但是由于const的位置不同,它们定义出来后受到的限制也是不同的。
int * const ptr
Const修饰的是ptr,ptr是一个指针,当ptr被const修饰后,ptr所指向的地址就不能改变了,但是ptr指向的地址里面存储的值则不受const影响。

int a = 5;
int *const ptr = &a;
printf("ptr ->%d\n", *ptr);
*ptr = 4;
printf("ptr ->%d\n", *ptr);
a = 6;
printf("ptr ->%d\n", *ptr);

输出结果:
在这里插入图片描述

如上所示,当ptr被const修饰后,它所指向的地址只能是变量a的地址,当我们想要改变ptr指向的地址时,则会报错,此时ptr不能作为左值。但是当我们通过解引用的方式来访问修改这个地址里面的值时,并不受到const的影响。

int const * ptr

Const修饰的是ptr,此时受限的并非指针本身,而是对指针进行解引用受到了const的限制,表示不能通过ptr来对指针指向的地址里面的内容进行修改,即*ptr不能作为左值,对指针本身并无限制,指针可以随意更改指向地址,且只要不通过指针解引用对指针指向地址进行修改,通过其他形式修改该地址内存储的值是可以被允许的

int a = 5, b = 4;
int const *ptr = &a;
printf("ptr ->%d\n", *ptr);
a = 6;
printf("ptr ->%d\n", *ptr);
ptr = &b;
printf("ptr ->%d", *ptr);

输出结果:
在这里插入图片描述

关于const的用法:
Const的使用并不局限于定义变量时,在函数的参数和返回值中也可以使用,不希望函数中对传入参数有修改的情况下,也可以使用:
void function(int const *a);
在限定函数返回值时也可以使用,但是接收返回值时也需要使用const限定的变量进行接收。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值