1.引用和指針的區別
(1)引用必須在聲明時初始化,而指針不用。用對象的地址初始化引用是錯誤的,應該用對象本身初始化引用,但可以定義一個指針引用(即該引用變量是指針類型,并引用一個同類型指針)。
int *p = a;
int *&ref = p;    //ok,該引用變量引用int型指針,即使p指向NULL也對
使用的語言如C++已經盡可能地限制引用變量的有效性,但不能完全保證。存在一些無法保證的情況,例如用于初始化引用變量的變量未被構造,主要是因為使用指針初始化引用變量導致(此時指針指向NULL,無變量):
int *p = NULL;
int &tmp = *p;   //語句是有效的,但是引用變量是無效的,因為引用變量不能引用NULL
例如引用對象被無意析構,常表現為對函數返回的臨時變量的引用(返回值在函數返回時被析構,結果引用錯誤):
int result;
result = Function();  //warning,但是result已經被賦值為a的值
int &Function()
{
 int a = 5;

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

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

3.const與引用
非Const引用只能綁定到與該引用同類型的對象;
Const引用則可綁定到不同但相關類型的對象或綁定到右值。
(1)const對象(包括常量、常量+變量生成的無名臨時變量)必須用const引用來引用,而反過來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引用可以用不同類型的對象初始化,
對于不同類型間的引用:
double a = 3.5;
const int &ref = a;
實際上其工作流程是先定義int tmp = (int)a,然后const int &ref = tmp,所以必須用const引用,否則會導致錯誤。常量+變量生成的無名臨時變量同理。
(3)const引用可以指向需要臨時對象的對象或值
const int ival = 1024;
const int* &b = &ival;        //error
const int* const &b = &ival;  //ok
解釋是:
typedef const int * P;
P &b = &ival;        //error,因為&ival的值不可改變,而b是非常量指針
P const &b = &ival;  //等價于const P &b = &ival;