關於引用的疑問

2021-09-26 10:23:41 字數 2700 閱讀 4137

1.變數名回顧

問題:

一段連續的儲存空間只能有乙個別名嗎?

2.c++中引用

int a = 4;

int& b = a; //b為a的別名

b = 5; //操作b就是操作a

注意:普通引用

在定義時

必須用同型別的變數進行初始化

3.c++對三目運算子做了什麼?

int a = 1;

int b = 2;

(a < b ? a : b) = 3;//正確,返回a或b的引用,可作為左值

(a < b ? 1 : b) = 3;//錯誤,返回1或b的值,不能作為左值

4.引用的意義

5.特殊的引用

const引用

int a = 4;

const int& b = a;

int* p = (int*)&b;

b = 5;//error 唯讀變數

*p = 5;//ok,修改變數a的值

const int& b = 1; //ok;

int* p = (int*)&b;

b = 5;//error 唯讀變數

*p = 5;//ok 修改變數a的值

6.引用有自己的儲存空間嗎?

#include struct tref

;int main(int argc, char *ar**)

;

printf("sizeof(char&) = %d\n", sizeof(char&));

printf("sizeof(rc) = %d\n", sizeof(rc));

printf("sizeof(tref) = %d\n", sizeof(tref));

printf("sizeof(ref.r) = %d\n", sizeof(ref.r));

return 0;}/*

sizeof(char&) = 1

sizeof(rc) = 1

sizeof(tref) = 4

sizeof(ref.r) = 1

*/

7.引用的本質

引用在c++中的內部實現是乙個指標常量

type& name  < -- > type* const name;

注意: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;}/*

sizeof(r) = 12

sizeof(r.before) = 4

sizeof(r.after) = 4

&r.before = 0xbf84d43c

&r.after = 0xbf84d444

*/

8.函式引用的返回

#include //返回區域性變數d的引用,函式呼叫結束,這個變數就被銷毀

int& demo()

//返回靜態區域性變數s的引用。一直存在

int& func()

int main(int argc, char* ar**)

demo: d = 0

func: s = 0

main: rd = 14335988

main: rs = 0

demo: d = 0

func: s = 11

main: rd = 14335988

main: rs = 11

9.引用和指標什麼關係?如何理解「引用的本質就是指標常量」

指標是乙個變數

引用只是乙個變數的新名字

從使用c++的角度來看

從c++編譯器角度來看

​​​​​​​在工程專案開發中

#include int a = 1;

struct sv

;int main()

; //陣列是一片連續的記憶體空間

int& array = ; // &array[1] - &array[0] = ? expected ==> 4

printf("&sv.x = %p\n", &sv.x);

printf("&sv.y = %p\n", &sv.y);

printf("&sv.z = %p\n", &sv.z);

delete pc;

return 0;

}

​​​​​​​小結

關於交換機trunk的疑問 引用別人的

乙太網埠有 3種鏈路型別 access trunk hybird access型別埠只能屬於1個vlan 般用於連線計算機 埠 trunk型別埠可以允許多個vlan通過,可以接收和傳送多個vlan 報文,一 般用於交換機之間的 連線 hybrid型別埠可以允許多個vlan通過,可以接收和傳送多個vl...

關於 retainCount 的疑問

我在 main.m 裡寫了三個測試例子,就是不明白為什麼輸出的都是 1 別人幫忙測試了下,輸出的是額外的超大的值 nsstring str1 welcome nslog d str1 retaincount nsstring str2 nsstring stringwithstring you ns...

關於scanf的疑問

scanf函式是從標準輸入流 stdin 讀取資料,按照格式說明引數,將資料寫入引數位址所在空間,標準輸入流預設的是鍵盤輸入流,但是,由於作業系統的緩衝區管理機制,從鍵盤上輸入的資料不是直接被scanf函式讀取的,而是暫存在記憶體緩衝區,只有遇到回車鍵的時候,scanf函式才會開始工作,並且,最後輸...