一、從內存上講,系統爲指針分配內存空間,而引用與綁定的對象共享內存空間,系統不爲引用變量分配內存空間; 安全
二、指針初始化後能夠改變指向的對象,而引用定義的時候必需要初始化,且初始化之後不容許再從新綁定對象。 函數
三、因此引用訪問對象是直接訪問,指針訪問對象是間接訪問 工具
四、在C++中,指針和引用常常用於函數的參數傳遞,然而,指針傳遞參數和引用傳遞參數有本質不一樣: spa
1)指針參數傳遞本質上是值傳遞。值傳遞過程當中,被調函數的形式參數做爲被調函數的局部變量處理,即在棧中開闢了內存空間以存放由主調函數放進來的實參的值,從而造成一個實參的副本。值傳遞的特色是被調函數對形式參數的內核操做都做爲局部變量進行,不會影響主調函數的實參變量的值。 指針
2)引用參數傳遞過程當中,是址傳遞。被調函數的形式參數雖然也做爲局部變量在棧中開闢了內存空間,可是這是存放的是由主函數放進來的實參變量的地址。被調函數對形參的任何操做都被處理成間接尋址,及經過棧中存放的地址訪問主調寒素中的實參變量。 orm
相同點: 對象
都是地址的概念:指針指向一塊內存,它的內容是所指內存的地址;而引用則是某塊內存的別名。 內存
不一樣點: 變量
指針是一個實體,而引用僅是個別名; 引用
引用只能在定義時被初始化一次,以後不可變,指針可變;
引用沒有const,指針有const,const的指針不可變;
引用不能爲空,指針能夠爲空;
「sizeof引用」獲得的是所指向變量的大小,而「sizeoff指針」是指針的大小。
指針和引用的自增運算意義不一樣
引用是類型安全的,指針不是;
例子:
int m;
int &n=m;//n是m的別名,即不是對m的拷貝,也不是指向m的指針;
引用的規則:
(1)引用被建立時必須初始化
(2)不能有NULL引用,必須與合法的存儲單元關聯
(3)一旦初始化,就不能改變引用關係
int i = 5;
int j = 6;
int &k = i;
k = j; // k和i的值都變成了6;
C++語言中,函數的參數和返回值的傳遞有三種:值傳遞、指針傳遞和引用傳遞。
值傳遞
因爲Func1函數體內的x是外部變量n的一份拷貝,改變x的值不會影響n, 因此n的值仍然是0。
void Func1(int x)
{
x = x + 10;
}
...
int n = 0;
Func1(n);
cout << "n = " << n << endl; // n = 0
指針傳遞
因爲Func2函數體內的x是指向外部變量n的指針,改變該指針的內容將致使n的值改變,因此n的值成爲10。
void Func2(int *x)
{
(* x) = (* x) + 10;
}
...
int n = 0;
Func2(&n);
cout << "n = " << n << endl; // n = 10
引用傳遞
因爲Func3函數體內的x是外部變量n的引用,x和n是同一個東西,改變x等於改變n,因此n的值成爲10。
void Func3(int &x)
{
x = x + 10;
}
...
int n = 0;
Func3(n);
cout << "n = " << n << endl; // n = 10
對比上述三個示例程序,會發現"引用傳遞"的性質象"指針傳遞",而書寫方式象"值傳遞"。
實際上"引用"能夠作的任何事情"指針"也都可以作,爲何還要"引用"這東西?
答案是"用適當的工具作恰如其分的工做"。
指針可以毫無約束地操做內存中的任何東西,儘管指針功能強大,可是很是危險。
若是的確只須要借用一下某個對象的"別名",那麼就用"引用",而不要用"指針",以避免發生意外。