面试爱问之const关键字
时间:2023-06-30 01:34:46来源:面包芯语

关注、星标公众号,直达精彩内容

const作用

const用法介绍

1、修饰局部变量、全局变量及字符串常量

示例代码:


(资料图片仅供参考)

#include#include#includeconstinta=10;//const修饰的全局变量放在常量区//1.const修饰的全局变量,即使语法通过,但是运行的时候会受到常量区的保护,段错误,运行失败voidtest01(){//a=100;//直接修改语法不通过int*p=&a;*p=100;//间接修改语法通过,运行时产生段错误printf("a%d\n",a);}//2.const修饰的局部变量voidtest02(){constintb=10;//分配到栈上//b=100;//直接修改语法不通过//c语言下称为伪常量int*p=&b;*p=100;printf("b%d\n",*p);//间接修改成功//inta[b];伪常量是不可以初始化数组的}//3.字符串常量voidtest03(){char*p1="helloworld";char*p2="helloworld";char*p3="helloworld";printf("%s\n",p1);printf("%s\n",p2);printf("%s\n",p3);printf("%s\n",&"helloworld");//四个输出的结果一样//p1[0]="z";//不允许修改字符串常量printf("p1[0]%c\n",p1[0]);//可以输出}intmain(){//test01();//test02();test03();return0;}

const修饰的普通变量:定义的时候就要给它赋初值,之后哪怕是赋相同值都不行。const修饰的局部变量还是变量,直接修改编译器报错,可以间接修改,存放在栈区,代码块结束时释放。

const修饰全局变量:直接修改编译器报错,间接修改编译器也许会通过,但运行时会报错(段错误)。const修饰的全局变量存放在全局(静态)存储区,编译期最初将其保存在符号表中,第一次使用时为其分配内存,在程序结束时释放。

const修饰字符串常量:字符串常量位于文字常量区(也有文章归类于代码区),本身就不允许被修改,如果没有const的修饰,我们可能会在后面有意无意的修改字符串常量,这样会导致对只读内存区域的赋值,然后程序会立刻异常终止。有了const,这个错误就能在程序被编译的时候就立即检查出来,这就是const的好处。让逻辑错误在编译期被发现。

2、修饰指针

常量指针和指针常量傻傻分不清楚,以下方法帮助你来区分二者:区分常量指针和指针常量的关键就在于星号的位置,我们以星号为分界线。

如果我们将星号读作‘指针’,将const读作‘常量’的话,内容正好符合。

代码示例:

//第一种,常量指针constint*p1;//p本身不是const的,而p指向的变量是constintconst*p2;//p本身不是const的,而p指向的变量是const#includeintmain(){inta=5;intb=20;constint*p=&a;//*p=100;//编译器报错p=&b;//完全可以printf("%d\n",*p);//间接修改成功return0;}

需要注意的是以下两点:

1、常量指针说的是不能通过这个指针改变变量的值,但是还是可以通过其他的方式来改变变量的值的。

2、常量指针指向的值不能改变,但是这并不是意味着指针本身不能改变,常量指针可以指向其他的地址。

//第二种,指针常量int*constp3;//p本身是const的,而p指向的变量不是const#includeintmain(){inta=5;intb=20;int*p=&a;int*constn=&a;//n=&b;//error:assignmentofread-onlyvariable‘n’*p=8;printf("%d\n",a);return0;}

指针常量是指指针本身是个常量,不能在指向其他的地址,需要注意的是,指针常量指向的地址不能改变,但是地址中保存的数值是可以改变的,可以通过其他指向该地址的指针来修改。

//第三种constint*constp4;//p本身是const的,而p指向的变量也是const

是以上两种的结合,指针指向的位置不能改变并且也不能通过这个指针改变变量的值,但是依然可以通过其他的普通指针改变变量的值。

修饰函数的参数

const修饰参数是为了防止函数体内可能会修改参数原始对象。因此,有三种情况可讨论:

1、函数参数为值传递:

值传递(pass-by-value)是传递一份参数的拷贝给函数,因此不论函数体代码如何运行,也只会修改拷贝而无法修改原始对象,这种情况不需要将参数声明为const。例如:void func(int x)不用写成void func(const int x)

