指针
1. 指针类似于迭代器,有++操作和*操作。要注意的是,最好不要留下不初始化的指针,这样很容易引起错误,而且很难发现,但是初始化为0的指针是可以被发现的,即不指向任何对象的空指针,所以如果指针暂时没有要指向的对象,最好初始化为0,也可以用cstdlib库里的NULL变量来初始化空指针,NULL不在std namespace里,所以不需要用std::NULL,而是直接用NULL。
2. void* 指针可以指向任何类型的对象:
void *pv=&obj; //obj可以是任何类型的对象
pv=pd; //pd可以是任何类型的指针
但是void*类型的指针可以进行的操作很有限:a)与另一个指针比较;b)作为函数的参数或返回值;c)给另一个void*型指针赋值。但是不能对void*指针所指对象进行操作。
3. pointer 和reference的区别主要有两个:一是reference永远是指向某个对象的,它其实只是一个对象的别名,而指针可以为空;二是当对reference赋值时,改变的是它所指对象的值,而对pointer赋值时,改变的是pointer所指的对象,对对象本身没有任何影响:
int ival=1024, ival2=2048;
int *pi=&ival, *pi2=&ival2;
pi=pi2; //pi指向了pi2,但是ival没有变化
int &ri=ival, &ri2=ival2;
ri=ri2; //ri依旧指向ival,ival的值变成2048
4. 指针的指针,如int **ppi, 即指向int型指针的指针,要获取该int变量的值,需要两次dereference操作**ppi。
5. 对数组使用下标实际上是在对指针使用下标,只要一个指针指向数组的某个元素,即可对其使用下标:
int *p=&a[2];
int j=p[1]; //j的值等于a[3]
int k=p[-2]; //k的值等于a[0]
6. 指针可以指向数组的最后一个元素的下一个不存在的元素位置,就像iterator一样,用于跟其他指针比较从而判断是否遍历完所有的元素,显然它不能进行*(dereference)操作。
7.指向const变量的指针可以这样定义:
const double *cptr;
const double pi=3.14;
double n=2.7;
cptr=π //OK:指向const变量
cptr=&n; //OK:也可以指向非const变量
*cptr=2.8; //ERROR:无法通过这个指针改变非const变量的值,因为cptr始终认为它指向const变量
const型指针,可以理解为只读型指针,不能改变这个指针的值,定义如下:
int *const curErr=&errNumb;