引用不是新定義了乙個變數,而是給已經存在的變數取了乙個別名,編譯器不會為引用變數開闢記憶體空間,他和他引用的變數共用一塊記憶體空間(通俗點來講,引用就是取別名)型別& 引用變數名(物件名)=引用實體
(注意:引用型別和引用實體必須是同種型別的)
void
test()
2.1引用在定義時必須初始化int
& b;
b =1
;
上面這樣就是不可以的,沒有在定義時進行初始化
2.2乙個變數可以有多個引用
通過上圖可以發現乙個變數是可以有多個引用的,他們的位址全都相同
2.3引用一旦引用了乙個實體,就不能在引用其他實體了不可以↓↓↓
const
int a =10;
int& b = a;
可以↓↓↓
const
int a =10;
const
int& b = a;
可以↓↓↓
int a =10;
const
int& b = a;
由上面三個例子可以得出結論:引用在初始化賦值時,許可權可以縮小,但不能放大(指標也是這樣)含有隱式轉換的情況如下:
//整形和浮點數之間隱式型別轉換
double dd =
2.22
;int i = dd;
const
int& ri = dd;
首先要明白這個ri引用的不是dd,而是乙個臨時變數
dd經過一系列計算後,變成了整數,然後放到了乙個臨時變數中,然後 i 拿到了這個臨時變數
同理
臨時變數具有常性,所以不能是int& ri = dd;
而是const int& ri = dd
4.1做引數
以後會經常用引用做引數
1.引用做引數不需要拷貝(x就是func(a)的別名,所以不用拷貝)
2.如果func(a)中的x不需要改變,那麼最好加const
因為a.實參可以是常量,也可以是變數
b.如果b和x之間存在隱式轉換,也是可以傳遞的
4.2做返回值
int
&count()
接下來看兩段**
左面是傳引用返回,右面是傳值返回。
傳值返回中,n拷貝到臨時變數,臨時變數再拷貝給ret,拷貝了兩次。
在傳引用返回中,臨時變數是n的引用,所以沒有進行拷貝,然後臨時變數再拷貝給ret,相當於是n直接拷貝給了ret,只拷貝了一次。
乙個小問題:
那如果去掉n的static的話,上面兩個**哪個會崩呢?
答:首先要明白,區域性變數出了作用域就會被銷毀。從底層彙編的角度來說,引用和指標是沒有區別的,都是以存位址的方式實現的(了解即可)如果去掉static的話,傳值返回不會崩,因為在返回的時候n已經拷貝給了臨時變數,出了作用域,n被銷毀了,但是這個臨時變數沒有受到影響。
傳引用返回會崩,因為n並沒有拷貝給臨時變數,臨時變數相當於是n的別名,當n出了作用域被銷毀了,再用他的別名就相當於是訪問了一塊已經銷毀了的空間(有點像野指標)
不同點:
引用概念上是定義乙個變數的別名,指標是儲存乙個變數位址。
引用定義的時候必須初始化,而指標沒有要求。
引用在初始化乙個實體後,就不能再引用其他實體,但指標可以在任何時候指向任何乙個同型別的實體。
沒有null引用,但有null指標。
引用比指標使用起來更安全
引用自加即引用的實體增加1,指標自加即指標向後偏移乙個型別的大小。
有多級指標,但沒有多級引用
訪問實體方式不同,指標需要解引用,引用的話編譯器會自己處理。
C 中的引用
最近重新看c 看到些以前沒注意的dd,溫故而知新,暫且記下。引用是能自動間接引用的一種指標,即不必使用間接引用運算子 就可以得到乙個引用值。引用可以為變數起別名,它主要用作函式引數以及函式的返回型別。1 引用的定義 如 int i int j i j是i的引用。1 定義引用時,必須立即對它進行初始化...
C 中的引用
例1 int a int ra a 定義引用ra,它是變數a的引用,即別名 說明 1 在此不是求位址運算,而是起標識作用。2 型別識別符號是指目標變數的型別。3 宣告引用時,必須同時對其進行初始化。4 引用宣告完畢後,相當於目標變數名有兩個名稱,即該目標原名稱和引用名,且不能再把該引用名作為其他變數...
C 中的引用
引用是c 引入的新語言特性,是c 常用的乙個重要內容之一,正確 靈活地使用引用,可以使程式簡潔 高效。我在工作中發現,許多人使用它僅僅是想當然,在某些微妙的場合,很容易出錯,究其原由,大多因為沒有搞清本源。故在本篇中我將對引用進行詳細討論,希望對大家更好地理解和使用引用起到拋磚引玉的作用。一 引用簡...