C 中的引用

2021-10-22 00:23:41 字數 2664 閱讀 6523

引用不是新定義了乙個變數,而是給已經存在的變數取了乙個別名,編譯器不會為引用變數開闢記憶體空間,他和他引用的變數共用一塊記憶體空間(通俗點來講,引用就是取別名)

型別& 引用變數名(物件名)=引用實體

(注意:引用型別和引用實體必須是同種型別的)

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 常用的乙個重要內容之一,正確 靈活地使用引用,可以使程式簡潔 高效。我在工作中發現,許多人使用它僅僅是想當然,在某些微妙的場合,很容易出錯,究其原由,大多因為沒有搞清本源。故在本篇中我將對引用進行詳細討論,希望對大家更好地理解和使用引用起到拋磚引玉的作用。一 引用簡...