众所周知,变量是以它类型和存储类表征的。在C90中增加了两个特性:不变性和易变性。这些属性是通过关键字const和volatile声明的,而C99增加了restrict,以方便编译器优化。通过资料的整合和日常的应用,让我们一一来认识这些限定词。
const:带有const声明的变量,不能通过赋值、增量或减量运算来修改变量的值。下面介绍典型的应用:
(1) 在指针的声明中使用const.
const float *pt;//pt 指向一个常量浮点数值,但pt本身的值是可以改变的,即pt可以改变指向的位置,但不能*pt =new_ value,不需要初始化;
float const*ptr;//ptr是常量指针,指向的地址固定,但所指向的值可以改变,即可以使用*ptr=new_value,需要初始化。
constfloat*const pts; // pts 必须总是指向同一个位置,并且所存储位置的值也不能改变,需要初始化;
(2)对全局数据使用const
在全局作用域声明的const是定义该对象的文件的局部变量。此变量只存在于该文件中,不能被其他文件访问(非const变量默认为extern。要使const变量能够在其他文件中访问,必须显示的指定为extern).
注意:const修饰的类型与非const之间的转换
1>把一个const对象的地址付给一个普通、非const对象指针也会导致错误.
举例:
constdouble pi = 1.44;
double*ptr = π //error :ptr is a plain pointer
constdouble *cptr = π // ok :cptr is a pointerto const
2>不能使用void *指针保存const对象的地址,而必须使用const void *:
const intuniverse=42;
const void*cpv=&universe; //ok,cpv is const
void*pv=&universe; //error,universe is const.