參考(reference)、指標(pointer)

reference:
1、reference一定要被同型別的物件給初始化。
2、一旦初始化,無法重新綁定至另一個物件。
3、必須要reference to const才能參照一個const物件。

const int ival = 38;
const int &firstRef = ival; //正確
int &secondRef = ival;      //錯誤

4、必須要reference to const才能指向一個字面常數。

const int &ref = 50; //正確

5、可以reference to 一個pointer

int var = 10;
int *ptr = &var;
int *&ref = ptr;

pointer:
1、pointer存放特定物件的位址,或某物件尾端的下一位置,為零表示不指向任何物件:

int ival = 1024;
int *pi = 0;           //pi不指向任何物件。
int *pi2 = &ival;      //pi2內含ival的位址。
int *pi3 = pi2;        //pi3和pi2指向同一個物件ival。
pi3 = 0;               //現在pi3不指向任何物件。

2、除了void*的pointer型別,其他必須型別吻合:

double dval = 0;
double *pd = &dval; //沒問題,型別正確
int *pi = dval;     //錯誤,兩者型別不同
void *pv = &obj     //obj可以是任何型別

3、void *pointer可以將它傳給函式,或讓函式返回它,但不能操作它所指的物件。


pointer操作:

string s = "hello";
string *sp = &s;
*sp = "world";    //改變所指物件的值
string s2 = "some value";
sp = &s2          //將sp指向其他物件

pointer to const&const point:
兩者是不一樣的東西,pointer to const是指向一個常數的pointer,const point是個常數pointer,所以不能更改指向物件(因為代表值的位址不能更改)
1、必須要pointer to const才能參照一個const物件。

const int ival = 38;
const int *cptr = &ival; //正確
int *ptr = &ival;        //錯誤

2、pointer to const可賦予一個nonconst的物件位址:

int ival = 38;
const int *cptr = &ival; //正確,但不能透過cptr修改ival的值,否則會導致錯誤。

3、const pointer 不能改變所指物件:

int someNum = 20;
int otherNum = 30;
int *const ptr = &someNum; //ptr是個const pointer
ptr = &otherNum;           //錯誤

reference和pointer差異:
reference總是指向某一個物件,且初始化時就必須確定其物件,之後無法指向其他物件,對reference賦值改變的是物件的值,pointer使用上較彈性,可以改變指向的物件,也可以改變指向物件的值,但使用上也比較容易發生錯誤。