1. References不能为null,而pointer却可以
string &s1 //错误。Referencesbi必须被初始化
char* p = 0x0; //正确,指针可以为空
2. References必须有初值,pointer却不受限制
string s1(“hello”) //ok!
String &s2 = s1 // ok!,s2指向s1
String* ps //正确。
由于References必须有初值,这就意味着使用References可能更有效率,因为使用References之前不需要进行有效性测试。比如
void Func(const int& rd)
{ Cout << rd; }
void Func(const int* rd)
{ If(rd) Cout << rd; }
3. pointer可以被重新赋值,reference却总是指向他最初获取的值。
String s1(“张三”);
String s2(“李四”);
String & rs = s1;
Rs = s2; //注意!!!此时的地址不变化,但是内容却发生了变化,s1已经和s2相同。可见rs一旦已reference方式初始焕,其指向的地址就一直不变,
String * ps = s2;
* ps = s1; //无论ps指向谁,其第一指向的值都不受到影响,改变的只是ps指向的地址的值。
因此,可以这么理解:以reference初始化后,其地址恒久不变,每一次的赋值改变都是地址内的数据改变;以pointer初始化后,其数值不变,每一次改变只是改变指向的地址的值。
4. 互相之间可相互转换;
int array[10];
… … …
int& GetItem(int dIndex)
{ Return array[dIndex]; }
int *GetItem(int dIndex)
{ Return *array[dIndex]; }
注意:针对此处的返回结果,如果在外部进行修改,若对以reference方式获取的数据进行修改,则对原数据(array[dIndex])不受影响,因为返回的值是一个临时构造生成的新的变量。而以pointer方式获取的数据进行修改,原数据(array[dIndex])相应的被修改,应为被修改的值就是原数据array[dIndex]
注,本文内容可请参考 scott meyers 的 more effective c++