1 一个有效指针的三种状态:
1) 保存一个特定对象的地址;
2) 指向某个对象后面的另一对象;
3) 0值。表明它不指向任何对象。
如果必须分开定义指针和其所指向的对象,则将指针初始化为0。
如果在代码中使用了NULL这个于处理器变量,则编译时会自动被数值0替换。
2 void*型指针
思考题:已知一指针p,你可以确定该指针是否指向一个有效的对象吗?void*指针可以博阿村任何类型对象的地址,表明该指针与这一地址值相关,但不清楚存储在此地址上的对象的类型。
void*指针支持的操作:
1) 与另一个指针进行比较
2) 向函数传递void* 指针或者从函数返回void* 指针
3) 给另一个void*指针赋值
不允许使用void*指针操纵它所指向的对象。因为需要重新获取存储在void*指针中的地址。
不可以。因为c++中,无法检测指针是否被初始化,也无法区分一个地址是否是有效地址,还是由指针所分配的存储空间中存放的不确定值的二进制位形成的地址。
3 指针和引用的比较
注:C++允许计算数组或者对象的超出末端的地址,但不允许对此地址进行解引用操作。虽然指针和引用都可以间接访问另一个值,但是它们之间有两个重要区别(定义和赋值):
1) 引用总是指向某个对象,所以定义引用时没有初始化是错误的;
2) 赋值行为的差异:给引用赋值修改的是该引用所关联的对象的值,为不是使引用与另一个对象关联。
4 指向const对象的指针和const指针
指向const对象的指针:const double *cptr;
const指针:int *const curErr = &errNumb;1) 把一个const对象的地址赋给一个普通的、非const对象的指针也会导致编译时的错误
2) 不能使用void*指针保存const对象的地址,而必须使用能够const void*类型的指针保存const对象的地址
3) 允许把非const对象的地址赋给指向const对象的指针,此时不能通过该指针修改该指向对象的值
因此把指向const对象的指针理解为”自以为指向const的指针“
指向const对象的const指针:const double *const pi_ptr = π1) const指针的值不能修改,这就意味着不能使curErr指向其他的对象
2) 指针本身是const的事实并没有说明是否能使用该指针修改它所指向对象的值。指针所指对象的值能否修改完全取决于该对象的类型。
既不能修改pi_ptr指向对象的值,也不允许修改该指针的指向。
5 指针和typedef
typedef string *pstring;
const pstring cstr;
该声明把cstr定义为指向string类型对象的const指针。因为声明const pstring时,const修饰的是pstring的类型,这是一个指针。
等价于:
string *const cstr;