11.3 ANSI C类型限定符

这篇说一下2个关键字:const, volatile.

内容在书12.5章.

1. const

1.1 简介

以const声明的对象,值不能通过赋值或递增递减来修改,比如下面的代码就是不合法的.

//=====1
const int ci = 100;
ci = 10;

//=====2
const char cc;
cc = 'c';

但是这样是合理的

const int i = 32;

1.2 指针中使用const

对于指针和const来说,由于需要区分"指针本身为const或指针指向的值为const"(403页),所以比较复杂.

描述示例含义
类型前constconst float * pf指针本身可以改变,指向的值不可改变
变量名前constfloat* const pf指针本身不可改变,指向的值可以改变
类型,变量名前constconst float* const pf指针本身不可改变,指向的值不可改变
类型后,*之前constfloat const* pf指针本身可以改变,指向的值不可改变

简单总结一下:"const放在[*]左侧,指针指向的数据不能改变,放在[*]的右侧,指针本身不能改变"(403页). 

前面提到过指针与数组的关系,所以函数原型函数头中,下面两条语句的声明是相同的,表示不能更改指向arr的数据.

const int* arr;
const int arr[];

1.3 对全局数据使用const

对于全局变量,使用const可以保护数据的安全性,否则就可能随意被其他程序修改.下面是一些全局const变量的示例.

const double e = 2.7;
const char* SEASONS[12] = {"Spring", "Summer", "Autumn", "Winter"};

其他文件访问这些全局数据,注意需要使用extern关键字.

extern const double e;
extern const char* SEASONS [];

2. volatile

volatile通常用于硬件地址以及在其他程序多个同时运行的线程中共享数据.

volatile int vi; /*vi是一个易变化的值*/
volatile int* vip; /*vip是一个volatile变量的指针*/

看起来不是那么有用,但是这个关键字涉及到"编译器的优化".看看下面的代码

int value1 = x;
...
//一些不使用x的代码
...
int value2 = x;

可以看到x的值并未被使用,有些编译器就会将x临时存储寄存器中,在value2需要x的时候,才从寄存器中读取x的值.但是如果两行代码之间改变了x的值,就不会进行这种优化.

volatile关键字就是用来提示编译器这种事情会发生的,如果没有volatile,编译器就会假定变量的值在使用中不会改变,再尝试优化代码.

可以与const一起使用,顺序随意.

const volatile int* vip;
volatile const int* vip;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值