(1)什麼是指標?
(2)什麼是引用?
引用:引用是乙個物件的別名,主要用於函式引數和返回值型別,符號x&表示x型別的引用。
(1)引用不可以為空,但指標可以為空。
引用是物件的別名,引用為空——物件都不存在,怎麼可能有別名!所以定義乙個引用的時候,必須初始化。
宣告指標是可以不指向任何物件,因此,使用指標之前必須做判空操作,而引用就不必。
(2)引用不可以改變指向;但是指標可以改變指向。
雖然引用不可以改變指向,但是可以改變初始化物件的內容。例如:就++操作而言,對引用的操作直接反應到所指向的物件,而不是改變指向;而對指標的操作,會使指標指向下乙個物件,而不是改變所指物件的內容。
(3)引用、指標大小不同。
引用的大小是所指向的變數的大小,因為引用只是乙個別名而已;指標是指標本身的大小,4個位元組。
(4)引用比指標更安全。
由於不存在空引用,並且引用一旦被初始化為指向乙個物件,它就不能被改變為另乙個物件的引用,因此引用很安全。
對於指標來說,它可以隨時指向別的物件,並且可以不被初始化,或為null,所以不安全。
const 指標雖然不能改變指向,但仍然存在空指標,並且有可能產生野指標(即多個指標指向一塊記憶體,free掉乙個指標之後,別的指標就成了野指標)。
(5)const對指標和引用的限定有差別。
常量指標vs常量引用
a.常量指標:指向常量的指標,在指標定義語句的型別前加const,表示指向的物件是常量。
定義指向常量的指標只限制指標的間接訪問操作,而不能規定指標指向的值本身的操作規定性。b.常量引用:指向常量的引用,在引用定義語句的型別前加const,表示指向的物件是常量。常量指標定義」const int* pointer=&a」告訴編譯器,pointer是常量,不能將pointer作為左值進行操作,eg: *pointer=1;
也跟指標一樣不能利用引用對指向的變數進行重新賦值操作。eg: const int &pointer=i;pointer=1;指標常量vs引用常量
a.指標常量:在指標定義語句的指標名前加const,表示指標本身是常量。在定義指標常量時必須初始化!而這是引用天生具來的屬性,不用再引用指標定義語句的引用名前加const。
指標常量定義」int* const pointer=&b」告訴編譯器,pointer是常量,不能作為左值進行操作,但是允許修改間接訪問值,即*pointer可以修改。b.引用常量: 引用變數就是引用常量.
常量指標常量vs常量引用常量
a.常量指標常量:指向常量的指標常量,可以定義乙個指向常量的指標常量,它必須在定義時初始化。常量指標常量定義」const int* const pointer=&c」告訴編譯器,pointer和*pointer都是常量,他們都不能作為左值進行操作。
b.不存在所謂的」常量引用常量」,因為跟上面講的一樣引用變數就是引用常量。c++不區分變數的const引用和const變數的引用。
程式決不能給引用本身重新賦值,使他指向另乙個變數,因此引用總是const的。如果對引用應用關鍵字const,起作用就是使其目標稱為const變數。即沒有:const double const& a=1;只有const double& a=1;
在c++11中可以取位址的、有名字的就是左值,反之,不能取位址的、沒有名字的就是右值(將亡值或純右值)。
引用:就是取別名 ,引用不可以重定義。
舉個例子,int a = b+c, a 就是左值,其有變數名為a,通過&a可以獲取該變數的位址;表示式b+c、函式int func()的返回值是右值,在其被賦值給某一變數前,我們不能通過變數名找到它,&(b+c)這樣的操作則不會通過編譯。(1)左值一定在記憶體中,右值有可能在記憶體中也有可能在暫存器中
int a=5;int b=a;//此時a在記憶體中
int a=5;(2)左值引用就是對乙個左值進行引用的型別。右值引用就是對乙個右值進行引用的型別。int b=a+1;//此時a+1在暫存器中
int *p=&a;//此時&a在暫存器中
右值引用和左值引用都是屬於引用型別。左值引用是具名變數值的別名,而右值引用則是不具名(匿名)變數的別名。
無論是宣告乙個左值引用還是右值引用,都必須立即進行初始化。而其原因可以理解為是引用型別本身自己並不擁有所繫結物件的記憶體,只是該物件的乙個別名。
a.左值引用
int i =42;
int&r = i;
//正確,左值引用
int&r1 = i *42;
//錯誤, i*42是乙個右值
const
int&r2 = i *42;
//正確,可以將乙個const的引用繫結到乙個右值上
b.右值引用
int
&&rr = i;
//錯誤,i是乙個變數,變數都是左值
int&&rr1 = i *42;
//正確,i*42是乙個右值
int&&r2 = std::
move
(a);
//正確,使用std::move()將左值強制轉換為右值
(3)為什麼要右值引用?
右值引用在你需要使用暫存器中的值的時候可以進行右值引用。暫存器的重新整理速度很快,沒有右值引用的話就需要將暫存器中的值拷貝到記憶體中,在進行使用,這是很浪費時間的。
int
getdata
(int
&&num)
void
main()
如上int getdata(int &&num)就是對右值進行引用。
getdata(a + 1) 中a+1是右值在暫存器中,我們是不可以直接對他進行操作的,如果要操作得將其拷貝到記憶體中,如果是乙個非常大的資料這種拷貝就會很占用記憶體,如果直接用右值引用就可以直接對其進行操作。從而節約記憶體。
1 指標和引用的區別
性質上的區別 使用上的區別 引用必須要初始化且不能是null,而指標可以是null。且指標的值可以改變,引用不能改變 更像是const,常量指標的概念 有const指標,但沒有const引用 指標可以有多級 p 引用只有一級 sizeof引用 得到的是所指向的變數 物件 的大小,而 sizeof指標...
1 指標與引用的區別
指標 指標是位址傳遞,但其本質上是值傳遞,通常實參傳給形參時,被調函式的形參作為被調函式的區域性變數處理,即在棧中開闢了記憶體空間以存放由主調函式放進來的實參的值,從而成為了實參的乙個副本。所以進行指標傳遞時,作為實參的指標本身所存的位址值是不會變的,但指標所指位址中的內容則會根據函式的不同操作而改...
5 指標 引用的區別
函式傳值的三種方式 傳值 傳引用 傳指標 相同點 都是位址的概念 指標指向一塊記憶體,它的內容是所指記憶體的位址 引用是某塊記憶體的別名。區別 1.指標是乙個實體 在棧空間有自己的記憶體空間 而引用僅是個別名 不佔記憶體空間 2.引用使用時無需解引用 指標需要解引用 3.引用只能在定義時被初始化一次...