1:C++的參考,參考和指標的區別?
1:從匯編指令角度上看,參考和指標沒有區別,參考也是通過地址指標的方式訪問指向的記憶體
int &b=a ; 是需要將a的記憶體地址取出并存下來, b=20;(通過參考修改值時,也是先取出指向的地址,然后訪問該地址的值并修改它,和通過指標修改值一樣)
在定義參考的時候,必須初始化,并能夠對a取地址,所以 int &c=20 編譯錯誤的,因為20取不了地址.
2:參考只有一級參考沒有多級參考,指標有一級指標和多級指標
3:定義一個參考變數和定義一個指標變數,其匯編指令是一樣的.通過參考變數修改所參考記憶體的值和通過指標修改所指向記憶體的值其底層指令也是一樣的.
4:
int array[5]={};
int *p=array;
cout<<sizeof(array)<<endl; //20
cout<<sizeof(p)<<endl; //4
2:怎么定義一個參考變數
第1步:先對要參考的變數 取地址即&, &a ,然后定義一個指標來接, 所以就變成了 int *p=&a;
第2步: 用&符號取代 * ,所以變成了 int &p=a;
那么又怎么定義一個參考變數來參考一個陣列呢?
第1步: 對陣列名取地址 &array, 對陣列取地址要怎么接能? int (*p)[5]=&array;
第2步:用& 取代 *, 所以就變成了 int (&p)[5]=array;
如果列印 sizeof(p) ,值也是20,就是陣列的大小.
3:參考有什么好處?
void swap(int a, int b){
int c=a;
a=b;
b=c;
}
上面的代碼是實作不了值交換的,需改為如下方式
void swap(int *a ,int b){
int c =a;
a =b;
*b=c;
}
另外一種方式,通過參考
void swap(int &a,int &b){
int c=a;
a=b;
b=c;
}
上面通過參考的方式整體在使用上更簡潔更自然.其實參考的方式在底層指令實作上,仍然是通過傳遞地址,
只是編譯器幫我們在后臺做了很多轉換的作業.
4:關于左值參考和右值參考
左值: 它有記憶體,有名字,值可以修改
例如 int a=10;
就可以定義參考 int &b=a;
但是 int &c=20;//不可以 20內有記憶體,無法取值,20 是右值
右值:沒有記憶體,沒名字
C++11 以后,提供了右值參考 如下
int &&m=20;
也還可以 m =30;
上面代碼底層匯編的實作方式,其實是將20存盤在堆疊記憶體中的一個臨時量上,然后把臨時量的記憶體地址給 m
int &&m=20;//通過右值參考來參考右值
那么
int a=10;
int &b =a;
和
int &&c=20
左值參考和右值參考在匯編指令上的實作是怎么樣的?

一個右值參考變數本事是一個左值,這個右值參考本身也是有名字,也占存盤空間,也是可以取地址的,而且只能用左值參考變數來參考它,如下,
int &&m=20;
int &n=m;
不能用一個右值參考變數來參考一個左值,如下
int c=100;
int &&m=c;
上面編譯報錯,右值參考,編譯器是要為右邊的值生產臨時量的, c已經有記憶體空間了,還需要為他生成臨時量做啥呢?所以右值參考只能專門用來參考右值的,
指令上是通過產生臨時量的方式實作的.
5:為什么 const int &m =20 可以通過編譯?
實作方式是
int temp=20;
int &m =temp;
編譯器定義了一個臨時量,只是不可以 m=100; 因為 m 是const
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/522904.html
標籤:其他
上一篇:今天,念念不忘一件事... ?FastJson在呼叫JSON#toJSONString時,如何截取比較長的value串?
