指针初始化和赋值操作的约束:
对指针进行初始化或赋值只能使用以下四种类型的值:、
(1)0值常量表达式,例如,在编译时可获取0值得整形const对象或字面值常量0。
(2)类型匹配的对象的地址。
(3)另一对象之后的下一地址。
(4)同类型的另一个有效指针。
把int类型变量赋给指针是非法的,尽管此int型变量可能为0,但允许把数值0或者在编译时获得0的值得const量赋给指针。
Int ival;
Int zero=0;
Const int c_ival=0;
Int *pi=ival; //error: pi initialized from int value of ival
Pi=zero; //error: pi assigned int value of zero
Pi=c_ival; //ok: c_ival is a const with compile-time value of 0
Pi=0; //ok: directly initialize to literal constant 0
Void *指针。C++提供了一种特殊的指针类型void *,它可以保存任意类型对象的地址。
Void *指针只支持几种有限的操作,与另一个指针进行比较,向函数传递void *指针,或从函数返回void *指针,给另一个void *指针赋值,不允许使用void *指针操作它所指向的对象。
C++允许计算数组或对象的超出末端的地址,但不允许对此地址进行解引用操作。而计算数组超出末端地址之后的数组首地址之前的地址都市不合法的。
指向函数的指针:
用typedef简化函数指针的定义
Typedef bool (*cmpFcn)(const string &, const string &);
该定义表示cmpFcn是一种指向函数的指针类型的名字。该指针的类型为“指向返回bool类型并且带有两个const string类型引用参数的函数的指针”。要使用这种函数指针时,只需要直接使用cmpFcn即可,不用每次都把整个类型的声明都全部写下来。
可使用函数名对函数指针做初始化或赋值。
cmpFcn pf1=0;
cmpFcn pf2=lengthCompare;
pf1=lengthCompare;
pf1=pf2;
直接引用函数名等效于在函数名上应用取地址操作符。
cmpFcn pf1=lengthCompare;
cmpFcn pf2=&lengthCompare;
函数指针只能通过同类型的函数或函数指针或0值常量表达式进行初始化或赋值。
指向不同类型的函数指针之间不存在转换。
如果指向函数的指针没有初始化,或者具有0值,则该指针不能再函数调用中使用。只有当指针已经初始化,或被赋值为指向某个函数,方能安全的用来调用函数。