C语言学习笔记--const 和 volatile关键字
1.const关键字
(1)const 修饰的变量是只读的,它不是真正的常量,本质还是变量,只是告诉编译器不能出现在赋值号左边!
(2)const 修饰的局部变量在栈上分配空间
(3)const 修饰的全局变量在全局数据区分配空间(vc、gcc 会将其放入常量区,bcc 放入全局数据区)
(4) const 只在编译期有用,在运行期无用
#include <stdio.h>
const int g_cc = ;//bcc 下存储在全局数据区,可修改。
//vc、gcc 将其存储在常量区,不可修改
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 = ; //bcc 编译器下没问题,vc\gcc 下会出错。
printf("g_cc = %d\n", g_cc);
return ;
}
C 语言中的 const 使得变量具有只读属性,但是其只在编译期间有效,在运行期间是无效的,所以可以使用指针的方式间接的去修改它的值,有一点需要注意的是现代 C 编译器(如 Vc、gcc)中的 const 将具有全局生命周期(如全局变量,static 属性的变量)存储于只读存储区,修改该变量时将导致程序崩溃。
#include <stdio.h>
const int g_array[] = {};
void modify(int* p, int v)
{
*p = v;
}
int main()
{
int const i = ;//相当于 const int i=0;
const static int j = ;
int const array[] = {}; //相当于 const int array[5]={0};
modify((int*)&i, );
modify((int*)&j, ); //error
modify((int*)&array[], );
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 ;
}
const关键字可以用来修饰函数参数和返回值
(1)const 修饰函数参数表示在函数体内不希望改变参数的值
(2)const 修饰函数返回值表示返回值不可改变,多用于返回指针的情形。
#include <stdio.h>
int main(){
const char* s= "I like programming!"; //存储于只读存读区
}
const 修饰函数参数与返回值
#include <stdio.h>
const char* f(const int i)
{
i = ;//错误,i 不能作为左值
return "I like programming!";
}
int main()
{
char* pc = f(); //警告,f 的返回值为 const char*
printf("%s\n", pc);
pc[] = '_'; //错误,试图修改只读存储区中的数据
printf("%s\n", pc);
return ;
}
2.volatile关键字
(1)volatile 可理解为“编译器警告指示字”
(2)volatile 告诉编译器必须每次去内存中取变量值
(3)volatile 主要修饰可能被多个线程访问的变量
(4)volatile 也可以修饰可能被未知因数更改的变量
volatile 强制编译器减少优化,必须每次到内存中去取值
int obj =
int a = ;
int b = ;
a = obj;
sleep();
b = obj;
编译器在编译的时候发现obj没有被当成左值使用,因此会“聪明”的将obj直接替换成10,而把a和b都赋值为10.
参考资料:
www.dt4sw.com
http://www.cnblogs.com/5iedu/category/804081.html
C语言学习笔记--const 和 volatile关键字的更多相关文章
- Java并发编程学习笔记 深入理解volatile关键字的作用
引言:以前只是看过介绍volatile的文章,对其的理解也只是停留在理论的层面上,由于最近在项目当中用到了关于并发方面的技术,所以下定决心深入研究一下java并发方面的知识.网上关于volatile的 ...
- c语言学习笔记 const变量
在c语言的编程过程中经常会遇到有常数参加运算的运算,比如这种. int a=100*b; 这个100我们叫常数或者叫常量,但是程序中我们不推荐这种直接写常数的方法,有两个缺点. 第一是程序可读性差. ...
- C语言学习笔记--enum和sizeof关键字
1.enum关键字 C语言中enum关键字用来定义枚举类型 (1)enum 是 C 语言中的一种自定义类型(2)enum 值是可以根据需要自定义的的整型值(3)第一个定义的 enum 值默认为 0 ( ...
- C语言学习笔记--struct 和 union关键字
1.struct关键字 C 语言中的 struct 可以看作变量的集合struct中的每个数据成员都有独立的存储空间. 结构体与柔性数组 (1)柔性数组即数组大小待定的数组 (2)C 语言中可以由结构 ...
- GO语言学习笔记(一)
GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...
- Go语言学习笔记三: 常量
Go语言学习笔记三: 常量 定义常量 常量就是在声明后不能再修改的量. const x int = 100 const y string = "abc" const z = &qu ...
- Go语言学习笔记(1)——顺序编程
Go语言学习笔记这一堆主要是<Go语言编程>(人民邮电出版社)的读书笔记.中间会穿插一些零碎的点,比如源码学习之类的.大概就是这样吧. 1. 顺序编程 1.1 变量 变量的声明: var ...
- Go语言学习笔记十三: Map集合
Go语言学习笔记十三: Map集合 Map在每种语言中基本都有,Java中是属于集合类Map,其包括HashMap, TreeMap等.而Python语言直接就属于一种类型,写法上比Java还简单. ...
- Go语言学习笔记十二: 范围(Range)
Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...
随机推荐
- 读取ByteBuffer有效的数据
转:https://zhidao.baidu.com/question/427134449349230532.html说道 ByteBuffer的缓冲区,就需要知道缓冲区的的三个状态1)capacit ...
- ARDUINO MEGA2560 经过ESP8266 WIFI模块上传温湿度数据到 OneNet 服务器
简述 原来写了一个C++的wifi库但是发现用c++ arduino这小身板有点扛不住,代码比较大,使用String类型数据处理速度慢,而且很容易无缘无故跑飞.而且封装成库后使用还需要修改arduin ...
- POJ - 2195 Going Home 【KM】
题目链接 http://poj.org/problem?id=2195 题意 在一张N * M 的地图上 有 K 个人 和 K 个房子 地图上每个点都是认为可行走的 求 将每个人都分配到不同的房子 求 ...
- iOS UIImage 拉伸问题 (适用于UIButton等需要局部拉伸的情况)
图片 有的切图切很大 还占用ipa大小,有时候 切图 只需要 局部或者说 一个压缩的图片的抽象状态 直接上代码 CGFloat top = ; // 顶端盖高度 ; // 底端盖高度 ; // 左端盖 ...
- dojo 官方翻译 dojo/json 版本1.10
官方地址:http://dojotoolkit.org/reference-guide/1.10/dojo/json.html#dojo-json require(["dojo/json&q ...
- 第二天(1)声明式验证之使用验证框架验证域模型和ModelDriven验证
有一类特殊的属性,即这个属性的类型是另外一个JavaBean,如有一个User类,代码如下: package data; public class User { private String name ...
- Storm- 使用Storm实现词频汇总
需求:读取指定目录的数据,并实现单词计数的功能 实现方案: Spout来读取指定目录的数据,作为后续Bolt处理的input 使用一个Bolt把input 的数据,切割分开,我们按照逗号进分割 使用一 ...
- 用 CSS3 创建一个漂亮的多种色彩的菜单
1. [图片] thumb.png 2. [代码][HTML]代码 <!DOCTYPE html><html lang="en" > <hea ...
- 很实用的HTML5+CSS3注册登录窗体切换效果
1. [代码]3个很实用的HTML5+CSS3注册登录窗体切换效果 <!DOCTYPE html><!--[if lt IE 7 ]> <html lang=" ...
- algorithm之排序算法--待解决
简述:排序算法,参见http://www.cplusplus.com/reference/algorithm/?kw=algorithm 待解决问题:各种排序算法的实现 /* template < ...