您的位置:首页 > 其它

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

2016-09-21 22:26 232 查看
有如下代码:

#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也会同时改变。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  const c