这篇说一下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页),所以比较复杂.
描述 | 示例 | 含义 |
类型前const | const float * pf | 指针本身可以改变,指向的值不可改变 |
变量名前const | float* const pf | 指针本身不可改变,指向的值可以改变 |
类型,变量名前const | const float* const pf | 指针本身不可改变,指向的值不可改变 |
类型后,*之前const | float 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;