swap 函式的對比
// 指標版本
void swap(int *a, int *b)
// 引用版本(注意:函式中的引用行參不需要進行初始化!!!)
void swap(int& a, int& b)
函式對比分析:
引用如果作為函式的形參時,不需要進行初始 初始化發生在呼叫的時候。
指標版本要交換a和b的值,傳進去的是a和b的位址,想想其實是很奇怪的,引用給人感覺很舒服多了
const type& name = var
int a = 4;
const int& b = a;
int *p = (int*)&b;
b = 5; // error b是唯讀變數
*p = 5; // ok 還是可以修改 a 的值的
// 唯讀變數直接賦值是錯誤的, 但還是可以通過指標改變裡面的值
const int& b = 1;
int *p = (int*)&b;
b = 5; // error 唯讀變數
*p = 5 // ok
使用常量對 const 引用初始化後將生成乙個唯讀變數
#include void example()
void demo()
int main(int argc, char *ar**)
引用有自己的儲存空間嗎?
struct tref
;cout << sizeof(tref) << endl;
#include struct tref
;int main(int argc, char *ar**);
printf("sizeof(char&) = %d\n", sizeof(char&)); // 1
printf("sizeof(rc) = %d\n", sizeof(rc)); // 1
printf("sizeof(tref) = %d\n", sizeof(tref)); // ?
printf("sizeof(ref.c) = %d\n", sizeof(ref.c)); // 1
}
輸出
sizeof(char&) = 1
sizeof(rc) = 1
sizeof(tref) = 8 // 讓人聯想是否為指標
sizeof(ref.c) = 1
引用很多行為類似與指標 因為本質如下:
引用在c++ 中的內部實現時乙個指標常量
type& name
等效type* const name
void func(int& a)
void func(int* const a)
注意:
c++ 編譯器在編譯過程中用 指標常量 作為引用的內部實現,因此引用所占用的空間大小與指標相同
從使用角度,引用只是乙個別名, c++ 為了實用性而隱藏了引用的儲存空間這一細節
#include struct tref
;int main(int argc, char* ar**)
; printf("sizeof(r) = %d\n", sizeof(r));
printf("sizeof(r.before) = %d\n", sizeof(r.before));
printf("sizeof(r.after) = %d\n", sizeof(r.after));
printf("&r.before = %p\n", &r.before);
printf("&r.after = %p\n", &r.after);
return 0;
}
在 linuc 64位機器下編譯結果
sizeof(r) = 24
sizeof(r.before) = 8
sizeof(r.after) = 8
&r.before = 0x7ffc17a6c4c0
&r.after = 0x7ffc17a6c4d0
char a = 'a';
008e3b38 mov byte ptr [a],61h
16進製制數 61h 送到 a 這個識別符號的記憶體空間,大小是乙個 byte
char& b = a;
008e3b3c lea eax,[a] //
008e3b3f mov dword ptr [b],eax
a 的位址取出來,放到 eax 這個暫存器中去
將 eax 裡面的內容,送到一片記憶體空間裡去,這片記憶體空間就是 b 識別符號對應的記憶體空間,大小為 dword ,即4個位元組
生成了唯讀變數,直接對唯讀變數修改是不行的
要使已經存在的變數(變成唯讀屬性),只要定義乙個它的const的引用
#include int& demo()
int& func() // int* const
int main(int argc, char* ar**)
demo: d = 0
func: s = 0
segmentation fault (core dumped)
不要返回區域性變數的引用(這個本質在c看來就是不能返回區域性變數的指標)。
如果這個區域性變數被static修飾 就是可以返回(因為此時的變數儲存在全域性資料區)。
返回的是區域性變數的位址(local variable),main 中rd已經是野指標了,已經沒有意義了
C 學習記錄5 引用的本質分析
1 引用是另乙個變數的別名,也就是已經存在的一段儲存空間的別名 2 引用作為變數別名而存在,因此在一些場合可以代替指標 3 引用相對於指標來說具有更好的可讀性和實用性。注意 函式中的引用形參不需要進行初始化,呼叫的時候初始化。swap函式的實現對比 1 在c 中可以宣告const引用 2 const...
lessons5 引用( )的本質
例如 int a c 等同於 int const a c 注意 1 引用占用空間大小與指標相同。2 引用是變數的乙個別名。3 引用的特性 功能性 本質是指標 安全性 可以避免由於指標操作不當帶來的記憶體錯誤 操作性 簡單 例如 const int a var.該引用使得變數有唯讀屬性 int a 4...
C 第5課 引用的本質分析
本文學習自 狄泰軟體學院 唐佐林老師的 c 課程 實驗1 可以使用變數和常量初始化const引用變數,const引用讓變數擁有唯讀屬性 注意1 不可以直接用字面常量初始化 引用變數,但是可以初始化 const引用變數 注意2 const引用讓變數擁有唯讀屬性,如 int a 4 const int ...