问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c语言中const修饰的到底是常量还是变量?

发布网友 发布时间:2022-04-30 00:05

我来回答

2个回答

热心网友 时间:2022-06-26 18:46

C语言中const修饰的量是常变量,它与普通变量的编译方式一样,唯一的区别是常变量定义后不能做左值。C++中const修饰的才是常量。

1、 const修饰的变量是常量还是变量

对于这个问题,很多同学认为const修饰的变量是不能改变,结果就误认为该变量变成了常量。那么对于const修饰的变量该如何理解那?

下面我们来看一个例子:

int main

{

char buf[4];

const int a = 0;

a = 10;

}

这个比较容易理解,编译器直接报错,原因在于“a = 10;”这句话,对const修饰的变量,后面进行赋值操作。这好像说明了const修饰的变量是不能被修改的,那究竟是不是那,那么下面我们把这个例子修改下:

int main

{

char buf[4];

const int a = 0;

buf[4] = 97;

printf(“the a is %d\n”,a);

}

其中最后一句printf的目的是看下变量a的值是否改变,根据const的理解,如果const修饰的是变量是不能被修改的话,那么a的值一定不会改变,肯定还是0。但是在实际运行的结果中,我们发现a的值已经变为97了。这说明const修饰的变量a,已经被我们程序修改了。

那综合这两个例子,我们来分析下,对于第二例子,修改的原因是buf[4]的赋值操作,我们知道buf[4]这个变量已经造成了buf这个数组变量的越界访问。buf数组的成员本身只有0,1,2,3,那么buf[4]访问的是谁那,根据局部变量的地址分配,可以知道buf[4]的地址和int a的地址是一样,那么buf[4]实际上就是访问了const int a;那么对buf[4]的修改,自然也修改了const int a的空间,这也是为什么我们在最后打印a的值的时候看到了97这个结果。

那么我们现在可以知道了,const修饰的变量是不具备不允许修改的特性的,那么对于第一个例子的现象我们又如何解释那。

第一个例子,错误是在程序编译的时候给出的,注意这里,这个时候并没有生成可执行文件,说明const修饰的变量可否修改是由编译器来帮我们保护了。而第二个例子里,变量的修改是在可执行程序执行的时候修改的,说明a还是一个变量。

综上所述,我们可以得出一个结论,那就是const修饰的变量,其实质是告诉程序员或编译器该变量为只读,如果程序员在程序中显示的修改一个只读变量,编译器会毫不留情的给出一个error。而对于由于像数组溢出,隐式修改等程序不规范书写造成的运行过程中的修改,编译器是*为力的,也说明const修饰的变量仍然是具备变量属性的。

2、 被const修饰的变量,会被操作系统保护,防止修改

如果对于第一个问题,有了理解的话,那么这个问题,就非常容易知道答案了。Const修饰的变量是不会被操作系统保护的。

其原因是操作系统只保护常量,而不会保护变量的读写。那么什么是常量?比如“hello world”这个字符串就是被称为字符串常量。

对于这个问题的另一种证明方法,可以看下面这个程序:

int main

{

const int a;

char *buf = “hello world”;

printf(“the &a is %p, the buf is %p\n”,&a, buf);

}

可以发现buf保存的地址是在0x08048000这个地址附近的,而a的地址是在0xbf000000这个地址附近的,而0x08048000附近的地址在我们linux操作系统上是代码段。这也说明了常量和变量是存放在不同区域的,自然操作系统是会保护常量的。

热心网友 时间:2022-06-26 18:46

