1.引用和指針的區(qū)別
(1)引用必須在聲明時(shí)初始化,而指針不用。用對(duì)象的地址初始化引用是錯(cuò)誤的,應(yīng)該用對(duì)象本身初始化引用,但可以定義一個(gè)指針引用(即該引用變量是指針類(lèi)型,并引用一個(gè)同類(lèi)型指針)。
int *p = a;
int *&ref = p;    //ok,該引用變量引用int型指針,即使p指向NULL也對(duì)
使用的語(yǔ)言如C++已經(jīng)盡可能地限制引用變量的有效性,但不能完全保證。存在一些無(wú)法保證的情況,例如用于初始化引用變量的變量未被構(gòu)造,主要是因?yàn)槭褂弥羔槼跏蓟米兞繉?dǎo)致(此時(shí)指針指向NULL,無(wú)變量):
int *p = NULL;
int &tmp = *p;   //語(yǔ)句是有效的,但是引用變量是無(wú)效的,因?yàn)橐米兞坎荒芤肗ULL
例如引用對(duì)象被無(wú)意析構(gòu),常表現(xiàn)為對(duì)函數(shù)返回的臨時(shí)變量的引用(返回值在函數(shù)返回時(shí)被析構(gòu),結(jié)果引用錯(cuò)誤):
int result;
result = Function();  //warning,但是result已經(jīng)被賦值為a的值
int &Function()
{
 int a = 5;

 return a;
}
一般在使用返回值引用時(shí),常返回全局變量等無(wú)法析構(gòu)的變量,例如:
int a = 5;    //a是全局變量
int result;
result = Function();  //不會(huì)出現(xiàn)warning
int &Function()
{
 return a;
}
注意int &Function()的返回值可以充當(dāng)左值,但是如果x是函數(shù)的臨時(shí)變量,對(duì)其進(jìn)行引用是危險(xiǎn)的;所以要保證返回值不會(huì)因函數(shù)返回而被析構(gòu)。如下:
int x = 0;    //x是全局變量
int &Function()
{
 return x;
}
void main()
{
 Function() = 100;   //此時(shí)x等于100
}
(2)指針可以指向NULL,而引用不能引用NULL。
(3)引用一旦聲明,引用的對(duì)象不能改變(不能引用其他對(duì)象了),但是引用對(duì)象的值可以改變;指針可以隨時(shí)改變指向的對(duì)象,因此說(shuō)指針更危險(xiǎn),引用比指針安全。可以說(shuō),引用是在不犧牲性能的情況下,更安全的利用指針特性所使用的技術(shù)。
(4)理論上存在兩種必須用指針的情況,其他情況下建議用引用而不是指針:
A.可能存在不指向任何對(duì)象(NULL)時(shí),使用指針。
B.需要指向不同對(duì)象時(shí),使用指針。
(5)在函數(shù)Function(int* &p)中,使用&目的是為了可以改變p指針本身,使其能指向其他對(duì)象,這種用法和Function(int** p)是一樣的,即指向指針的指針。

2.const與指針
(1)const int a = 10與int const a = 10等價(jià);同理const int*與int const*是等價(jià)的。
(2)const int *a是指向const對(duì)象的指針,不可通過(guò)指針改變對(duì)象值,而int * const a是const指針,指針只能指向該對(duì)象。
(3)指針指向const對(duì)象的情況
const int a = 40;
int *p;
p = &a;         //錯(cuò),編譯錯(cuò)誤,
p = (int*)&a;   //編譯通過(guò),但是p無(wú)法改變a的值
const int *p;
p = &a;         //ok

3.const與引用
非Const引用只能綁定到與該引用同類(lèi)型的對(duì)象;
Const引用則可綁定到不同但相關(guān)類(lèi)型的對(duì)象或綁定到右值。
(1)const對(duì)象(包括常量、常量+變量生成的無(wú)名臨時(shí)變量)必須用const引用來(lái)引用,而反過(guò)來(lái)const引用可以引用const和非const變量。
int a = 5;
const int b = 10;
int &ref = a;         //ok
int &ref = b;         //error
const int &ref = b;   //ok,必須為const引用
const int &ref = a;   //ok
const int &ref = 5;      //ok,必須為const引用
const int &ref = a + 3;  //ok,必須為const引用
(2)const引用可以用不同類(lèi)型的對(duì)象初始化,
對(duì)于不同類(lèi)型間的引用:
double a = 3.5;
const int &ref = a;
實(shí)際上其工作流程是先定義int tmp = (int)a,然后const int &ref = tmp,所以必須用const引用,否則會(huì)導(dǎo)致錯(cuò)誤。常量+變量生成的無(wú)名臨時(shí)變量同理。
(3)const引用可以指向需要臨時(shí)對(duì)象的對(duì)象或值
const int ival = 1024;
const int* &b = &ival;        //error
const int* const &b = &ival;  //ok
解釋是:
typedef const int * P;
P &b = &ival;        //error,因?yàn)?amp;ival的值不可改變,而b是非常量指針
P const &b = &ival;  //等價(jià)于const P &b = &ival;