詳談c 的引用

2021-08-17 11:27:25 字數 2098 閱讀 7614

引用不是定義乙個新的變數,而是給已經定義了的變數起乙個別名。一旦把引用初始化為某個變數,就可以使用該引用名稱或變數名稱來指向變數。

這裡的a和b是同一塊空間的名字。

引用做引數

void swap (int& left, int& right)

void test()

上面的**是我們熟知的交換函式,注意left 和right分別 是a和b的別名,通過引用傳遞,不用定義新的變數,就可以根據別名直接找到a和b這兩個數的位址。有沒有感覺與指標傳遞很類似呢!注意:形參是實參的乙份臨時拷貝,但是引用傳遞並沒有給形參重新分配空間奧(牢記引用的概念)。當不希望函式內改變引數x的值時,盡量使用常引用傳參注意:c++ 函式傳參:

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

(2) 傳遞變數的指標。形參是指標變數,實參是乙個變數的位址,呼叫函式時,形參(指標變數)指向實參變數單元。這種通過形參指標可以改變實參的值。// 同 c

(3) c++提供了 傳遞變數的引用。形參是引用變數,和實參是乙個變數,呼叫函式時,形參(引用變數)指向實參變數單元。這種通過形參引用可以改變實參的值。

引用做返回值

int arr = ;

int& print_num(int i)

int main()

printf("\n");

print_num(2) = 0;

print_num(3) = 0;

//改變後

for (int i = 0; i < 5; i++)

printf("\n");

system("pause");

return

0;}

執行結果:

所以返回乙個區域性變數的引用是非常危險的。

用彙編詳細看一下

傳值返回時,是將ret的值放入eax暫存器中。**

傳引用返回時,是將ret的位址放入eax暫存器中**

當引用作為返回值,必須遵守以下規則:(1)不能返回區域性變數的引用。主要原因是區域性變數會在函式返回後被銷毀,因此被返回的引用就成為了」無所指」的引用,程式會進入未知狀態。

(2)不能返回函式內部new分配的記憶體的引用。雖然不存在區域性變數的被動銷毀問題,可對於這種情況(返回函式內部new分配記憶體的引用),又面臨其它尷尬局面。例如,被函式返回的引用只是作為一 個臨時變數出現,而沒有被賦予乙個實際的變數,那麼這個引用所指向的空間(由new分配)就無法釋放,造成memory leak。

(3)可以返回類成員的引用,但最好是const。主要原因是當物件的屬性是與某種業務規則(business rule)相關聯的時候,其賦值常常與某些其它屬性或者物件的狀態有關,因此有必要將賦值操作封裝在乙個業務規則當中。如果其它物件可以獲得該屬性的非常 量引用(或指標),那麼對該屬性的單純賦值就會破壞業務規則的完整性。

引用與指標的區別

引用只能在定義時初始化一次,之後不能改變指向其它變數(從一而終);指標變數的值可變。

引用必須指向有效的變數,指標可以為空。

sizeof指標物件和引用物件的意義不一樣。sizeof引用得到的是所指向的變數的大小,而sizeof指標是物件位址的大小。

指標和引用自增(++)自減(–)意義不一樣。

相對而言,引用比指標更安全。

詳談C 指標型別

操作c 中的指標,是一種編寫非託管中的一種技術。c 中指標型別可能是 儲存在棧 中的值型別,也可能是 儲存在堆 中的引用 型別。不過無論是什麼型別,基本格式都有乙個共同的要求就是必須都是支援非 託管的型別或者空型別。這裡順便提一句,非託管的型別編譯依賴系統型別庫,而託管的型別依賴clr中元 資料.在...

C 詳談malloc和new的區別

3.new運算子 4.delete運算子 5.定位new表示式 6.總結 函式原型 void malloc size t size 函式解釋 向系統申請size個位元組的空間,返回值為void 型別。在堆上申請空間,使用者使用時,可對這段空間進行強轉成任意型別指標。實際上申請的空間數會大於size個...

詳談c 跨平台編碼的問題

最近要將乙個windows下的專案放到樹莓派上,以便充分利用頻寬資源,使其以夜繼程式設計客棧日的程式設計客棧工作 在此記錄一下編碼問題和方案 在windo程式設計客棧ws下,現在用的vs2coxesaqypg015,建立的 檔案預設編碼是ansi,windows特有的概念,本地編碼,結合實際情況就是...