从一道笔试题理解const关键字

本文探讨了C语言中const限定符的实际作用及其对变量的影响。通过具体代码示例,解释了const限定符如何限制对变量直接赋值,但不阻止通过其他指针间接修改变量值的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有如下代码:

#include <stdio.h>

int main()
{
    const int a=1;
    int *b=(int *)&a;
    int c=3;
    const int *d=&c;
    *b=2;
    c=4;
    printf("a=%d,b=%d,c=%d,d=%d",a,*b,c,*d);
    return 0;
}
问输出结果是多少?

我刚开始这样理解:a被定义为一个初值为1的常量,将a的地址强制转化为int型指针后赋给int型指针b,d被定义为指向变量c的int型指针,该指针所指内容为常量,最后对*b和c赋值,由于a和*d都被const声明,那么改变*b和c应该不影响它们的值,所以输出应该是1,2,3,4。然而结果与我的预期并不相同:


变量a和c的值均被改变,为什么已经声明为const了,值还能改变?

我觉得可以这样理解,const只是对变量的“只读”声明,不能给该变量赋值,比如a=2,编译将出错:

||=== Build: Debug in const (compiler: GNU GCC Compiler) ===|
D:\codeblocks projects\const\main.c||In function 'main':|
D:\codeblocks projects\const\main.c|6|error: assignment of read-only variable 'a'|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===|

但却可以通过别的指向该内存空间(&a)的指针去改变该空间的变量值(如题目中的*b),即const只是对变量a而言的,并不是对内存空间而言

另外,对于指针d,定义为const int *d=c表明d指向的变量不能改变,即不能用*d=1这样的语句赋值,但可以改变变量c的值。由于d指向变量c的地址,所以*d也会同时改变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值