對C 引用的理解

2021-08-21 22:15:16 字數 2616 閱讀 2615

c++中引用是個非常重要的概念,引用是在c++中新增的一種復合型別,是已定義的變數的別名。但是這種別名有什麼作用呢?難道只是為了給變數起個綽號?並不是,引用變數的主要作用是用作函式形參,通過使用引用變數作為函式引數,函式將使用原始資料,而不是使用資料的副本,這樣除了指標之外,為函式訪問原始資料提供了另一種快捷的方法,還有,對於設計類來說,引用也是必不可少的。

int a=0;    //定義乙個整形變數a

int &r=a; //定義乙個整型變數的引用r並作為a的引用

在將乙個引用定義完成之後,如果你將其他變數(同型別的)再賦值給這個引用,編譯是可以通過的,但是這不是將這個引用的目標重新定位了,而是改變了原來變數的值。比如:

int a = 0, b = 1;

int &r = a;

r = b;

本來想讓r作為b的引用,可是這樣執行完之後就會發現a不再為0而是1了,因為在執行r = b;這句**時,r已經代表了變數a,那麼這段**便等同於a = b;所以說引用不能被重新定位,是非常「忠心」的。

原則上引用是要在發生在相同型別的條件下的,比如int型別的引用必須指向int型別的變數,要是將int型別的引用初始化為double型別的變數時編譯就會不通過,但是如果給int前加const修飾便可以通過編譯,但相應的會丟失精度。

double f = 3.14;

const

int &r = f;

cout

<< "r = "

<< r << endl;

cout

<< "f = "

<< f << endl;

這段**輸出的便是r = 3,f = 3.14。

引用與指標有很多共性,比如在函式傳參時可以在函式內訪問到原始資料而不是資料的副本(拷貝了乙份的資料),其實引用和指標在底層的實現是一樣的,但是引用與指標之間還是有一定的區別的。

引用在定義時必須初始化,而指標可以不初始化,頂多算個野指標。

引用在定義完成後不能再被重定向,而指標可以。即使想通過各種花式操作來讓引用重定向,也是不行的,比如:

int a = 0, b = 1;

int *p = &a; //定義乙個指標p先指向a

int &r = *p; //定義乙個引用r作為p指向的變數a的引用

p = &b; //將p重新指向變數b

cout

<< "r = "

<< r << endl; //輸出r的值

cout

<< "*p = "

<< *p << endl; //輸出指標p指向的變數

這段**輸出結果為r = 0;*p = 1;

說明r被定義出來作為a的引用後並不會因為中間經了一手指標p而隨著指標p被重定向。

3. 指標在要訪問指向的值時需要解引用,而引用不需要(可以理解為引用在使用時編譯器隱式的將它解引用了,因為引用和指標在底層實現時其實是一樣的)

變數作為形參(值傳遞)

int cub(int n)      //這個函式接受乙個int型別的引數,然後返回這個引數的三次方的值

int main()

int main()

這個函式輸出為a = 27, a^3 = 27。

在函式中改變了傳入的引數的值,相應的傳入的引數的值也隨著改變了,說明傳入指標的方式使用的就是原資料本體。

引用作為形參

int& cub(int &n)        //這個函式接受乙個指向int型別變數的引用,然後返回這個變數的三次方的值的引用

int main()

這個函式輸出為a = 27, a^3 = 27。

在函式中改變了傳入的引數的值,相應的傳入的引數的值也隨著改變了,說明傳入引用的方式使用的也是原資料本體。

說明在函式引數中傳入引用使用的也是原資料本體,這也從一方面驗證了引用和指標在底層實現都是儲存了原資料的位址來進行操作的,只是編譯器在使用指標時進行了隱式的解引用。

在函式傳遞和返回引數時,特別是一些佔記憶體比較大的結構體(物件),要作為引數傳遞或返回時應該盡可能地採用引用,這樣傳入和返回都是乙個位址,若採用值傳遞和值返回,都要將整個結構體(物件)拷貝乙份,這樣就需要很大的開銷。使用引用可以提高程式的執行效率。

在以引用作為引數的函式內不想改變傳入引數的值時,應該盡可能地用const來修飾,這樣可以防止在函式內對原始資料的誤改,如果出現了誤改編譯器就會報錯提示。

函式返回引用時要避免返回棧上空間的引用

int& fun()  

這個函式中,定義了乙個變數a,這個a是乙個區域性變數,是在函式棧幀上的變數,返回的r是a的位址,函式結束即銷毀,返回的位址也就沒有了意義。

參考:《c++ primer plus第六版 》 人民郵電出版社

對C 引用的簡單理解

引用是c 中的特殊用法,在c語言中是沒有的,有點類似c語言中指標的一種用法。引用簡單說就是對已經建立的起乙個別名,或者說建立乙個副本,但是它是不分配記憶體的。對引用變數的操作直接改變被引用變數的值,相當於是對位址操作,引用變數不能單獨存在,一定是要有被引用變數的存在,才會有引用變數。例如int a ...

對const和引用的新理解

在c語言中,const實際是乙個冒牌貨,例如,const int a 10 a是乙個唯讀的常量,通過指標可以繞過去 在c 中,通過const 修飾的東西,會變成什麼樣子?1.const int a 10 放入符號表裡,始終從符號表裡拿資料,a變成真正意義上的常量10 keyvaluea10 c 裡面...

C 指標的引用理解

指標可以作為引數傳遞直接修改所指的變數的值,如下 void change int p int main 指標傳遞實際上也是值傳遞,傳遞的值便是指標的位址,執行 p 20後,雖然傳遞的是乙個位址的副本,但是副本的值就是變數的位址,執行後,所指向的位址的值變成了20,達到了修改變數值的目的。所以,當需要...