1、指向const对象的指针;
指针指向const对象,但是指针本身是普通变量,可以修改和赋值。例如:
const int * p;
这样定义效果和上面完全一样:
int const * p;
*p = 23;//error: *p might be const
但是,指针p却是可以修改的:
const int a=2;
const int b=3;
p = &a;
p = &b;
还没完,虽然p是指向const对象的,但是这只是p自己认为自己是指向const对象的:
int c = 4;
p = &c;//ok
*p = 4;//error
这里p指向的是普通对象,但是却不能修改p指向的值,因为p认为自己是指向const对象,是不能修改其值的。
在实际应用中,指向const的指针常用作函数的形参。将形参定义为指向const的指针,可以确保传递给函数的实际对象在函数中不因为形参而被修改。
这才是重点。
但是,把一个const对象的地址赋值给一个普通的、非const对象的指针是错误的,这会导致编译时错误:
int * q;
q = &a;// error!
2、不能使用void *指针保存const对象的地址,而必须使用const void * 类型的指针保存const对象的地址:
const int cu = 23;
const void * p = &cu;//ok
void * q = &cu;// error
3、const指针
上面是指针可变,但是指针指向的对象不能变。
还有一种情况是指针本身不能变--const指针。
int e = 0;
int * const p = &e;
可以这样理解:从右向左,p是指向int型对象的const指针。因为指针是const的,所以任何企图给const指针赋值的行为都导致编译时的错误:
p = p;// error, p is const
所以,必须在定义时初始化,否则以后就再也没有机会了(编译时报错:未初始化)。
但是,p指向的对象是普通的变量,可以修改:
*p = 45; //ok
4、更奇葩的:指向const对象的const指针:
const double pi = 3.14159;
const double * const pi_ptr = π
这里,既不能修改指针pi_ptr的值,也不能修改指针pi_ptr指向的对象。