C 語言基礎 8 引用

2022-06-11 17:42:10 字數 2623 閱讀 5414

1.引用不能繫結臨時資料,也不能繫結任何無法獲取記憶體位址的常量,表示式,或值,常引用除外。

第一種寫法:(錯誤)

int

func_int()

intmain()

第二種寫法:

bool isodd(int &n)

else

}int

main()

第三種寫法(正確)

int

func_int()

intmain()

第四種寫法:(正確)

bool isodd(const

int &n)

else

}int a = 100

;isodd(a);

//正確

isodd(a + 9); //

正確isodd(27); //

正確isodd(23 + 55); //

正確

為什麼加了const就可以?這是因為將常引用繫結到臨時資料時,編譯器採取了一種妥協機制:編譯器會為臨時資料建立乙個新的、無名的臨時變數,並將臨時資料放入該臨時變數中,然後再將引用繫結到該臨時變數。注意,臨時變數也是變數,所有的變數都會被分配記憶體。

2.const修飾引用時三種寫法的區別:

第一種寫法(錯誤)

int a = 20

;int & const r = a;

第二種寫法(正確)

int a = 20

;int

const &r = a;

第三種寫法(正確)

int a = 20

;const

int &r = a;

上述三種寫法中,第一種寫法是嚴重錯誤的。因為引用在定義時就必須初始化,並且以後也要從一而終,不能再指向其它資料,這也就意味著r本來就不能改變指向,加上const純屬多此一舉。

第二種寫法和第三種寫法本質上是一樣的,在定義引用時加上const限制,目的都是不希望通過引用來修改原始資料的值

#include using

namespace

std;

intmain()

執行結果:

99, 99

0x28ff44, 0x28ff44

如果不希望通過引用修改原始資料的值,可以在定義時新增const限制:

const

int &b = a; //

或int

const &b = a;

注意:引用在定義時需要新增&,在使用時不能新增&,使用時新增&表示取位址

#include using

namespace

std;

void swap3(int &a, int &b);

intmain()

void swap3(int &a, int &b)

執行結果:

input two integers: 12 34

12 34

input two integers: 88 99

99 88

input two integers: 100 200

200 100

引用除了可以作為函式形參,還可以作為函式返回值,請看下面的例子:

#include using

namespace

std;

int &plus10(int &n)

intmain()

執行結果:

20 20

注意:在將引用作為函式返回值時應該注意乙個小問題,就是不能返回區域性資料(例如區域性變數區域性物件區域性陣列等)的引用,因為當函式呼叫完成後區域性資料就會被銷毀,有可能在下次使用時資料就不存在了,c++ 編譯器檢測到該行為時也會給出警告。

因此像下面的寫法是不正確的:

#include using

namespace

std;

int &plus10(int &n)

intmain()

不能將區域性變數m返回!因為函式是在棧上執行的,並且執行結束後會放棄對所有區域性資料的管理權,後面的函式呼叫會覆蓋前面函式的區域性資料。本例中,第二次呼叫 plus10() 會覆蓋第一次呼叫 plus10() 所產生的區域性資料,第三次呼叫 plus10() 會覆蓋第二次呼叫 plus10() 所產生的區域性資料。

C 基礎(05) 引用

1 引用就是給變數起乙個別名。其本質就是乙個指標常量 指標指向的位址不可以修改 int a 10 b 是a的別名。b和a所訪問的記憶體是相同的 int b a 2 注意事項 3 引用作為函式的引數 1 函式的引數傳遞可以為 值傳遞 位址傳遞 引用傳遞。其中值傳遞不會改變原來的變數內容,其相當於將原來...

C 基礎05 引用的基礎

變數名實質上是一段連續儲存空間的別名,是乙個標號 門牌號 程式中通過變數來申請並命名記憶體空間 通過變數的名字可以使用儲存空間 屬於c 編譯器對c的擴充套件 不能用c編譯器的角度思考引用 void main 普通引用必須初始化 void swap int a,int b 改變指標所指位址上的值 vo...

C 基礎語法 01 引用

變數名實質上是一段連續儲存空間的別名,程式通過變數來申請並命名記憶體空間,通過變數的名字可以使用儲存空間 c 中新增加的概念,引用可以看作乙個已定義變數的別名 定義引用的方式 type name var 引用作為其它變數的別,在一些場合可以代替指標,引用相對於指標來說具有更好的可讀性和實用性 引用在...