1. 程式人生 > 其它 >引用和指標

引用和指標

1、什麼是引用

引用:在程式的不同部分使用兩個以上的變數名指向同一塊地址,使得對其中任何一個變數的操作實際上都是對同一地址單元進行的。

2、引用的特點有:

(1)單一變數可由多個別名

(2)引用必須初始化(指標可以先宣告再引用),接近const指標一旦建立則效忠於其。

(3)引用只能在初始化的時候引用一次,不能更改為轉而引用其他變數,即不能通過賦值來實現引用。

(4)對引用進行操作,實際是對被引用的變數進行操作

(5)引用是變數的別名,而不是定義了一個變數,引用不佔記憶體,只是和目標變數指向目標的同塊記憶體地址,宣告引用時目標的儲存狀態不會改變。

(6)表示式中的取地址符&不再是取變數的地址,而是用於表示該變數是引用型別的變數。

(7)引用不能套娃,只有一級;指標可以連續套娃,有多級。引用沒有空引用,指標有空指標。

3、左值和右值的定義:

左值是具名變數可以取地址,是長久的;右值是匿名變數不能取地址,是短暫的。左值可以轉化為右值,但是右值不能轉化為左值。

下述程式碼含有左值引用的正確規範,其中int &y=100是違背引用精神的,100為數字常量屬於右值不能實現左值的轉換。這種情況的解決方案為常量左值引用,這樣引用指向的值不能改變。

//左值引用
int x = 100;
int &y = x;
y++;

//下面這張情況是違背右值不能轉換左值結論的
int &y = 100;

//解決方案為:
const int &y = 100;

右值引用的形式類似int &y=100,這是C++11版本增加的功能,右值引用關聯到右值時右值被儲存到特定位置,右值引用指向特定位置,右值雖然無法獲取地址但是右值引用能獲取地址(臨時物件的儲存位置),本質是編譯器為右值提供了臨時變數空間。

C++11提供了move函式用於獲得繫結到左值上的右值引用(定義於utility標頭檔案中)。

int &y = move(x)

4、引用的應用主要由基礎引用、const引用、引用做引數、引用做返回值。其中,引用做函式返回值型別使用的時候,原先函式的返回值是將內容複製到一個臨時返回儲存單元中,然後該臨時返回儲存單元的內容將被複制到新儲存單元,使用引用返回函式值時內容可以直接複製到新儲存單元。返回引用需要注意的問題是避免函式終止時不再存在的記憶體單元(臨時變數)引用

。解決臨時變數執行完畢後不存在的問題的辦法可參考以下程式碼,通過new分配新的記憶體空間並返回指向該記憶體空間的指標,但是這種方法容易忘記delete導致記憶體洩露,類物件可以使用解構函式刪除指向的記憶體。

const A & B(A & a)
{
  A * a1 = new A;
  * a1 = a;
  return *a1;
}
//注意:不再需要new分配的記憶體時要使用delete釋放

5、指標和引用的區別:

指標的作用有:

(1)裝地址(2)不同變數訪問同一塊空間

引用:只可以實現用不同變數訪問同一塊空間

★“sizeof 引用”得到的是所指向的變數(物件)的大小,而“sizeof 指標”得到的是指標本身(所指向的變數或物件的地址)的大小;

★指標和引用的自增(++)運算意義不一樣;引用是值的增減,指標是地址的偏移

★從記憶體分配上看:程式為指標變數分配記憶體區域,而引用不需要分配記憶體區域。

★指標和引用都是地址的概念,指標指向一塊兒記憶體,其內容為所指記憶體的地址;引用是某塊兒記憶體的別名。指標比引用更為靈活,但是其風險也很大。使用指標時一定要檢查指標是否為空(NULL),且空間回收後指標最好置零,以免野指標的發生造成記憶體洩漏等問題。

部分內容參考:https://www.cnblogs.com/shiheyuanfang/p/13353640.html