c中const用法总结

2024-07-22

c中const用法总结(共2篇)

c中const用法总结 篇1

C语言的中的const,代表的含义是”不可改变的变量“,或者可以成为”伪常量“

C++中 const,被称为”一个有类型描述的常量“

const int liv_num = 10; liv_num = 18; //error 因为liv_num 被const修饰不可被直接赋值

那么,我为什么说是”伪常量“?

我们知道在c中给变量赋值,有两种方式:一种就是直接赋值;一种是间接赋值,

对于第一种方式,我们已经验证是不可以的。那么,使用间接赋值是否可以实现对liv_num的值得改变呢?

注意:一定要是.c的文件,如果使用的是.cpp的话,不会出现效果,因为c++中 const,被称为”一个有类型描述的常量“

#include#includeint main(){ //定义一个常量 const int liv_num = 10; //liv_num = 18; //error 因为liv_num 被const修饰不可被直接赋值 //定义一个指针指向常量 const int *pliv_num = &liv_num; //对指向常量的指针进行转换 int * pNum = (int *)pliv_num; //进行赋值 *pNum = 20; printf(liv_num = %d , liv_num);//结果为:20system(pause); return 0;}

通过以上,我们就方向 在c中 const 是 ”伪常量“, 那么也说明一个问题,const是保存在 ”栈“ 中的, 如果想验证,可以使用debug,观察内存,再此不在叙述,

 

c中const用法总结 篇2

从国内关于类型限定符const的资料来看,很多都缺乏对类型限定符const的正确、完整、易于理解的解释。

比如,有文献介绍const时说,“表明这个量在程序执行过程中不可变”,这样的表述不够准确。还有的说任何变量的声明都可以使用const限定符限定,该限定符指定变量的值不能被修改;“如果试图修改const限定符指定的值,其结果取决于具体的实现”;“可以对const对象进行初始化,但在初始化以后不能进行赋值”;“const用于声明可以存放在只读存储器中的对象”;“除了诊断显式尝试修改const对象的情况外,编译器可能会忽视这些限定符”。通过这些语句,可以看出对const的说明是不清晰的,给人的感觉有点乱。仔细揣摩,是有矛盾之处的,既说const指定变量的值不能修改,又说如果试图修改const限定符限定的值,其取决于具体的实现,即结果是未规定的。另外,“除了诊断显式尝试修改const对象的情况外,编译器可能会忽视这些限定符”这句话,可以理解为对const限定的变值进行隐性(或间接)地修改,编译器可能不会出现警告等提示信息,即可以隐性地对const限定的变值进行修改,同时也隐含了const只在编译期间起作用。再比如,有文献说,在程序执行过程中不可修改的变量值。此种表述也不够准确。

2 实验数据及分析

举例说明,例1如下。

说明:1.软件平台为Keil C51评估板软件;2.目标器件为AT89C52。

编译时出错:

解释:这说明在编译期间如果显式地对const限定的变量进行修改,那编译器会报错。

例2如下。

说明:1.软件平台为Keil C51评估板软件;2.目标器件为AT89C52。

调试情况:先查看M51文件,有如下信息:

“D:0008Hsymboli”,说明变量i在数据存储器的0008H处,调试运行,发现执行*p_i=6后,数据存储器的0008H处的内容变为6。

解释:这说明在编译期间如果隐性(或间接)地对const限定的变量进行修改,那编译器不会给出任何出错或警告信息,它认为没有任何问题,完全正确。

总结:通过例1和例2的说明,使用const限定符限定的变量是能被修改的,不仅在编译期间能被修改,在执行期间更能被修改。

3 const限定符的用法

具体如例3和例4,例3如下。

说明:1.软件平台为Keil C51评估板软件;2.目标器件为AT89C52。

编译结果如下:

例4如下。

说明:1.软件平台为Keil C51评估板软件;2.目标器件为AT89C52。

编译结果如下:

上面两个例子说明const在语句中的位置不同,含义也不同。

下面两个声明示范说明了“指向常量值的变量指针”与“指向变量值的常量指针”之间的区别:Constint*ptr_to_constant;int*constconstant_ptr。

由ptr_to_constant所指向的对象内容不应通过该指针修改,但ptr_to_constant本身可改为指向另一个对象。类似地,由constant_ptr所指向的int的内容可被修改,但constant_ptr本身应总是指向同一位置。这就解释了例3没报错,而例4为何会报错的原因。在例4中,指针ptr本身不能被修改,但却要显式地对ptr进行修改,所以编译器要报错。

目前,const用于有指针的场合比较常见,因为有些场合用指针来实现比较适合,这也是C语言中为何存在指针的缘由,但如果不能正确使用指针,会带来副作用和错误。const用于函数参数中是常见的,可从库函数中某些函数的原型上看出来。为什么会在函数调用的场合出现的次数比较多呢?这是因为C语言中的函数调用都是传值调用,即拷贝函数调用中的参数值,并把该值传给该函数。如果在函数中修改了拷贝值,调用函数中的原始值不会被修改。但在一些情况下,如果使用了指针进行函数参数的传递,情况会变复杂,被调用函数不但可以修改原始值的拷贝值,还可以修改传给它的原始值。为了防止不应被修改的值被修改,C语言引入const限定符。所以,const限定符为C语言提供了一套很重要的安全机制,不容忽视,也不能轻视它。

用作函数传递的指针有下面4种基本情况:

(1)指向非常量数据的非常量指针,如:

(2)指向非常量数据的常量指针,如:

(3)指向常量数据的非常量指针,如:

(4)指向常量数据的常量指针,如:

在编译期间,每种情况有不同的保护级别。第一种情况,没有保护,指针所指向的内容可以被修改,而且指针本身也可以被修改。第二种情况,对指针本身有保护,指针所指向的内容可以被修改,但指针本身不能被修改。第三种情况,对指针所指向的内容有保护,指针本身可以被修改,但指针所指向的内容不可以被修改。第四种情况,保护力度最强,指针本身和指针所指向的内容都不可以修改。概括地说,使用const可以最大程度地发挥指针的优势,同时避免指针带来的副作用。

4 结语

从实验数据和结果来看,国内的书籍等资料,普遍对const限定符的认识还不完全正确、还不深入。造成此种现象的原因,很可能是国际上对const限定符的机理、用法缺乏完整、清晰的说明,使得国内教材的编著者对此方面也不甚了解。上面讲了使用const限定符的基本情况,在函数调用中,用指针加const来传递结构复杂的数据类型,可以发现const用处很大。

参考文献

[1]Brian W.Kernighan,Dennis M.Ritchie.C程序设计语言(第2版)[M].徐宝文,李志,译.北京:机械工业出版社,2004.

[2]H.M.Deitel,P.J.Deitel.C程序设计教程(第一版)[M].薛万鹏,译.北京:机械工业出版社,2006.

上一篇:区小额贷款有限责任公司的请示下一篇:践行道德作文800字