C 中引用的分析

2021-10-13 12:40:08 字數 2073 閱讀 6795

@引用詳解

引用:引用就是給變數取別名,編譯器不會為引用變數開闢記憶體空間,它和它引用的變數共用同一塊記憶體。

例如:高中同學給我起的外號:疙瘩。疙瘩是我,我也是我

型別& 引用變數名(物件命)

=引用實體

void test(

)

1.引用在定義時必須初始化

int

& r;

// 編譯時會出錯

2.乙個變數可以有多個引用

int a=10;

int& ra = a;

int& rra = a;

3.引用變數與引用實體的型別必須要一致

int a=10;

int& ra = a;

double& rd = a;

// 編譯時會出錯

4.引用一旦引用乙個實體,再不能引用其他的實體,該引用在其生命週期內,只能和乙個實體結合

1.做引數

void swap(

int& left,

int& right)

/// 建議:如果不想通過形參來改變外部實體的情況下,可以以const型別引用作為形參

void print(const int

& r)

2.做返回值

// 錯誤示例:

int& add(

int a,

int b)

int main(

)

因此:以引用方式作為函式返回值時,一定不能返回函式棧上的空間(典型:區域性變數),因為函式結束後,函式體內的區域性變數就被銷毀了。如果在外部以引用的方式來接收函式的返回值,外部的引用實際引用的就是一塊非法的記憶體空間。

// 正確使用方法:

int& count(

)

3.常引用

void test(

)

傳值:形參是實參的乙份拷貝,傳參的效率低,不會通過改變形參而改變外部的實參。

傳引用:形參實際是實參的別名,傳遞效率高,可以通過形參改變外部的實參-->可以達到與指標類似的效果,而且比指標可用性更高更安全。

1.從概念上來看

指標是通過某個指標變數指向乙個物件後,對它所指向的變數間接操作。

引用本身就是目標變數的別名,編譯器不會給引用型別的變數開闢記憶體空間,引用與其引用的實體公用的是同一塊記憶體空間,對引用的操作就是對目標變數的操作。

2.在底層實現上

引用實際是有空間的-->因為引用就是指標,它裡面儲存的是引用實體的位址。

引用和指標的不同點的總結:

1. 引用在定義時必須初始化,指標沒有要求

2. 引用在初始化時引用乙個實體後,就不能再引用其他實體,而指標可以在任何時候指向任何乙個同型別

實體3. 沒有null引用,但有null指標

4. 在sizeof中含義不同:引用結果為引用型別的大小,但指標始終是位址空間所佔位元組個數(

32位平台下佔

4個位元組)

5. 引用自加即引用變數所引用的實體增加1,指標自加即指標向後偏移乙個型別的大小

6. 有多級指標,但是沒有多級引用

7. 訪問實體方式不同,指標需要顯式解引用,引用編譯器自己處理

8. 引用比指標使用起來相對更安全

C 中引用的本質分析

引用是c 中心增加的內容,在c語言是沒有引用這一種用法的。那什麼是引用呢?大家都知道,我們定義變數的時候,其實是將變數名和記憶體空間關聯起來,變數名就是一段記憶體空間的別名。當我們使用引用的時候,例如int a b 其實就相當於a是b的別名,也就是說a和b都是指向同一段儲存空間的。那這麼做有什麼意義...

C 的引用分析

引用的意義 引用作為變數名而存在,因此在一些場合可以代替指標 引用相對於指標來說具有更好的的可讀性和實用性 const的引用 在c 中可以宣告const引用 const type name var const 引用讓變數擁有唯讀屬性 int a 4 const int b a int p int b...

C 引用的本質分析

事物的難度遠遠低於對事物的恐懼!下邊來看看乙個老生常談的交換函式 include using namespace std 引用方式 void swap1 int a,int b 注意 函式引數中的引用不需要初始化 指標方式 void swap2 int a,int b int main int ar...