引用:引用不是定義乙個新的變數,而是給乙個已經定義的變數重新起乙個別名。對引用的操作與對變數直接操作是完全一樣的。
引用的宣告方法:型別&引用變數名 = 已定義過的變數名
引用的特點:
1.乙個變數可取多個別名
2.引用必須初始化
3.引用只能在初始化的時候引用一次,不能改變為再引用其他的變數。
引用用法
void test1()
const引用const引用:是指向const的引用,const引用可以與常量繫結,也可以與變數繫結,只是不能通過這個const引用來改變繫結物件的值。
const引用:範圍只能縮小,不能放大。可讀可寫可變為唯讀,唯讀不能變為可讀可寫。
引用做引數
1.值傳遞:如果形參為非引用的傳值方式,則生成區域性變數接收實參的值。值傳遞指在呼叫函式時將實際引數複製乙份傳遞到函式中,這樣在函式中如果對引數進行修改,將不會影響到實際引數。
void swap(int
left,int
right)
2.引用傳參如果形參為引用型別,則形參是實參的別名。就相當於實參的交換
void swap(int& left,int& right)
3.指標傳遞
void swap(int* left,int* right)
測試傳值和引用傳遞的效率
struct bigdata
int arr[1000];
};void deal(bigdata& x)
void test3()
int end = gettickcount();
cout
<< "cost time:"
<< end - begin << endl;
}
傳值:
傳引用:
一定程度上,傳引用要比傳值快。
指標傳遞的本質:
指標傳遞本質上是傳值的方式,它所傳遞的是乙個位址值。值傳遞的過程中,被呼叫函式的形參作為被調函式的區域性變數處理,即在棧中開闢了記憶體空間以存放由主調函式放進來形參的值,從而形成了實參的乙個副本。
指標傳遞與引用傳遞的區別:
引用傳遞和指標傳遞是不同的,雖然它們都是在被調函式棧空間上的乙個區域性變數,但是任何對於引用引數的處理都會通過乙個間接定址的方式操作到主調函式中的相關變數。而對於指標傳遞的引數,如果改變被調函式中的指標位址,它將影響不到主調函式的相關變數。如果想通過指標引數來改變主調函式中的相關變數,那就得使用指向指標的指標,或者指標引用。
傳值做返回值 傳參做返回值
結論:不要返回乙個臨時變數的引用 。再呼叫函式時,會形成棧幀。在返回時,形成臨時變數返回,而這個臨時變數在棧中。呼叫結束時,棧被銷毀,臨時變數也被銷毀。
如果返回物件出了當前函式的作用域依舊存在,則最好使用引用返回,因為這樣更高效。
引用與指標的區別與聯絡
1.引用只能在定義的時候初始化一次,之後不能改變指向其它變數;指標變數的值可變。
2.引用必須指向有效的變數,指標可以為空。
3.sizeof指標物件和引用物件的意義不一樣。sizeof引用得到的是所指向的變數的大小,而sizeof指標是物件位址的大小。
4.指標和引用自增自減意義不一樣。指標++是加上其指向型別的大小。
5.相對而言,引用比指標更安全。
C 指標和引用
在深入介紹之前我們首先來看一下指標和引用的定義 指標和引用的區別,然後分別針對指標和引用展開討論,深入細節為何有這些差異。指標和引用的定義,下面用通俗易懂的話來概述一下 而宣告指標是可以不指向任何物件,也正是因為這個原因,使用指標之前必須做判空操作,而引用就不必。其次,引用不可以改變指向,對乙個物件...
C 引用和指標
引用和指標看上去差不多,看上去差不多,其實男寶寶和女寶寶是不一樣的 用起來還是有一定差距。本人菜鳥僅將遇到的問題記錄備案,以便日後翻查 ptrfunc.h ifndef ptrfunc h define ptrfunc h typedef int func int,int struct aa end...
C 指標和引用
有了變數名,為什麼還需要乙個別名呢?c 之所以增加引用型別,主要是把它作為函式引數,以擴充函式傳遞資料的功能 到目前為止我們介紹過函式引數傳遞的兩種情況 1 將變數名作為實參和形參 這時傳給形參的是變數的值,傳遞是單向的 如果在執行函式期間形參的值發生變化,並不傳回給實參 因為在呼叫函式時,形參和實...