@引用詳解
引用:引用就是給變數取別名,編譯器不會為引用變數開闢記憶體空間,它和它引用的變數共用同一塊記憶體。例如:高中同學給我起的外號:疙瘩。疙瘩是我,我也是我
型別& 引用變數名(物件命)
=引用實體
void test(
)
1.引用在定義時必須初始化
int
& r;
// 編譯時會出錯
2.乙個變數可以有多個引用
int a=10;
int& ra = a;
int& rra = a;
3.引用變數與引用實體的型別必須要一致
int a=10;
int& ra = a;
double& rd = a;
// 編譯時會出錯
4.引用一旦引用乙個實體,再不能引用其他的實體,該引用在其生命週期內,只能和乙個實體結合
1.做引數
void swap(
int& left,
int& right)
/// 建議:如果不想通過形參來改變外部實體的情況下,可以以const型別引用作為形參
void print(const int
& r)
2.做返回值
// 錯誤示例:
int& add(
int a,
int b)
int main(
)
因此:以引用方式作為函式返回值時,一定不能返回函式棧上的空間(典型:區域性變數),因為函式結束後,函式體內的區域性變數就被銷毀了。如果在外部以引用的方式來接收函式的返回值,外部的引用實際引用的就是一塊非法的記憶體空間。
// 正確使用方法:
int& count(
)
3.常引用
void test(
)
傳值:形參是實參的乙份拷貝,傳參的效率低,不會通過改變形參而改變外部的實參。
傳引用:形參實際是實參的別名,傳遞效率高,可以通過形參改變外部的實參-->可以達到與指標類似的效果,而且比指標可用性更高更安全。
1.從概念上來看
指標是通過某個指標變數指向乙個物件後,對它所指向的變數間接操作。
引用本身就是目標變數的別名,編譯器不會給引用型別的變數開闢記憶體空間,引用與其引用的實體公用的是同一塊記憶體空間,對引用的操作就是對目標變數的操作。
2.在底層實現上
引用實際是有空間的-->因為引用就是指標,它裡面儲存的是引用實體的位址。
引用和指標的不同點的總結:
1. 引用在定義時必須初始化,指標沒有要求
2. 引用在初始化時引用乙個實體後,就不能再引用其他實體,而指標可以在任何時候指向任何乙個同型別
實體3. 沒有null引用,但有null指標
4. 在sizeof中含義不同:引用結果為引用型別的大小,但指標始終是位址空間所佔位元組個數(
32位平台下佔
4個位元組)
5. 引用自加即引用變數所引用的實體增加1,指標自加即指標向後偏移乙個型別的大小
6. 有多級指標,但是沒有多級引用
7. 訪問實體方式不同,指標需要顯式解引用,引用編譯器自己處理
8. 引用比指標使用起來相對更安全
C 中引用的本質分析
引用是c 中心增加的內容,在c語言是沒有引用這一種用法的。那什麼是引用呢?大家都知道,我們定義變數的時候,其實是將變數名和記憶體空間關聯起來,變數名就是一段記憶體空間的別名。當我們使用引用的時候,例如int a b 其實就相當於a是b的別名,也就是說a和b都是指向同一段儲存空間的。那這麼做有什麼意義...
C 的引用分析
引用的意義 引用作為變數名而存在,因此在一些場合可以代替指標 引用相對於指標來說具有更好的的可讀性和實用性 const的引用 在c 中可以宣告const引用 const type name var const 引用讓變數擁有唯讀屬性 int a 4 const int b a int p int b...
C 引用的本質分析
事物的難度遠遠低於對事物的恐懼!下邊來看看乙個老生常談的交換函式 include using namespace std 引用方式 void swap1 int a,int b 注意 函式引數中的引用不需要初始化 指標方式 void swap2 int a,int b int main int ar...