const float PI=3.14;有了这句定义后,程序中就不允许再对PI重新赋值了,以上语句也可将const和float位置互换,不影响语句的意思。下面来看一下用const来控制指针的情况:
定义形式: const int *p;这种写法中,const关键字控制*p的值不能修改。*p表示指针变量指向的变量,也就是说,用这种方式定义的指针,不允许使用*p的方式修改指向变量的值。
例如:第一种情况:
int i=3 ,j;
int const *p=&i;//这条语句是将*p定义成常量,但p、i并没有定义成常量
*p=5;//这句语句是错误的,因为不能对常量进行赋值不允许的,编译将不能通过;
但却可以直接对变量i赋值 接着上面的语句添加这条i=8;语句时,编译可以通过;同时,因为const关键字没控制指针变量p,所以变量p的值(即指针变量所指向的地址)也可以修改,即可让其指向其他变量;p=&j;这条语句也是正确;
第二种情况:
int i=3,j=4;
int * const p=& i;//这条语句是将指针变量p定义成常量(永远指向变量i的地址), 不允许对其进行修改,但*p、i并没有定义成常量;
注意int * const p=& i;这条语句不能分开来写像(int * const p;p=&i;这是错误的,编译不能通过)。
*p=5;
p=&j;//这条语句是错误,编译不能通过,此时p已是常量,不允许对其进行复值
这种情况,关键字const将*和变量p分隔开了。这时,使用const关键字控制变量p,所以变量p的值不允许修改,即该指针为一个指针常量。与数组名相同。
另外, const int k=3;
int *p;
p=&k;
*p=5;以上语句是不能编译通过的,除非将int *p和p=&k两条语句改成const int *p=&k一条语句。修改后此时,k,*p的值都将不能修改而p却还是可以指向其他变量;
但若改成 const int( * (const p))=&k此时k,*p,p的值都将不能修改。我相信大家一定都知道原因了吧。因为k是个常量,所以*p也不能修改。
总结:在用const关键字定义指针常量时,若‘*’在const之后表示将*p定义成了常量(不能修改),而p却可以指向其他地址;若'*'在const之前表示将p定义成了常量(不能修改),而*p的值却可以改变。而对const int k=3;这条语句只能使用const int * p=&k;或
const int( * (const p))=&k才能使指针指向常量k的指针空间。