1. 程式人生 > >引用和指標的那些事

引用和指標的那些事

2.3.1 引用

引用並非物件,相反的,它只是為一個已存在物件所起的另外一個名字。
示例:
int ival = 1024;
int &refVal = ival;

Tips:
1.除2種情況外,引用的型別要和與之繫結的物件嚴格匹配

2.引用必須被初始化,且一旦初始化後,它和初始值物件一直繫結在一起,不能更改繫結的物件

3.引用本身不是一個物件,所以不能定義引用的引用

2.3.2 指標
取地址符(操作符&), 解引用符(操作符*)
示例:
int ival = 42;
int *p = &ival;

指標的4種狀態:
a. 指向一個物件
b.指向相鄰物件所佔空間的下一個位置
c. 空指標,指標沒有指向任何物件
d. 無效指標,就是上述情況外的其他值

如果指標指向了一個物件,則允許使用解引用符*來訪問該物件(解引用,僅用於有指定物件的有效指標):
如上例操作物件,直接用 *P。

空指標的3種生成方式:
a. int *p1 = nullptr; (C++11新引入,推薦使用)

b. int *p2 = 0;

c. int *p3 = NULL;

Tips:
1.除2種情況外,指標的型別要和它指定的物件嚴格匹配。

2.建議初始化所有指標。

3.賦值操作時,永遠改變的是等號左側的物件。
int *pi = 0;
pi = &ival; //pi的值被改變,現在pi指向了ival
*pi = 0; //ivald的值發生改變

4.將指標作為if語句的判斷條件時,指標值為0,則為false;指標值非0,則為true。

5.void*指標可用於存放任意物件的地址,其記憶體空間僅僅是記憶體空間,沒法訪問記憶體空間所存的物件,
所以void* 指標能做的事比較有限: 拿它和別的指標比較;作為函式的輸入或輸出,或者賦值給另外一個void*指標

補充(理解複合型別的宣告:):
1.
int* p1,p2; //p1是指向int的指標,p2是int型整數
int *p1,*p2; //p1和p2都是指向int的指標

2.指向指標的指標:
通過*的個數可以區分指標的級別,如**表示指向指標的指標。***表示指向指標的指標的指標。,如:
int ival = 1024;
int *pi = &ival; //pi指向一個int型的數(ival)
int **pi = π //ppi指向一個int型指標(pi)

3.面對比較複雜的指標或者引用的宣告語句時,從右向左閱讀有助於弄清它的真實含義。如:
int i =42;
int *p; //p是一個int型的指標
int *&r = p; //r是一個對指標p的引用

r = &i;
*r=0;

第三行,要理解r的型別到底是什麼,從右到左閱讀r的定義。離變數名r最近的符號(此例是&r符號的&)對變數的型別最直接的影響,
因此r是一個引用,宣告符的其他部分用來確定r引用的型別是什麼(此例中的符號*,說明r引用是一個指標)

2.4 const限定符