参考:c++ primer p110 指针和const限定符
const和指针在一起有以下几种情况:
1 指向const对象的指针
这就是说指针所指的对象是const类型的,不能通过对指针的解引用修改指向对象的值,以int类型为例,比如:
const int *p; int const *p;
指向const对象的指针有以下几种特性:
1. p只是指向const类型的指针,本身并不是const,所以定义时不需要对其进行初始化
2. 允许给p重新赋值,使其指向另一个const对象,但不能通过p修改其所指的对象的值
3. 把一个const对象的地址赋给一个普通的,指向非const对象的指针会导致编译错误
const double pi = 3.14; double *ptr = π // error: ptr is a plain pointer const double *cptr = π // ok: cptr is a pointer to const
4 不能使用void *指针保存const对象的地址,而必须使用const void *类型的指针保存const对象的地址
const int universe = 42; const void *cpv = &universe; // ok: cpv is const void *pv = &universe; // error: universe is const
5 允许把非const对象的地址赋给一个指向const对象的指针
const double * cptr double dval = 3.14; // dval is a double; its value can be changed cptr = &dval; // ok: but can't change dval through cptr
这样的话修改dval的值也不能通过指针cptr修改,可以通过不用指针的任何方法修改
意义:在实际的程序中,指向 const 的指针常用作函数的形参。将形参定义为指向 const 的指针,以此确保传递给函数的实际对象在函数中不因为形参而被修改。
2 const指针
指针是const类型,这就意味着指针的值不能修改,不能使用指针指向其他对象,指针必须在定义时初始化,如:
int errNumb = 0; int *const curErr = &errNumb; // curErr is a constant pointer curErr = curErr; // error: curErr is const
指针本身是 const 的事实并没有说明是否能使用该指针修改它所指向对象的值。指针所指对象的值能否修改完全取决于该对象的类型。
3 指向const对象的const指针
const double pi = 3.14159; // pi_ptr is const and points to a const object const double *const pi_ptr = π
既不能修改 pi_ptr 所指向对象的值,也不允许修改该指针的指向(即 pi_ptr 中存放的地址值)
4 指针和typedef
typedef string *pstring; const pstring cstr; //这个定义等价于: string *const cstr; // equivalent to const pstring cstr
阅读 const 声明语句产生的部分问题,源于 const 限定符既可以放在类型前也可以放在类型后,把声明语句重写为置 const 于类型之后更便于理解
5 const char *, char const *, char *const的区别
参考:http://blog.csdn.net/yingxunren/article/details/3968800
const char * 等价于 char const *
char * const
Bjarne在他的The C++ Programming Language里面给出过一个助记的方法:
把一个声明从右向左读。
char * const cp; ( * 读成 pointer to )
cp is a const pointer to char
const char * p;
p is a pointer to const char;
Google的笔试题:
下面说法正确的是[]
A.函数foo()不能改变p指向的字符串内容
B.函数foo()不能使指针p指向malloc生成的地址
C.函数foo()可以使p指向新的字符串常量
D.函数foo()可以把p赋值为 NULL.
答案bcd,能改变指针的值而不能变指针指向的值,因为指向的是const