2、函数参数为指针:

指针传递(pass-by-pointer)只会进行浅拷贝,拷贝一份指针给函数,而不会拷贝一份原始对象。根据上面对指针常量、常量指针等讨论,同样分为三种情况:

2.1 防止修改指针指向的内容

典型C库函数:char *strcpy(char *dest, const char *src);

2.2 防止修改指针指向的地址

void swap ( int * const p1 , int * const p2 );指针p1和指针p2指向的地址都不能修改。

2.3 防止修改指针指向的内容和地址

4.修饰函数的返回值

1、如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const 修饰没有任何价值。例如把函数int GetInt(void) 写成const int GetInt(void)是没有意义的。

2、如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。

constchar*GetString(void);char*str=GetString();//error:conflictingtypesfor‘str’constchar*str=GetString();//这种用法才是正确的

标签:

最新
  • 面试爱问之const关键字

    关注、星标公众号,直达精彩内容const基本介绍const是constant的简写,

  • 天天时讯:农村院落墙面瓷砖可以选择以下几种 小院地面铺什么比较好?铺瓷砖好不好呢

    农村院落墙面瓷砖可以选择以下几种:釉面砖:色彩图案丰富,规格多

  • 北斗导航系统(驭胜导航是什么系统?)

    相信大家对北斗导航系统,驭胜导航是什么系统?的问题都很疑惑,这个问

  • 当前观点:止咳糖浆致儿童死亡 印尼警方调查本国食品药品监督管理局

    【止咳糖浆致儿童死亡印尼警方调查本国食品药品监督管理局】在全国200

  • 全球看热讯:润都股份:雷贝拉唑钠肠溶片获得药品注册证书

    润都股份公告,雷贝拉唑钠肠溶片(规格:20mg)获得国家药品监督管理局签

  • 环球聚焦:广东汕尾一10岁男童走失超8天,当地政府:仍在搜寻

    新京报讯(记者吴采倩实习生宋漪静)近日,广东汕尾陆丰市八万镇一名10

  • 城建发展2.32亿元竞得黄山市黄山区四宗地块

    6月25日,城建发展(SH600266)公告,2023年6月21日,公司收到黄山市黄山

  • 中经评论:人工智能如何应对气候变化

    气候变暖将让极端天气更频繁,人工智能可用于改善气象灾害警报系统,实

  • 每日消息!存款利息少了 到底怎么回事?存款利息低了说明什么?

    1 存款利息的计算方式存款利息是银行为吸引储户而支付的货币报酬

  • 世界微头条丨涨停板后缩量十字星_涨停后十字星

    1、涨停后出现高位阴十字星是庄家洗盘吸筹,表现形式为在以后的几个交

  • 中金公司:港股“双柜台”是推动人民币国际化重要一步_全球即时看

    6月19日,港交所“港币-人民币双柜台模式”将正式启动,届时投资者可选

  • 普益财富美股涨17.71%

    普益财富美股涨17 71%

  • 浓情端午 “粽”享平安,武汉轨道公安为乘客送上“平安粽”

    极目新闻记者刘孝斌通讯员张祖华李文茂扫描下载国家反诈中心APP,关注

  • 最新消息:夏至到 节令美食都有啥?

    今日夏至,全国大部分地区气温持续升高,即将迎来一年中最热的时期。夏

  • 有机化学·上册(对于有机化学·上册简单介绍)

    聊聊一篇机化学·上册,对于有机化学·上册简单介绍的文章,网友们对这

  • 百舸争流会高新 青岛市首届龙舟文化节暨青岛市第五届龙舟赛在高新区举行_重点聚焦

    锣鼓喧天歌盛世龙舟竞渡展雄风6月22日青岛市首届龙舟文化节暨青岛市第

  • 旅游
    • 冲进球场拥抱梅西的球迷被罚,欧洲赛场上这类行为如何处理

    • 黄景瑜王雨馨结婚了吗?王雨馨喊话黄景瑜的原因是什么_环球关注

    • 世界快讯:云南镇雄一村庄20天“地震”35次原因未明,县政府组成专班介入

    • 观点:“晨读”“午读”“暮省”串起学生的阅读生活 道里区中小学校“三全阅读”项目建设正式启动