1、const只读变量

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

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

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

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

  const修饰的变量不是真的变量,它只是告诉

  编译器该变量不能出现在赋值符号的左边
实例一.cpp:

  

 #include <stdio.h>

 const int g_cc = ;

 int main()
{
const int cc = ; int* p = (int*)&cc; printf("cc = %d\n", cc); *p = ; printf("cc = %d\n", cc); p = (int*)&g_cc; printf("g_cc = %d\n", g_cc); *p = ; printf("g_cc = %d\n", g_cc); return ;
}

从上面的代码我们发现,const并不是真正意义上的常量,而只是read-only;

提示:GCC编译器如果编译上面的代码,在第21行代码会发生段错误,因为GCC编译器会把const全局数据放置在只读存储区,不能再修改。

但const仍然不能定义真正的意义上的常量。

实例二.cpp

 #include <stdio.h>

 const int g_array[] = {};

 void modify(int* p, int v)
{
*p = v;
} int main()
{
int const i = ;
const static int j = ;
int const array[] = {}; modify((int*)&i, ); // ok
modify((int*)&j, ); // error
modify((int*)&array[], ); // ok
modify((int*)&g_array[], ); // error printf("i = %d\n", i);
printf("j = %d\n", j);
printf("array[0] = %d\n", array[]);
printf("g_array[0] = %d\n", g_array[]); return ;
}

2.const修饰函数参数和返回值 

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

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

小贴士:

  -C语言中的字符串字面量存储于只读存储区,

  -在程序中需要使用  const char* 指针。

实例3.cpp

 #include <stdio.h>

 const char* f(const int i)
{
i = ; return "Delphi Tang";
} int main()
{
char* pc = f(); printf("%s\n", pc); pc[] = '_'; printf("%s\n", pc); return ;
}

上面的代码 第5行和第16行将会报错,这里不再讲述。

3.volatile分析

volatile可理解为“编译器警告提示符”

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

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

volatile也可以修饰可能被未知因数更改的变量

   int obj = ;  

     int a = ;
int b = ; a = obj; Sleep(); b = obj;

编译器在编译的时候发现obj没有被当成左值使用,

因此会“聪明”的直接将obj替换成10,而把a和b都赋值为10。(优化)

volatile主要用于多线程编程环境和嵌入式开发领域

此时若改变obj的值,a和b又如何???

volatile int obj = 10后,a和b又如何???

有趣的问题

const volatile int i = 0;

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

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

正解:  每次用i都会到内存取i的值,i不能出现在赋值符号左边

小结:

const使得变量具有只读属性

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

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

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

C语言-const和volatile深度分析的更多相关文章

  1. const与readonly深度分析(.NET)

    前言 很多.NET的初学者对const和readonly的使用很模糊,本文就const和readonly做一下深度分析,包括: 1. const数据类型的优势 2. const数据类型的劣势 3. r ...

  2. C语言const和volatile关键字

    这部分内容比较简单,我这里直接先做总结,然后通过写三个测试代码,体会其中的关键点 一.总结      1.const使得变量具有只读属性(但是不一定就是不能更改) 2.const不能定义真正意义上的常 ...

  3. 第9课 - const 和 volatile分析

    第9课 - const和volatile分析 1. const只读变量 (1)const修饰的变量是只读的,本质上还是变量,并不是真正意义上的常量         ※※ const只是告诉编译器该变量 ...

  4. C语言中关键字auto、static、register、const、volatile、extern的作用

    原文:C语言中关键字auto.static.register.const.volatile.extern的作用 关键字auto.static.register.const.volatile.exter ...

  5. JAVA CAS原理深度分析 volatile,偏向锁,轻量级锁

    JAVA CAS原理深度分析 http://blog.csdn.net/hsuxu/article/details/9467651 偏向锁,轻量级锁 https://blog.csdn.net/zqz ...

  6. C语言中关键字volatile的含义【转】

    本文转载自:http://m.jb51.net/article/37489.htm 本篇文章是对C语言中关键字volatile的含义进行了详细的分析介绍,需要的朋友参考下 volatile 的意思是“ ...

  7. 深度分析 Java 的枚举类型:枚举的线程安全性及序列化问题(转)

    写在前面: Java SE5 提供了一种新的类型 Java的枚举类型,关键字 enum 可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用,这是一种非常有用的功能 ...

  8. AndroidService 深度分析(2)

    AndroidService 深度分析(2) 上一篇文章我们Service的生命周期进行了測试及总结. 这篇文章我们介绍下绑定执行的Service的实现. 绑定执行的Service可能是仅为本应用提供 ...

  9. 【转】话说C语言const用法

    原文:话说C语言const用法 const在C语言中算是一个比较新的描述符,我们称之为常量修饰符,意即其所修饰的对象为常量(immutable). 我们来分情况看语法上它该如何被使用. 1.函数体内修 ...

随机推荐

  1. Windos framework .net 3.5规则失败

    1. 安装的时候有一个.net警告,这里给后边造成了一个隐患,实际上是wondows少了一个framework .net的插件,跟SQLserver安装本身没关系,一开始忽略了,后边就报错了. 2.点 ...

  2. matlab初探寻

    matlab <iframe src="//player.bilibili.com/player.html?aid=74994893&cid=128293306&pag ...

  3. 如何规范git commit提交

    相信很多人使用SVN.Git等版本控制工具时候都会觉得每次提交都要写一个注释有什么用啊?好麻烦,所以我每次都是随便写个数字就提交了,但是慢慢的我就发现了,如果项目长期维护或者修改很久之前的项目,没有一 ...

  4. 在写论文的参考文献时,有的段落空格很大,有的段落则正常,原因及解决方法(wps)

    下图是一段原始的参考文献,可以看出第一行的空格很大: 原因: 当一个词占不下时,自动将单词移动到下一行,但是这一行又有很多字符,因此这时,软件会将空闲的位置用空白字符填满.第一行有两个空白字符,因此将 ...

  5. SQLserver 行变列。

    首先看看效果是不是想要的 变成 ok,我的效果达到了.那就记录下代码吧. create table temp1(count_ int,memo nvarchar(40))go insert into ...

  6. 44.Python实现简易的图书管理系统

    首先展示一下图书管理系统的首页: 这是图书管理系统的发布图书页面: 最后是图书管理系统的图书详情页已经图书进行删除的管理页. 该图书管理系统为练习阶段所做,能够实现图书详情的查询.图书的添加.图书的删 ...

  7. Java数列循环右移

    描述 有n个整数组成一个数组(数列).现使数列中各数顺序依次向右移动k个位置,移出的数再从开头移入.输出移动后的数列元素,元素之间逗号隔开. 题目没有告诉你n的范围,要求不要提前定义数组的大小. 另外 ...

  8. 2020省选模拟训练1 排列(perm)多项式exp+EGF

    这道题真的还是简单的一批..... 我当时要是参加考试的话该多好(凭这一道题就能进前 5 了) 十分显然的指数型生成函数. 令 $f[i]$ 表示有 $i$ 个点的答案. 然后显然有 $f[i]=\s ...

  9. Python查找列表中某个元素返回所有下标

    需求 找出list中某一元素并返回所有匹配index值 问题 使用index()只能返回一个下标 >>> cw=[0,1,2,1,1,0,1,0,0,1] >>> ...

  10. js秒数倒计时

    代码 /** * 调用回调函数 * @param callback 回调函数体 * @param args 参数 */ execCallback: function (callback, args) ...