想必大家對c++中的指標都有所了解,但是什麼是引用呢?c++11標準引入了「引用」的新功能。
引用(reference):給物件起了另外乙個名字,引用型別引用(refers to)另外一種型別,通過將宣告符寫成&d的形式來定義引用型別,其中d是宣告的變數名:
int val = 1024可以認為變數名就是乙個可以操控記憶體的標籤,那麼引用就可以理解為另乙個標籤。新定義的標籤和原來的標籤都可以訪問存放在記憶體中的資料。;int &d = val;
例如:
#include #include輸出結果為:using
namespace
std;
//宣告
void add(int &a,int
b);bool& iszero(float
f);int
main()
//定義
void add(int &a,int
b)bool& iszero(float
f)
d is 0.2val is 25
float 0.000000004 is zero
const指標(pointer):是可以指向(point to)另外一種資料型別的資料型別,通過將宣告符寫成*d的形式定義指標,其中d是變數名。int &i = 10;
取位址符(&):獲取物件的位址。
解引用符(*):獲取指標所指向的物件。
int v = 10p是乙個int型別的指標,指向乙個int型別,上面的例子中指向了變數v。;int *p = &v;
int **m = &p;
m是乙個int*型別的指標,指向乙個int*型別,上面的例子中指向了變數p。
這裡說指向某個物件就是指存放某個物件的位址。指標就是指位址,位址就是指標。指標變數就是存放記憶體單元編號的變數,或者說指標變數就是存放記憶體位址的變數。
這張解釋了上面這段**的位址指向問題,變數p存放了變數v的記憶體位址,變數m存放了變數p的記憶體位址。
在判斷某個物件的型別的時候,應該從右向左閱讀(離變數名最近的符號對變數型別有最直接的影響),比如
int ****p;上面的int ****p;離p最近的是第四個*,所以p是乙個指標,剩餘的部分確定該指標指向的型別,第四個*號左邊是int ***,所以指標p指向乙個int ***型別。再看變數r,離r最近的是&,所以r是引用,剩餘的部分確定該引用引用的型別,剩餘的是int ****,所以r引用了乙個int ****型別的變數。int ****&r = p;
空指標不指向任何物件,使用字面值null表示,c++11標準還提供了字面值nullptr也可以獲得空指標。
void*是一種特殊的指標型別,可用於存放任意物件的位址。乙個void*指標存放著乙個位址,這一點和其他指標類似。但是不能直接操作void *指標所指的物件,因為並不知道物件到底是什麼型別。如果要使用void *所指的物件,應該使用強制型別轉化。
引用和指標的比較:
1.引用不能引用null。
2.一旦引用被初始化引向某乙個物件後,它就不能再引向另乙個物件。指標可以多次改變指向的物件。
3.引用在建立的時候,必須初始化。指標可以在被建立時不被初始化,可以等需要的時才初始化。
4.引用不是物件,沒有實際的位址。指標是乙個物件,有實際的位址。指標不能指向引用(因為引用不是物件)。
c c 引用與指標
我們常用的引用都是左值引用,而什麼是引用呢,所為的引用其實就是給物件起了另乙個名字。要注意的是引用不是物件,同時,引用必須要進行初始化。看下 吧 int ival 1024 int refval ival 用 來表示refval是ival的引用 int refval2 這裡會報錯,因為引用必須初始化...
C C 中的引用和指標
引用又稱 別名,它可以最為物件的乙個名字,但它既不是物件的指標,也不是物件的副本。通過引用可以間接地操作物件,使用方式類似於指標,但不需要指標的語法。使用規則 1 引用被建立的同時必須被初始化,指標可以在任何時候被初始化 int a 12 int b a 正確 int c 錯誤 2 一旦引用被初始化...
C C 中的引用和指標
引用又稱 別名,它可以視為物件的乙個名字,但它既不是物件的指標,也不是物件的副本。通過引用可以間接地操作物件,使用方式類似於指標,但不需要指標的語法。使用規則 1 引用被建立的同時必須被初始化,指標可以在任何時候被初始化 int a 12 int b a 正確 int c 錯誤 2 一旦引用被初始化...