欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

cosnt介绍

程序员文章站 2022-07-09 22:11:06
...

const 类型

const,翻译过来为常量,或许理解为 只读 更好。

1.const语法

对非指针变量,const无论放在类型前或后,都表示变量属性为只读,运行过程中不能也不会赋值修改。如const int a;和int const a;这两种方式const作用相同,都表示a是一个常整型数。
而const修饰指针时则有所不同,分三种情况:const int *a; int * const a; const int const * a;
const int* a表示a是指向只读整型数的指针,即内存*a中的整数只读,不能被修改,但指针a可以指向其它地址。

int* const a;表示a是指向整型数的只读指针,即:指针指向的整型数可修改,但指针a本身不能修改,不能再指向其他地址。

const int const * a;表示a是指向只读整型数的只读指针,指针指向的整型数不可修改,指针也不可修改。
有人会有疑问,变量或指针是否修改由程序员自己控制,即使不用const也不影响程序功能实现,为什么要引入它呢?

2.const作用

1) const对外传达有用信息,某变量为const表明在后续代码中不会被修改。所以代码里合理加入const能提高可读性,当然前提是要能看得懂这个暗示,否则就是对牛弹琴了。
2) const能借助编译器保护那些不希望被改变的变量,防止误修改。一旦声明为const,后面代码中如果试图修改,编译器会报错提醒。这样可以减少bug,提高稳定性。
3) const可以给编译器一些附加信息,使它产生更高效的优化代码。编译器如果知道某变量只读,值不会改变,就可以利用这一点有针对性做一些优化。
4) 某些编译器不支持rwdata段(即不支持全局变量),可用const把全局数据定位到rodata段。另外rodata段的数据可直接在多进程间共享,提高空间利用率且无需同步。

3.const与常量

回到开始的问题,const和常量是否一回事?不是。常量没有存储空间,是右值。而const的修饰对象依然是左值,有存储空间,只不过被限定到只读空间,这和常量有本质不同。C89中左值定义:“对象是一个命名的存储区域,左值是引用某个对象的表达式”。也就是说有具体存储空间的对象的表达式,就是一个左值!比如const修饰的变量是左值,而相对的,数组名是右值。
另外为防止指针指向的常量被“曲线”修改,C对于指针间赋值有一个规定:左值必须包含右值所有的限定词。这就限定指向const对象的指针不能赋给指向非const对象的指针,反过来允许。这理所当然,要不,换个指针就能修改原来定义为const的数据:
const int *p1 =10;
int *p2;
p2 = p1;      //这种赋值被禁止,想来也是,制定C标准不可能留下这么大个漏洞
*p2 = 100;

4.总结

代码里看到const就象开车看到了单行道标志,利用好它会感觉顺畅,否则会觉得被束缚。一般来说,只要能确定元素为只读,const有益无害。
相关标签: const