指针和const限定符

参考: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

原文地址:https://www.cnblogs.com/raichen/p/5496685.html