C 5 引用的本質分析

2021-10-03 06:56:11 字數 2990 閱讀 8575

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 ...