const关键字到底该什么用?

来源:未知 浏览 289次 时间 2021-03-31 14:49

守望者先生被授权复制身份证的前言:寿王先生。我们都知道const关键字用于将变量限制为只读但它真的是只读的吗?如何在实践中使用const关键字?在回答这些问题之前我们需要了解const关键字的基本用法。本文描述了C中的const关键字如何我们需要了解const关键字的基本用法。本文描述了C中的const关键字不包括C++。常量是常量的缩写。这是同样的意思。但这并不意味着它修改了一个常量而是将变量限制为只读。修改常用变量如constint num=10;//num相当于intconst num=9;//编译错误不能再次修改因为使用const修改num使num为只读所以试图再次分配num是非法的编译器会报错。因此如果需要const来修改变量则只能在声明的开头进行赋值否则以后就没有机会了(后面将提到一个特殊情况)。修改数组如使用const关键字修改数组使其元素不允许更改:展开剩余的89%constintarr[]=0,0,2,3,4//和intconstarr[]等效arr[2]=1;//编译错误以尝试修改arr的内容是非法的编译器将报告错误:分配只读location'arr[2]更经常修改指针主要包括以下几种情况:1.const修改*p指向只读对象指针的方向是可变的:int a=9;int b=10;const int*p=&a;/p是指向int类型的常量值相当于int const*p=11;//编译错误指向只读对象不能被p;b;/合法更改更改点i为便于理解这里的const-modifies被认为是const*p通常使用*来取消对访问对象的指针的引用因此对象是只读的。2.const修改p指向变量对象指向不可变:int a=9;int b=10;int*const p=&a;/p是常量指针*p=11;//legalp=&b;/编译错误p是常量指针只读不可变3。指针不能更改指向指针的内容也不能更改int a=9;b=10;int*const p=&amp A;/p既是指针又是指针。int类型的常量值*p=11;//编译错误p是一个常量指针只读不能通过p更改p=&b;//编译错误。在阅读上述几种情况后会感到困惑和难以记忆吗?我们使用一个句子来总结:const放在*左边的任意位置以限制指向只读对象的指针;const放在*右边以限制指针本身为只读即不可变。如果不太清楚我们可以通过删除类型描述符来查看const修改的内容。删除类型描述符int后出现如下三种情况:const*p;//modify*p指针指向的对象是不可变的*const p;//modify p指针是不可变的*const*const p;//modify p第一个modify*p第二个modify*p都不能改变const的右边。装饰的人就是不变的人。以上陈述只有助于理解和记忆。根据这种理解我们将发现以下等价情况:constint num=10;//和intconst num equivalent inta=9;constint*p=&a;/和intconst*p equivalent const intar[]=0、0、2、3、4//和intconst num equivalent const关键字如何使用前面介绍的这么多内容这是常见的吗?如何使用const关键字?实际上我们经常可以找到用于修改函数参数的const关键字例如许多库函数声明:char*strncpy(char*destconst char*srcsize_tn);//字符串复制函数int*strncmp(const char*s1const*s2size_tn);//通过查看strncpy函数的原型可以知道字符串比较函数源字符串src是只读的且不可变的dest没有此限制。我们通过一个小例子继续观察://test.c include<stdio.h>void myprint(constchar*str);void myprint(constchar*str)str[0]='h';printf(\\“myprint:%snstr);intmain(void)charstr[]=\\“helloworld\\”;return myprint(str);0;在这个例子中我们不希望myprint函数修改传入的字符串内容因此w使用常量表。显式传入字符串是只读的因此如果您尝试在myprint函数中输入str行修改将导致错误:$gcc otesttest.ctest.c:6:12:error:assignment of read-only location'*str'str[0]='h';因此在我们的编码过程中如果我们确定传入指针参数仅用于访问数据则应将其声明为指向const限定类型的指针以避免意外修改数据。在函数中。修改全局变量我们知道使用全局变量是不安全的因为程序的任何部分都可以修改全局数据。如果将const限定符添加到全局变量中(假定不希望修改全局数据)则可以避免被程序的其他部分修改。有两种方法可以使用它。首先在一个文件中定义并在其他文件中使用外部声明例如:a.h//a.hconstintarr[]=0、1、2、3、4、5、6、7、8、9//在arr[];/中定义int array b.c//b.cexternconstraints//注意在这里不能再分配arr//以后可以使用arr类型2在文件中定义并用static修改它。b文件包含一个文件例如:a.h//hsa.stationsTCCTina。r[]=0、1、2、3、4、5、6、7、8、9//定义int数组b.c//b.c include<a.h>//请稍后使用a r r注意必须在此处使用静态修改否则多个文件包含将导致编译中的重新定义错误。如果你感兴趣试试看。常量修改变量真的是只读的吗?用常量修改的变量真的是只读的吗?请看以下示例:include<stdio。H>Intmain(void)const int a=2018;int*p=&a;*p=2019;printf(\\”%dn\\“a);返回0;运行结果:2019年我们可以看到通过定义另一个指针变量来更改const modified a的值。所以我们忍不住问警察到底做了什么?它修改的变量真的是只读的吗?为什么它修改的变量的值仍然可以更改?#包括<stdio。h>intmain(void)inta=2019;/const inta=2019;printf(\\%dn\\“a);返回0;我们分别获得有常量修改和没有常量修改的汇编代码。不进行常量修改程序集代码:.lc0:.string\\”%dn\\“主:pushrbpmovrbprspsubrsp16movdwordptr[rbp-4]2019moveaxdwordptr[rbp-4]movesieaxmovedioffsetplat:.lc0 moveax0 allprintfmoveax0 alltfmoveax0 leaveret const修饰符汇编代码:.lc0:.lc0:.string\\”%dn“主:pushrbp主:pushrrbp movmovbrbprsmovpsubp16dwordptr[rbp-4]2019moveaxdwordptr[rbp-4]moveaxdwordptr moveaxmoveaxoffsetflat moveap:.lc0moveaxxmovedioffsetflat:。LC0移动0所有打印移动0移动0移动我们找到但没有任何区别!当然这个例子并不能说明所有的问题。但我们需要知道的是const关键字告诉编译器它修改的变量是不能更改的如果在代码中找到类似于更改变量的操作编译器将捕获错误。那么它的实际含义是什么呢?帮助程序员提前发现问题避免对不应该修改的值的意外更改但不能保证它们不会被修改!例如我们可以强制指针通过:include<stdio。h>void myprint(const char*str);void myprint(const char*str);void myprint(const char*str)char*b=(char*)str;b[0]='h';printf(\\“myprint:%snb);int main(void)char str[]]=\\“hellowworld\\”;myprint(str);0;运行结果:myprint:helldprint:returnlow print:helldprint即帮助编译器使用keyword hellowconst关键字帮助编译器尽早发现可能存在的问题。总结和介绍这么多关键点如下:——结束——据估计很多人都知道我们有在线人工智能客服我们将继续优化问答知识库提高人工智能解决问题的能力。昨天我们培训了10个问题没有人在线你可以问人工智能的问题。提问方式电脑或手机找到“id:baiwenkeji”菜单-智能客服可以进入聊天界面与机器人手机边的问题入口如你问解绑步骤:人工智能可以回答“解绑步骤”或询问“移动视频观看”人工智能可以回答“移动视频观看”如果人工智能不能回答“移动视频观看”。解决您的问题请传送“手动客服”信息。\\“人工客服”只记录问题技术人员将在工作日24小时内回复。如果问题紧急请联系微信1。3266630429验证:人工智能请在本公开号的背景下回复“M”声明:本文仅代表作者本人搜狐是一个信息发布平台搜狐仅提供信息存储空间服务。阅读(0)

标签: 百度关键字优化