这个文章很详细:
1、 const修饰的变量是常量还是变量
对于这个问题,很多同学认为const修饰的变量是不能改变,结果就误认为该变量变成了常量。那么对于const修饰的变量该如何理解那?
下面我们来看一个例子:
int main
{
char buf[4];
const int a = 0;
a = 10;
}
这个比较容易理解,编译器直接报错,原因在于“a = 10;”这句话,对const修饰的变量,后面进行赋值操作。这好像说明了const修饰的变量是不能被修改的,那究竟是不是那,那么下面我们把这个例子修改下:
int main
{
char buf[4];
const int a = 0;
buf[4] = 97;
printf(“the a is %d\n”,a);
}
其中最后一句printf的目的是看下变量a的值是否改变,根据const的理解,如果const修饰的是变量是不能被修改的话,那么a的值一定不会改变,肯定还是0。但是在实际运行的结果中,我们发现a的值已经变为97了。这说明const修饰的变量a,已经被我们程序修改了。
那综合这两个例子,我们来分析下,对于第二例子,修改的原因是buf[4]的赋值操作,我们知道buf[4]这个变量已经造成了buf这个数组变量的越界访问。buf数组的成员本身只有0,1,2,3,那么buf[4]访问的是谁那,根据局部变量的地址分配,可以知道buf[4]的地址和int a的地址是一样,那么buf[4]实际上就是访问了const int a;那么对buf[4]的修改,自然也修改了const int a的空间,这也是为什么我们在最后打印a的值的时候看到了97这个结果。
那么我们现在可以知道了,const修饰的变量是不具备不允许修改的特性的,那么对于第一个例子的现象我们又如何解释那。
第一个例子,错误是在程序编译的时候给出的,注意这里,这个时候并没有生成可执行文件,说明const修饰的变量可否修改是由编译器来帮我们保护了。而第二个例子里,变量的修改是在可执行程序执行的时候修改的,说明a还是一个变量。
综上所述,我们可以得出一个结论,那就是const修饰的变量,其实质是告诉程序员或编译器该变量为只读,如果程序员在程序中显示的修改一个只读变量,编译器会毫不留情的给出一个error。而对于由于像数组溢出,隐式修改等程序不规范书写造成的运行过程中的修改,编译器是*为力的,也说明const修饰的变量仍然是具备变量属性的。
2、 被const修饰的变量,会被操作系统保护,防止修改
如果对于第一个问题,有了理解的话,那么这个问题,就非常容易知道答案了。Const修饰的变量是不会被操作系统保护的。
其原因是操作系统只保护常量,而不会保护变量的读写。那么什么是常量?比如“hello world”这个字符串就是被称为字符串常量。
对于这个问题的另一种证明方法,可以看下面这个程序:
int main
{
const int a;
char *buf = “hello world”;
printf(“the &a is %p, the buf is %p\n”,&a, buf);
}
可以发现buf保存的地址是在0x08048000这个地址附近的,而a的地址是在0xbf000000这个地址附近的,而0x08048000附近的地址在我们linux操作系统上是代码段。这也说明了常量和变量是存放在不同区域的,自然操作系统是会保护常量的。
如果我们知道这个道理后,再看下面的题目:
int main
{
char *buf = “hello”;
buf[0] = ‘a’;
printf(“the buf is %s\n”,buf);
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 两个人同居在一起生了三个小孩现在女方要离婚,男方不愿意,女方被外家押回,同睡一张床女方方特别痛苦? C语言中的*const什么意思? 手机号和都不用了,如何找回健康通行码? 我和老婆没有结婚证,有三个孩子了她想要离婚怎么办 C语言函数返回值为 const 型 有什么意义 我有3个孩子了 可是我和我老婆没有感情 总是吵架 想离婚不知道可以吗 c语言答疑 const 啥意思 感觉有他没他结果都一样? c语言问题,这些函数后边跟个const 啥意思 求解 我小孩才三个多月,老婆要跟我离婚,用法律来解决小孩归谁? 什么是const c语言中const 是什么意思? 我和老婆结婚十三年了,有三个孩子,今年要和我离婚,我能挽回他吗,如果她有外遇了呢? 华为b593s 850终端如何连接一部无线路由器? 孩子三个了老婆有精神病可以离婚吗 华为无线路由器b593s_850亮红灯什么意思 现在都参加工作了,还时常会做梦梦到在学校考试。我上 学时学习挺好的,前十名总是有的。可做的梦里我 梦见我上学了,而且考试成绩也很好 蛐蛐和蝈蝈有什么区别 蛐蛐能斗 蝈蝈能斗么 他们会斗死么 华为b593slte无线路由器频段是多少 蓝色沙发配什么颜色家具 老婆二年不回家了我想和她离婚小孩三个一个我也不想给她可以吗? 山东电子健康通行码在旧手机上有,新手机怎么办? 换手机了怎样把健康通行码弄到新手机上? 轻钢龙骨国家标准是多厚 轻钢龙骨国家标准是什么? 女性白带异常怎么回事?日常怎样护理? 外星人的哪款台式机比较推荐? 轻钢龙骨分为国标和非标,请问国标的规范尺寸是多少?各个龙骨的尺寸比如:50*10*5厚,谁有国家规范的? 安庆女性白带异常怎么办? 外星人台式机R13和R14哪个好?平面设计给推荐一下? 女性白带异常 煎香椿嫩芽的家常做法大全怎么做好 如何防治女性白带异常 DIY台式机和外星人台式机哪个更值得购买 刚出的外星人台式机R13好用吗? 加湿器用什么水好?知道的朋友说下!收货员说用纯净水!可以用自来水吗? 加湿器用什么水好,加湿器用自来水可以吗 加湿器用什么水比较好?自来水可以吗 加湿器放什么水 怎样用10个好友的QQ号码找回我的QQ密码?