版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第C++和C中const的区别详解目录C中的constconst修饰局部变量const修饰全局变量const修饰的全局变量有外部链接属性const与指针C++中的constconst修饰普通全局变量const修饰普通局部变量const与类总结C中的constconst修饰局部变量const修饰全局变量const修饰的全局变量有外部链接属性const与指针C++中的constconst修饰普通全局变量const修饰普通局部变量const与类总结const,这个词字面意思为:常数。
这就表示这是一个不可以改变是数。同时,这也是C/C++里面的一个关键字,是一个限定符,但是const在C和C++中的用法是有区别的。
由于本人水平有限,难免会有出错的地方,如果错误,还请指正!
C中的const
const修饰局部变量
在C语言中,const修饰局部变量,那么这个变量就是“常变量”。
voidtest(){
constintb=20;
intmain(){
constinta=10;
return0;
上面的两个变量,无论是主函数中的a,还是普通的函数中的b,都是被从const修饰的变量,那么就是“常变量”。
“常变量”不可以直接通过变量名来对值进行修改,因为变量名被const修饰后,从原来的“可读可改”的属性,变成了只“可读”,“不可改”的属性。
voidtest(){
constintb=20;
b=40;//error
intmain(){
constinta=10;
a=30;//error
return0;
上面的行为是错误的。
但是,“常变量”本质上还是一个“变量”,而不是“常量”。
只要是被const修饰的局部变量,都是在程序运行到这一行代码的时候,才会创建这个变量并且分配空间的。
而分配空间是在栈区分配的,栈区的空间都会有对应的地址,栈区的空间是“可读可写”的。
我们可以通过地址,来对值进行修改。
#includestdio.h
voidtest(){
constintb=20;
int*pb=
*pb=40;
printf("%d\n",b);
intmain(){
constinta=10;
int*pa=
*pa=30;
printf("%d\n",a);
test();
return0;
上面的代码输出的结果是:30和40
也就是说,不论是main函数中的还是普通函数中的局部变量,只要是被const修饰的局部变量,是可以通过地址来进行修改的。
补充
一般我们在定义一个被const修饰的变量的时候,都应该定义并且初始化,如果像上面的那样,是被const修饰的局部变量,如果我们在定义的时候不进行初始化,那么就是一个随机值,想要修改就只能通过指针了。
const修饰全局变量
const修饰的全局变量,也就是定义在函数体之外的变量,内存空间是在文字常量区的,这个内存区域是只读的,不能通过变量名去修改变量的值,也不能通过指针去修改变量的值!
constinta=10;//全局变量
intmain(){
int*pa=
*pa=30;
printf("%d\n",a);
return0;
上面的代码时错误的,被const修饰的全局变量不能通过变量名和地址对内容进行修改,程序会报错。
const修饰的全局变量有外部链接属性
在C语言中,只要时全局变量,不论有没有被const修饰,都是默认拥有外部链接属性的,也就是说这个全局变量不仅限于在当前文件下使用,只要我们在其他文件中,加上extern的声明,也是可以使用的。
const与指针
当const修饰非指针的普通变量的时候,不论const放在类型关键字前面还是后面,表达的意思都是一样的
#includestdio.h
constintc=5;
intconstc=5;
voidtest(){
constintb=20;
intconstb=20;
intmain(){
constinta=10;
intconsta=10;
return0;
上面a,b,c,三个变量的两种写法表达的意思都是一样的,当然同名的变量不能重复定义,我只是演示一下而已。
当const修饰指针的时候,不同的写法会代表不同的意思。
intmain(){
constinta=10;
//constint*pa=//与下一行的代码表达的意思一样
intconst*pa=
*pa=30;
printf("%d\n",a);
return0;
上面的代码时有错的,const修饰指针的时候,const在*星号的左边(上面演示的两种情况都可以),那么表示的是,指针pa指向的空间的内容不可以修改,但是指针变量本身的值可以修改,也就是该指针变量可以改变指向的空间。
intmain(){
constinta=10;
intb=20;
int*constpa=
*pa=30;
pa=//error
printf("%d\n",a);
return0;
上面的代码是错误的,const在*星号的右边,那么表示的是指针变量pa里面存放的地址不可以被修改,也就是不能修改当前指针变量所指向的空间,但是空间的内容可以通过指针来进行修改。
C++中的const
const修饰普通全局变量
与C一样,当const修饰普通的全局变量的时候,不能通过变量名和地址来修改变量的值。
另外
与C不一样的是,C语言中的const修饰的普通全局变量默认是外部链接属性的,但是在C++中被const修饰的普通全局变量是内部链接属性的。
也就是说当我们在一个文件中定义了一个如下的全局变量
constinta=10;//定义全局变量
intmain(){
return0;
我们在另外一个文件中,使用extern来声明,也是不可以的。
//另外一个文件
externconstinta;//在另外的文件中声明
上面这种做法是不可以的,C++中被const修饰的全局变量默认是内部链接属性,不能直接在另外的文件中使用,如果想要在另外的文件中使用,就需要在定义该全局的变量的文件中用extern来修饰。
//定义的文件
externconstinta=10;
//另外一个文件声明
externconstinta;
const修饰普通局部变量
如果const修饰的局部变量是基础的类型(intchardouble等等),并且初始化使用字面常量的话,不会给该变量分配空间。
例如:
voidtest(){
constinta=10;//用字面常量10来初始化
a=20;//error
但是,当我们对这个变量进行取地址的操作的时候,系统会为该变量分配空间。
voidtest(){
constinta=10;
//a=20;//error
int*p=(int*)
*p=20;
coutaendl;
cout*pendl;
上面的结果是:
10和20
这是因为,当我们定义一个被const修饰并且使用字面常量来初始化的局部变量的时候,系统会把这个变量看作是一个符号,放入到符号表中,这么变量名就是一个符号,值就是这个符号的值,类似于#define的作用。
当我们对这个变量取地址的时候,由于原来没有空间,就没有地址,现在需要取地址,所以才被迫分配一块空间,我们通过地址的解引用可以修改这个空间的值,这也就是为什么第二个结果为20的原因,但是如果我们还是通过变量名来访问数据的话,系统会认为这还是一个符号,直接用符号表里面的值替换。
但是!
如果初始化不是用字面常量而是用变量,那么系统会直接分配空间。
voidtest(){
intb=20;
constinta=b;
这时候的a是有空间的,不会被放入到符号表中。
const与类
如果是自定义数据类型(结构体、对象)
我们在创建对象(结构体)的时候,如果这个对象是被const修饰的话,那么不管这个对象是全局的还是局部的,系统都会直接分配空间
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!
const,这个词字面意思为:常数。
这就表示这是一个不可以改变是数。同时,这也是C/C++里面的一个关键字,是一个限定符,但是const在C和C++中的用法是有区别的。
由于本人水平有限,难免会有出错的地方,如果错误,还请指正!
C中的const
const修饰局部变量
在C语言中,const修饰局部变量,那么这个变量就是“常变量”。
voidtest(){
constintb=20;
intmain(){
constinta=10;
return0;
上面的两个变量,无论是主函数中的a,还是普通的函数中的b,都是被从const修饰的变量,那么就是“常变量”。
“常变量”不可以直接通过变量名来对值进行修改,因为变量名被const修饰后,从原来的“可读可改”的属性,变成了只“可读”,“不可改”的属性。
voidtest(){
constintb=20;
b=40;//error
intmain(){
constinta=10;
a=30;//error
return0;
上面的行为是错误的。
但是,“常变量”本质上还是一个“变量”,而不是“常量”。
只要是被const修饰的局部变量,都是在程序运行到这一行代码的时候,才会创建这个变量并且分配空间的。
而分配空间是在栈区分配的,栈区的空间都会有对应的地址,栈区的空间是“可读可写”的。
我们可以通过地址,来对值进行修改。
#includestdio.h
voidtest(){
constintb=20;
int*pb=
*pb=40;
printf("%d\n",b);
intmain(){
constinta=10;
int*pa=
*pa=30;
printf("%d\n",a);
test();
return0;
上面的代码输出的结果是:30和40
也就是说,不论是main函数中的还是普通函数中的局部变量,只要是被const修饰的局部变量,是可以通过地址来进行修改的。
补充
一般我们在定义一个被const修饰的变量的时候,都应该定义并且初始化,如果像上面的那样,是被const修饰的局部变量,如果我们在定义的时候不进行初始化,那么就是一个随机值,想要修改就只能通过指针了。
const修饰全局变量
const修饰的全局变量,也就是定义在函数体之外的变量,内存空间是在文字常量区的,这个内存区域是只读的,不能通过变量名去修改变量的值,也不能通过指针去修改变量的值!
constinta=10;//全局变量
intmain(){
int*pa=
*pa=30;
printf("%d\n",a);
return0;
上面的代码时错误的,被const修饰的全局变量不能通过变量名和地址对内容进行修改,程序会报错。
const修饰的全局变量有外部链接属性
在C语言中,只要时全局变量,不论有没有被const修饰,都是默认拥有外部链接属性的,也就是说这个全局变量不仅限于在当前文件下使用,只要我们在其他文件中,加上extern的声明,也是可以使用的。
const与指针
当const修饰非指针的普通变量的时候,不论const放在类型关键字前面还是后面,表达的意思都是一样的
#includestdio.h
constintc=5;
intconstc=5;
voidtest(){
constintb=20;
intconstb=20;
intmain(){
constinta=10;
intconsta=10;
return0;
上面a,b,c,三个变量的两种写法表达的意思都是一样的,当然同名的变量不能重复定义,我只是演示一下而已。
当const修饰指针的时候,不同的写法会代表不同的意思。
intmain(){
constinta=10;
//constint*pa=//与下一行的代码表达的意思一样
intconst*pa=
*pa=30;
printf("%d\n",a);
return0;
上面的代码时有错的,const修饰指针的时候,const在*星号的左边(上面演示的两种情况都可以),那么表示的是,指针pa指向的空间的内容不可以修改,但是指针变量本身的值可以修改,也就是该指针变量可以改变指向的空间。
intmain(){
constinta=10;
intb=20;
int*constpa=
*pa=30;
pa=//error
printf("%d\n",a);
return0;
上面的代码是错误的,const在*星号的右边,那么表示的是指针变量pa里面存放的地址不可以被修改,也就是不能修改当前指针变量所指向的空间,但是空间的内容可以通过指针来进行修改。
C++中的const
const修饰普通全局变量
与C一样,当const修饰普通的全局变量的时候,不能通过变量名和地址来修改变量的值。
另外
与C不一样的是,C语言中的const修饰的普通全局变量默认是外部链接属性的,但是在C++中被const修饰的普通全局变量是内部链接属性的。
也就是说当我们在一个文件中定义了一个如下的全局变量
constinta=10;//定义全局变量
intmain(){
return0;
我们在另外一个文件中,使用extern来声明,也是不可以的。
//另外一个文件
externconstinta;//在另外的文件中声明
上面这种做法是不可以的,C++中被const修饰的全局变量默认是内部链接属性,不能直接在另外的文件中使用,如果想要在另外的文件中使用,就需要在定义该全局的变量的文件中用extern来修饰。
//定义的文件
externconstinta=10;
//另外一个文件声明
externconstinta;
const修饰普通局部变量
如果const修饰的局部变量是基础的类型(intchardouble等等),并且初始化使用字面常量的话,不会给该变量分配空间。
例如:
voidtes
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- “万里共婵娟·家国情相牵”七年级道德与法治中秋节主题班会教学设计
- 绿色生活方式倡导实践方案
- 2025年全国新闻记者职业资格考试(新闻基础知识)练习题及答案
- 医保电子凭证全覆盖推广工作方案
- 高中班主任核心素养提升与魅力班级建设讲座讲义(2025-2026学年第一学期·高中版)
- 《以青春之名赴时代之约-2025-2026学年“闽地红脉·青春初心”高中主题班会教学设计》
- 铁路装备制造投资分析
- 静脉血栓的气压治疗
- 2026年助理医师资格考试模拟题库
- 2026年造价工程师高频考点解析
- 生物浙江宁波市三锋联盟2025-2026学年度高一年级第二(下)学期期中联考(4.22-4.24)
- 2026年二级建造师二建法规考前预测重点知识强化记忆总结笔记
- 2026云南省有色地质局楚雄勘查院下属企业招聘工作人员11人笔试备考试题及答案解析
- 心血管科试卷及分析
- 2026四川发展(控股)有限责任公司所属公司招聘5人笔试参考题库及答案解析
- 湖北省武汉市2026届高三毕业生四月调研考试语文试卷(含答案)
- 养老机构防灾避险课件
- 2026年辽宁能源集团招聘考试指南及模拟题解析
- 2026广东广州市黄埔区大沙街道招聘编外聘用人员4人备考题库及参考答案详解
- 老龄政策课件
- 国家事业单位招聘2025中国工艺美术馆招聘拟聘人员笔试历年参考题库典型考点附带答案详解(3卷合一)
评论
0/150
提交评论