C 學習之路 引用(一) 基礎知識

2022-03-06 02:46:24 字數 2833 閱讀 7957

(根據《c++程式設計》(譚浩強)整理,整理者:華科小濤,@

對乙個資料可以建立乙個「引用」,它的作用是為乙個變數起乙個別名。這是c++對c的乙個重要擴充。本系列分兩篇,本篇為基礎篇,主要是介紹基本知識。

假如有乙個變數a,想給它起乙個別名b,可以這樣寫:

int a ;

2:

int &b = a ; //宣告b是a的「引用」

以上宣告了b是a的引用,即b是a的別名。經過這樣的宣告後,使用a和b的作用相同,都代表同乙個變數。注意:在上述宣告中,&是引用宣告符,並不代表位址。在資料型別名出現的&是引用宣告符,在其他場合出現的都是取位址符。宣告變數b為引用,並不需要另外開闢記憶體單元來存放b的值。b和a佔記憶體中同一記憶體單元它們具有同一位址。即宣告b是a的引用,可以理解為:使變數b具有變數a的位址。

(1)引用不是一種獨立的資料型別。對引用只有宣告,沒有定義。

必須先定義乙個變數,然後宣告對該物件建立乙個引用。關於定義和引用的具體區別,將會在近期的部落格中整理。暫時可以簡單的這樣理解:變數定義,用於為變數分配儲存空間,還可為變數指定初始值;變數宣告,用於向程式表明變數的型別和名字。

(2)宣告乙個引用時,必須同時使之初始化,即宣告它代表哪乙個變數。

注意:當引用作為函式形參時不必在宣告中初始化,它的初始化是在函式呼叫時的虛實結合實現的,即作為形參的引用是實參的別名。

(3)宣告乙個引用後,不能再使之作為另乙個變數的引用。

比如宣告了b是變數a的引用後,在其有效作用範圍內,b始終與其代表的變數a聯絡,不能在作為其他變數的引用,例如下面的用法就不合法:

int a1 ,a2 ;

2:

int &b = a1 ; //宣告b是a1的引用

3:

int &b = a2 ; //試圖使b又變成a2的引用,不合法

(4)不能建立引用陣列。

下面的用法不合法:

int a[5] ;

2:

int &b[5] = a ; //錯誤,不能建立引用陣列

3:

int &b = a[0] ; //錯誤,不能建立陣列元素的引用

(5)不能建立引用的引用。

下面的用法也不合法:

int a = 3 ;

2:

int &b = a ; //宣告b是a的引用,正確

3:

int &c = b ; //錯誤,試圖建立引用的引用

唉?好奇怪啊,有了變數名,為什麼還需要乙個別名呢?c++之所以增加引用機制,主要乙個方面就是把它作為函式的引數,以擴充函式傳遞資料的功能。閒話少說,上例子!

為了說明引用的作用,我們寫函式實現兩個資料值得交換。有人說這還不簡單,信手拈來嘛:

void swap (int a ,int b)

2:

若在主函式中呼叫此函式,試圖交換變數i和j的值:

int i = 3 ;

2:

int j = 5 ;

3: swap(i,j) ;

唉,好奇怪,怎麼沒有得到正確答案呢?這就要說道函式引數傳遞的機制了,這位同 學想通過改變形參的值,而改變實參的值,但是他用的函式引數傳遞機制卻是:

(1) 將變數名作為實參和形參。

這時傳給形參的是變數的值,傳遞是單向的.如果在執行函式期間形參的值發生變化,並不傳回給實參.因為在函式呼叫時,形參和實參不是同乙個儲存單元。

void swap(int* p1 ,int* p2)

2:

也在主函式中測試了一下:

int i = 3 ;

2:

int j = 5 ;

3: swap(&i,&j) ;

然後測試i,j的值,得到了正確答案。這位同學是利用了第二種引數傳遞的機制:

(2)傳遞變數的位址。

形參是指標變數,實參是乙個變數的位址,呼叫函式時,形參(即指標變數)得到實參變數的位址,從而指向實參變數單元。呼叫函式時把變數i和j的位址傳送給形參p1和p2 。所以p1就指向變數i,p2就指向j。通過交換指標所指的值,當然就交換了i和j 。這種方式通過形參變數指標訪問主函式中的變數,並改變它們的值,雖然能得到正確結果,但是在概念上卻是兜了乙個圈子。下面就介紹第三種寫法:

void swap(int &a , int &b)

2:

主函式中:

1:

int i = 3 ;

2:

int j = 5 ;

3: swap(i,j) ;
也得到了正確結果。這裡用到了第三種引數傳遞機制:

(3)以引用作為形參,在虛實結合中建立變數的引用,使形參名作為實參的引用,即形參稱為實參的引用。

當main函式呼叫swap函式時,進行虛實結合,把實參變數i和j的位址傳遞給形參a和b,使a稱為i的別名,b稱為j的別名,當然a和b的值交換了,i和j的值也交換了。這就是位址傳遞方式。

那麼這三種傳遞引數的方式有啥不同呢:

其實上述三種傳遞方式,可歸納為兩種:傳值方式和傳址方式。

傳值方式:(1)和(2)是傳值方式,在(1)中,把變數i和j的值傳遞給形參a和b。在(2)中,把&i和&j的值傳遞給指標變數p1和p2 。在此方式中實參是位址(&i和&j),傳遞的是位址,故仍然是傳值方式,不是傳址方式。傳值方式在呼叫函式時,需要對形參分配儲存單元。

傳址方式:(3)為此方式,實參不是位址而是變數名,由於形參是引用,系統會自動的將形參的位址傳遞給形參。注意:此時傳送的是位址而不是實參變數的值。

總結一下:用引用形參的方法比使用指標簡單、直觀、方便,可以部分代替指標的操作。當然這只是引用的用處之一,引用的厲害指出多著呢,待後續娓娓道來。。。

jQuery學習之路(一)基礎知識

今天開始學習jquery,希望大家能多多支援!function str function 本身就是jquery物件的縮寫形式,下面與之等效 jquery function css color red 理論上合法,但實際上缺少元素而報錯 值得一提的是,執行了.css 這個功能函式後,最終返回的還是jq...

基礎知識 引用

引用說明 引用的時候需要在定義的時候初始化 在此不是求位址運算,而是起標識作用。型別識別符號是指目標變數的型別。宣告引用時,必須同時對其進行初始化。宣告乙個引用,不是新定義了乙個變數,它只表示該引用名是目標變數名的乙個別名,它本身不是一種資料型別,因此引用本身不佔儲存單元。1 引用作為引數 char...

C 中引用的基礎知識

include using namespace std 1 引用的基本概念 int main01 2 引用是c 的語法範疇,是屬於c 編譯器對c的擴充套件 c編譯器不能通過引用這個概念 3 引用做函式引數 普通引用在宣告的時候必須用其它的變數進行初始化 引用作為函式引數宣告時不進行初始化 int m...