C 學習筆記之 引用

2021-07-03 04:30:13 字數 2885 閱讀 5529

先宣告一下,這裡的內容大多是《c++程式設計思想》中的內容,我最近在學習c++,覺得裡面的很多話不錯,另外例子也都自己實驗了一番,有些現象很有趣,希望與大家分享。

•引用(reference)(&)就像能自動地被編譯器間接引用的常量型指標。(常量型指標的含義就是常量修飾指標,即指的地方不變,但所指地方的內容可以改變。)

#include 

using

namespace

std;

int y;

int& r = y;//當乙個引用被建立的時候,它必須被初始化為乙個物件。

//你也可以這樣寫:

const

int& q = 12;//(1)這時,引用就被繫結到乙個儲存位置中。

int x=0; //(2)

int& a =x;//(3)

int main()

在位置(1),編譯器分配了乙個儲存單元,它的初始值被初始化為12,於是這個引用就和這個儲存單元聯絡上了。應用要點是任何引用必須和儲存單元聯絡。訪問引用時,就是訪問這個儲存單元。因此,增加a事實上就是增加x,這個可在main()函式中顯示出來,思考乙個引用最簡單的方法就是把它當做乙個奇特的指標,這個指標的乙個優點是不必懷疑它是否被初始化了(編譯器強迫它初始化),也不必知道怎樣對它間接引用(這由編譯器做)。使用引用時有一定的規則:

1.當引用被建立時,它必須被初始化(指標則可以在任何時候被初始化)。

2.一旦乙個引用被初始化為指向乙個物件,它就不能改變為另乙個物件的引用(指標則可以在任何時候指向另乙個物件)。

3.不可能有null引用。必須確保引用是和一塊合法的儲存單元關聯。

•函式中的引用:

最經常看見引用的地方是在函式的引數和返回值中。當引用被用作函式引數時,在函式內任何對引用的更改將對函式外的引數產生改變。當然,可以通過傳遞乙個指標來做相同的事情,但引用具有更清晰的語法。

如果從函式中返回乙個引用,必須像從函式中返回乙個指標一樣對待,當函式返回時,無論引用關聯的是什麼都應該存在,否則,將不知道指向哪乙個記憶體。

int& h()

int& h()

這樣就沒有報錯。

可見f()函式傳進去的是a的位址,返回的也是a的位址。

g()函式傳進去的是a的引用,相當於傳進去的a的儲存單元的值,返回的是a的儲存單元的值。

對函式f()的呼叫缺乏使用引用的方便性和清晰性,但很清楚這是傳遞乙個位址。在函式g()的呼叫中,位址通過引用被傳遞,但表面上看不出來。

•常量引用

剛剛函式中引數是非常量物件時,這個引用引數才能工作。如果是常量物件,函式g()將不接受這個引數,這樣做是一件好事,因為這個函式將改變外部引數。如果知道這函式不妨礙物件的不變性的話,讓這個引數是乙個常量引用將允許這個函式在任何情況下使用。這意味著,對於使用者定義的型別,該函式只能呼叫常量成員函式,而且不應當改變任何公共的資料成員。

呼叫f(1)會產生編譯期間錯誤,這是因為編譯器必須首先建立乙個引用,即編譯器為乙個int型別分派儲存單元,同時將其初始化為1並為其產生乙個位址和引用**在一起。儲存的內容必須是常量,因為改變它沒有任何意義,我們再不能對它進行操作。當改變這種資料的時候,編譯器會指出錯誤,這是非常有用的提示,因為這個改變會導致資訊丟失。•指標引用在c語言中,如果想改變指標本身而不是它所指向的內容,函式宣告可能像這樣:

void f(int **)
int i = 47;

int* ip = &i;

f(&ip);

對於c++中的引用,語法清晰多了。函式引數變成指標的引用,用不著取得指標的位址。

int*& i理解的話,相比於int& i。我的理解是int*& i, i首先是乙個引用,之後是對int*的引用,即指標的引用。

#include 

using

namespace

std;

void increment(int*& i)

int main()

結果很有意思,定義i是乙個指標,指向的位址是0。執行increment(i)函式之後,指標加一,因為是整型變數的指標,指向下乙個整型變數,記憶體位址就加了4。所以結果是:

有什麼說錯的地方,還望大家多多指正。

C 學習筆記之引用

引用的概念 引用的本質 引用的意義 思考點引用是c 中引入的乙個新概念,它是乙個已定義變數的別名。int a 0 int b a 引用在c 中的內部實現是通過常指標來實現的 type a type const a 但又不等價於常指標 區別間思考點1 引用定義時必須被初始化,原因是引用的本質是乙個常指...

C 學習筆記之引用

型別名 引用名 某變數名 比如 int r n r引用了n,r的型別是int 某個變數的引用,等價於這個變數,相當於該變數的乙個別名。引用只能引用變數,不能引用常量和表示式。t 型別的引用或t型別的變數可以用來初始化const t 型別的引用。const t 型別的常變數和const t 型別的引用...

c 學習筆記之引用

引用是 c 的新增內容,在實際開發中會經常使用 c 用的引用就如同c語言的指標一樣重要,但它比指標更加方便和易用,有時候甚至是不可或缺的。同指標一樣,引用能夠減少資料的拷貝,提高資料的傳遞效率。引用 reference 是 c 相對於c語言的又乙個擴充。引用可以看做是資料的乙個別名,通過這個別名和原...