资讯 更多 >>
环球头条:面试爱问之const关键字
全球最资讯丨京张铁路遗址公园一期...
全球焦点!全国田径冠军赛鄂军一日...
健友股份(603707)获得重磅孤儿药XTM...
让沂蒙精神焕发新时代光芒 山东社...
德国2023年一季度公共债务达24066亿...
打造宜居样本,富阳文村——见山望...
送温暖也要下足“绣花功夫”(民生观)
午报 | 抖音外卖将主攻60元以上套...
广汕高铁接触网送电成功 即将进入...
动态更多 >>
新智认知: 新智认知数字科技股份有...
郑州银行董秘回复:我行董事长是否...
你们,温暖了2021
西安市新增27个中风险地区 目前有1...
广西新增本土确诊病例1例
哈尔滨市全域均为低风险地区
寒潮将影响我国中东部地区 四川盆...
昆明至哈尔滨一航班发现1名入境复阳...
陕西研考:封控区内考生在原报考点...
北京今日最高气温仅5℃ 明起强冷空...
会展 更多 >>
美籍酿酒师在崇礼:中国是第二故乡...
河南项城报告2名疑似新冠肺炎病例 ...
浙江绍兴确诊病例首次零新增 上虞...
广西东兴实行全员居家隔离 启动口...
新疆全方位推进乡村振兴 “富春山...
云南瑞丽市主城区全员核酸检测结果...
内蒙古满洲里累计治愈出院本土确诊...
孙海洋夫妻驱车山东阳谷:还在为孙...
大国工匠追梦“玉米强国”40载:用...
让南海“海洋热带雨林”斑斓多彩
专题报道 
当前位置: 资讯 > >> 正文
 
环球头条:面试爱问之const关键字
来源:面包芯语     时间:2023-06-29 10:25:08

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

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();//这种用法才是正确的

关键词:

热门推荐
猜你喜欢