const關鍵字在c和c++裡修飾變數時,是不同的,在c++裡const修飾的量是常量,
而在c裡const修飾的量是常變數。關於const在c和c++裡的不同我有時間再整理成另外一篇。
一、首先來確定一下到底const修飾的是誰。一句話,型別就近原則。
const int p; 此時離const最近的型別是int型別,所以const修飾的是 p,所以p不能被改變;
const int * p; 此時離const最近的型別還是int型別,所以const修飾的是 * p,所以 * p不能被改變,p可以被改變;
int * const p ; 此時離const最近的型別是int*型別,所以const修飾的是 p,所以p不能被改變;;
在c++裡const修飾的是常量,那麼就有以下2條重要的參考規則:
**1、常量不能當作左值;
2、不允許有指標或引用可以間接改變該常量的值。**
這兩條規則是我們的重要參考依據。
******const與一級指標結合:
int a=10;
const int *p = &a;此時const修飾 *p,
*p = 20;//錯誤,不符合規則1.(常量不能當作左值;)
int*q = p;//錯誤,不符合規則2(不允許有指標或引用可以間接改變該常量的值。因為此時我們可以對q解引用,來改變*p)
const與二級指標結合:參考
const int **p ,
int **const p,
int const *p的區別 參照第一點,你能夠很快區分const int **p , int **const p的區別。 const int **p 表示**p代表的整形內存放的是常量,不能被修改,而指標p本身可以被任意修改賦值。 int **const p 表示**p代表的整形內存放的是變數,可以被任意修改,而指標p本身是不能被修改的 int *const *p是什麼意思呢? 由於int const p是乙個二級指標,那麼const現在修飾的是int,代表*p的值是不能被修改的,通俗的說,也就是二級指標p所指向的一級指標*p是不能被修改的,而**p所代表的整形記憶體可以被任意修改,指標p本身也可以被任意修改! 對於二級指標綜合const有乙個重要的問題,如下,請看示例**:
int a=10;
int *p=&a;
const intq=&p;//error! 「初始化」: 無法從「int」轉換為「const int」 也類似於這樣的**: int *p; const int **q=p; //error! 「初始化」: 無法從「int」轉換為「const int *」
可以看出,c++不讓我們把int**轉換為const int**,這樣不好嗎?我們不是把型別的安全屬性提高了嗎?為什麼反到禁止這樣的型別轉換呢? 當然c++這樣做是出於安全考慮的,以防止我們修改常量物件。為了展現如何會修改常量物件,在這裡我們做個假設,假設c++允許我們**「const int **q=&p」的執
行,也就是允許我們把int**轉換為const int**,請看例項:
int a=10;
int *p=&a;
const int **q=&p;//假設這一行**c++允許執行
const int b=20;
const int *pb=&b;
* q=pb;//重點在這裡,由於* q(* q就是指標p)是變數,pb指標也是變數,因此把pb賦值給* q,也就等於執行了p=pb,由於pb指向的是常量b,因此指標p也指向了常量b,但是看看p的定義 int * p, 沒有任何const修飾,你可以通過* p修改記憶體的值,但是p代表的常量b,是不能被修改的,你試圖通過非常量指標p去修改常物件是錯誤的!編譯器不會答應這樣的事情!通過上面例子,你應該知道c++為什麼不允許我們把int*轉換為const int**,因為這樣會有讓乙個普通指標指向常物件的危險。
一級指標與二級指標
如下圖所示,整型指標xptr指向變數x的位址。原始碼 include int main 實現方法一如下圖所示,先為二級整型指標ptr分配空間,然後賦值。原始碼 include include int main printf n return 0 執行結果 實現方法二 如下圖所示,先為二級整型指標pt...
一級指標二級指標
例如 int p null int代表指標p指向的資料型別是int型,代表這是乙個指標變數,1 指標變數儲存的內容是指向的變數的位址 2 在使用sizeof判斷指標的位元組數時,在32位機器上為4個位元組,在64位機器上為了相容,仍然是四個位元組大小 3 小知識點,不同型別的指標除了指向的變數資料型...
二級指標與一級指標重溫
今天在和同學討論為了介面的一致性,怎麼處理野指標的問題,我就想在以前寫過的鍊錶中練習一下。選擇了在雙向迴圈鍊錶中erase節點時,傳入二級指標並置空他。沒想到遇到了問題,曾經以為對二級指標,一級指標的問題已經了解了,因為在單鏈表中,頭插,尾插中已經訓練過,在鍊錶為空時有3種處理辦法。第一種,是需要傳...