C++中的引用和指針

引用

引用: 爲對象起一個別名。必須初始化,程序會把引用和它的初始值綁定在一起,此後無法再令引用重新綁定到兩外一個對象,因此引用必須初始化。

對const的引用: 即常說的常量引用,對常量的引用不能被用作修改它所綁定的對象。

const int ci = 1024;
const int &r1 = ci; // 正確,引用及其對應的對象都是常量
r1 = 42; // 錯誤:r1是對常量的引用
int &r2 = ci; // 錯誤:試圖讓一個非常量引用指向一個常量對象。

對const的引用可能引用一個並非const的對象: 常量引用只是對引用可參與的操作做出了限定,對引用的對象本身是不是一個常量並未限定。

 

指針

空指針: 不指向任何對象,如下方法用來初始化一個指針:

int *p1 = nullptr;
int *p2 = 0;
int *p3 = NULL;

推薦nullptr,它可以被轉換成任意其他的指針類型。

void*指針: 一種特殊的指針類型,用於存放任意對象的地址。利用它能做的事兒比較有限:拿它和別的指針比較、作爲函數的輸入或輸出,或者賦值給另外一個void*指針。不能直接操作void*指針所指的對象,因爲我們並不知道這個對象是什麼類型,也就無法確定能在這個對象上做哪些操作。

指向常量的指針: 和常量引用一樣,指向常量的指針也沒有規定其所指對象必須是一個常量。僅僅要求不能通過該指針改變對象的值,而沒有規定那個對象的值不能通過其他途徑改變。

這樣想:所謂指向常量的指針或引用,不過是指針或引用“自以爲是”罷了,它們覺得自己指向了常量,所以自覺的不去改變所指對象的值。

指向常量的指針: 不能改變其所指對象的值。要想存放常量對象的地址,只能使用指向常量的指針。

const double pi = 3.14; // pi是個常量,它的值不能改變
double *ptr = π // 錯誤:ptr是一個普通指針
const double *cptr = π // 正確:cptr可以指向一個雙精度常量
*cptr = 42; // 錯誤:不能給*cptr賦值

const指針: 必須初始化,且之後不能改變。把*放在const前面來說明指針是一個常量。這個含義是說不變的是指針本身的值,而非指向的那個值。

int errNumb = 0;
int *const curErr = &errNumb; // currErr將一直指向errNumb
const double pi = 3.14; 
const double *const pip = π // pip是一個指向常量對象的常量指針

頂層const與底層const:
指針本身是一個對象,它可以指向另外一個對象。因此指針本身是不是常量以及指針所指的是不是一個常量就是兩個相互獨立的問題。所以有了頂層const和底層const的概念:
頂層const:表示指針本身是一個常量

底層const:表示指針所指的對象是一個常量

 

歡迎關注公衆號~

AI算法愛好者公衆號二維碼

- END -

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章