const double PI=3.14;//正确
const int N;//错误,没有初始化
PI=3.1415926;//错误,常量不能作左值
2.const修饰指针声明
使用指针变量做间接访问时,涉及到两个变量,一个是指针变量,另一个是被指针指向的变量。
使用const限定符修饰指针变量声明时,可以将指针变量限定为常量,这时的指针称为指针常量,它不能再指向其它变量(不能作左值)
例如:
int a=0;
int b=1;
int * const p=&a;
p++;//错误,指针常量不能作左值
p=&b; //错误,指针常量不能作左值
声明指针常量必须对指针进行初始化,因为指针本身是常量。使用const限定符修饰指针变量声明时,还可以将const放在变量声明之前,这样声明的指针称为常量指针。
常量指针本身不一定是常量,指针所指的变量也不一定是常量,但是在使用常量指针做间接引用时,却不能作左值使用。
例如:
int a=0;
const int * p;
p=&a;//正确,常量指针本身不是常量,可以作左值
a=1;//正确,a是不是常量
*p=1;//错误,p是常量指针,作间接引用时不能作左值
我们可以把指针常量和常量指针结合起来
例如:
int a=0;
const int * const p =&a;
此时的p不能作左值,间接引用时,*p也不能作左值。
3.const应用
char *p="hello";
声明中的字符串"hello"存放在常数区,其值不能修改,执行下面的语句:
p[0]= 'H';
将引起程序崩溃。如果我们在声明指针p时,加入const限定符,变成如下形式:
const char *p="hello";
使p成为常量指针,这时企图修改字符串"hello"的语句,如:
p[0]= 'H'; //错误,p是常量指针,作间接引用时不能作左值
将成为编译错误。编译时发现错误,总比程序崩溃要好的多。