const 修饰指针和引用的用法,对于初学 C++的人直是讳莫如深,不知所云.一旦
你了解了其用法,一切便不值一哂了.下面我为读者一一释疑:
大致说来其可分为三种情况: const 修饰指针,const 修饰引用,const 修饰
指针的引用.
1.const 修饰指针
const 修饰指针又可分为三种情况:
const 修饰指针本身
const 修饰指针所指的变量(或对象)
const 修饰指针本身和指针所指的变量(或对象)
(1).const 修饰指针本身
这种情形下,指针本身为常量,不可改变,任何修改指针本身的行为都是非法
的.例如:
const int a = 1;
const int b = 2;
int i = 3;
int j = 4;
int* const pi = &i; //ok, pi 的类型为 int* const , &i 的类型为
int* const
int* const pi = &a; //error, pi 的类型为 int* const, &a 的类型
为 const int* const
pi = &j; //error, 指针是常量,不可变
*pi = a; //ok, *pi 并没有限定是常量 ,可变
由此看出,pi 是常量,常量在初始化和赋值时,类型必须严格一致。也
就是
const 修饰指针本身时,=号两边的变量类型必须严格一致,否则不能匹配。
(2).const 修饰指针指向的变量(或对象)
此种情形下,通过间接引用指针不可改变变量的值,假设指针为 p,则*p 不
可变,下面以例子说明:
const int *pi = &a;
//or int const *pi = &a;
//两者毫无二致,不过 BS 喜欢前者,这也没什么技术上的优劣之分,也就是说
const int 与 int const 可以互换.建议大家熟
//悉这两种形式,为简洁便,以后统统用前者.
//ok, const 并不修饰指针本身,pi 对赋值类型
//没要求 ,但 pi 是 int*型指针,所以所赋的必须是个地址值。
const int *pi = &i; //ok ,pi 可赋值常量的地址,又可赋变量的地址
const int *pi1 = &a;
const int *pi = pi1; //ok
*pi = j; //error,*pi 不可变,不能更改指针的间接引用形式
pi = &j; //ok,pi 可变
pi = &b; //ok,pi 可变
pi++; //ok
--pi; //ok