以前在找工作面试和笔试过程中,只要是考C++的,一般都会问到const之类的问题,主要是const与指针的关系。最近在看c++ primer 第四版。特此做个总结。若有不足之处,望读者指出和谅解。
1. const char *p (指向const对象的指针)
const char *p:表示指针p是一个指向字符常量的指针。可以从表达“
const char *p”的右边向左边去读:首先char *p代表p是一个字符指针,接下来const表示p所指向的内容是常量。
p所指向的字符是一个常量,该常量不能被修改。也就是说,不能通过p去修改它所指向的内容。但是p本身只是一个地址值,该值是可以修改的。具体参见下面几个实例。
1.const char *p; //正确,p是一个指向字符常量的指针,未初始化
2.const int a=4;
const int *pa=&a; //正确,p是一个指向int型常量的指针,已经初始化
3.const int b=4;
int *pb=&b; /
/错误,指针pb必须也要被const修饰,才能指向常量b
4.const int c=4;
const void * pc1=&c; //正确
void *pc2=&c; //
错误,pc2必须也要被const所修饰
5.int d=4;
const int * pd=&d; //
正确,即使被const修饰的指针也能够指向非const对象,不能通过指针pd去修改d的值
这个在很多函数的形参保护中得以体现,比如函数
char *strcpy(char *destination, const char *source);这样无论传给strcpy的参数source是否为字符串常量。都不能在strcpy内部修改source,这样就起到了保护source的作用
double dval = 3.14;
dval = 3.14159;
*cptr = 3.14159; //
编译错误,cptr是一个指向常量double的指针
2.char *const p (const指针)
char *const p:从右向左读,* const p表示p是一个常量且是一个指针,最好char 表示p这个指针指向一个字符,即为一个指向字符的常量指针。
p本身是一个常量,不能被修改,且需要在声明时被初始化,但是p所指向的内容可以被修改。
1. int a=1;
int *const pa = &a; //正确
2. int *const p; //
错误,p是常量需要在声明时被初始化
3.const double pi = 3.14159;
const double *const pi_ptr = π //正确,pi是常量不能被修改,并且 pi_ptr也是常量指针,也不能被修改