一、引用和指針在概念上的區別ios
引用是變量的別名,引用必須在一開始就被初始化,並且其引用的對象在整個生命週期中是不可改變的(自始至終都只能依附於同一個變量),之後對引用的操做其實就是對變量的操做。引用通常是用於處理函數的參數與返回值。例如:程序員
指針是一個變量,其存放的是另外一個變量的地址。例如:安全
因此經過指針能夠對變量的地址進行直接操做,這樣程序員有着更加靈活的選擇,可是,指針會帶來更多的不安全因素。所以做爲一個變量的指針,其在邏輯上是獨立的,它能夠被改變,包括其所指向的地址的改變和其指向的地址中所存放的數據的改變。ide
引用的大小是所指向的變量的大小,指針是指針自己的大小,4個字節。函數
引用比指針更安全。因爲不存在空引用,而且引用一旦被初始化爲指向一個對象,它就不能被改變爲另外一個對象的引用,所以引用很安全。對於指針來講,它能夠隨時指向別的對象,而且能夠不被初始化,或爲NULL,因此不安全。const 指針雖然不能改變指向,但仍然存在空指針,而且有可能產生野指針(即多個指針指向一塊內存,free掉一個指針以後,別的指針就成了野指針)。spa
二、引用和指針在函數傳參數時的區別指針
指針傳遞參數本質上是值傳遞的方式,它所傳遞的是一個地址值。值傳遞過程當中,被調函數的形式參數做爲被調函數的局部變量處理,即在棧中開闢了內存空間以存放由主調函數放進來的實參的值,從而成爲了實參的一個副本。值傳遞的特色是被調函數對形式參數的任何操做都是做爲局部變量進行,不會影響主調函數的實參變量的值。(這裏是在說實參指針自己的地址值不會變)orm
引用傳遞過程當中,被調函數的形式參數也做爲局部變量在棧中開闢了內存空間,可是存放的是主調函數放進來的實參變量的地址。被調函數對形參的任何操做都被處理成間接尋址,即經過棧中存放的地址訪問主調函數中的實參變量。正由於如此,被調函數對形參作的任何操做都影響了主調函數中的實參變量。
對象
#include <iostream>blog
using namespace std;
void FuncA(int &n)
{
n++; //存放的是主調函數放進來的實參變量的地址,會直接影響主調函數變量的值。
cout<<"now the value is "<<n<<endl;
}
void FuncB(int* n)
{
(*n)=(*n)+1; //這裏n是指向實參的地址,若是寫成:n=n+1則是改變n指向的變量;只有(*n)纔是對n指向變量的內容作修改,修改以後,主函數中b的值也就變了。
cout<<"now the value is "<<(*n)<<endl;
}
int main()
{
int a=10;
int b=10;
FuncA(a);
cout<<"a="<<a<<endl;
FuncA(a);
cout<<"a="<<a<<endl;
FuncB(&b);
cout<<"b="<<b<<endl;
FuncB(&b);
cout<<"b="<<b<<endl;
return 0;
}