const和volatile-创新互联

对于const变量,人们有个误区,就是认为const是个常量,其实这种说法是不正确的,const本质还是一个变量,只是这个变量被const修饰后成为了只读的变量。

十年的永德网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。网络营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整永德建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联从事“永德网站设计”,“永德网站推广”以来,每个客户项目都认真落实执行。

const只读变量


关于const有几点要注意的:

1.const修饰的变量是只读的,本质还是变量。

2.const修饰的局部变量在栈上分配空间。

3.const修饰的全局变量在全局数据区分配空间。

4.const只在编译期有用,在运行期无用。

const修饰的变量不是真正的常量,它只是告诉编译器该变量不能出现在赋值符号的左边。

const全局变量的分歧


在现代C语言编译器中,修改const全局变量将导致程序崩溃(在现代C语言编译器中,被const修饰的全局变量被编译器存放在只读存储区,所以修改该变量将导致程序奔溃)

注意:标准C语言编译器不会将const修饰的全局变量存储于只读存储区中,而是存储于可修改的全局数据区,其值依然可以改变。

下面我们通过一个编程实验来验证一下。

const和volatile

这是在BCC编译环境下的运行结果,BCC是一款标准C语言编译器,它将const修饰的全局变量存储于可以改变的全局数据区。所以当程序改变其中的变量的时候,不会报错。

const和volatile

在linux系统中运行程序会出现段错误的提示,原因是因为gcc编译器是一款现代C语言编译器,全局变量i被const修饰后,被编译器存储在只读存储区,当视图修改的时候会报错。

const和volatile

在函数中,局部变量i被static修饰后,成为全局变量,当用const修饰后,编译器将它储存在只读存储区。再次修改会出错。

const和volatile

在linux中 局部变量i被const修饰后,gcc编译器将它存储在栈上,其值可以改变。程序不报错。

const的本质

1.C语言中的const使得变量具有只读属性。


2.现代C编译器中的const将具有全局生命周期的变量存储于只读存储区。

3.const本能定义真正意义上的常量。

const修饰函数参数和返回值

1.const修饰函数的参数表示在函数体内不希望改变参数的值。

2.const修饰函数返回值表示返回值不可以改变,多用于返回指针的情形。

 Tips:

 C语言中的字符串字面量存储于只读存储区,在程序中需要使用const char* 指针。

const和volatile

const和volatile

程序中有两处错误,第一处是j变量被static const修饰后 编译器将它存储在只读存储区,修改值会出现程序奔溃,第二处是全局变量g_array被const修饰也被编译器存储在只读存储区,修改值会发生程序奔溃。

深藏不露的volatile

1.volatile可以理解为编译器警告指示字;


2.volatile告诉编译器必须每次去内存中去变量值。

3.volatile主要修饰可能被多个线程访问的变量。

4.volatile也可以修饰可能被多个未知因数改变的变量。

const和volatile

一个有趣的问题

const volatile int i=0;


-变量i具有什么样的特性?

-编译器如何处理这个变量?

i是一个只读变量,编译器不做任何优化,每次访问i的时候 都会让编译器去内存中去取值。

小结

  1. const使得变量具有只读属性

  2. const不能定义真正意义上的常量。

  3. const将具有全局生命期的变量存储于只读存储区

  4. volatile强制编译器减少优化,必须每次从内存中取值。

    const和volatile



另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


新闻标题:const和volatile-创新互联
分享链接:http://myzitong.com/article/dsgdeg.html