《C++ Prime Plus 第七章》—指針和const

        常量指針指針常量這兩個名詞雖然非常繞嘴,不過說的非常準確。用中國話的語義分析就可以很方便地把三個概念區分開。

一) 常量指針。

常量是形容詞,指針是名詞,以指針爲中心的一個偏正結構短語。這樣看,常量指針本質是指針,常量修飾它,表示這個指針乃是一個指向常量的指針(變量)。

指針指向的對象是常量,那麼這個對象不能被更改。

在C/C++中,常量指針是這樣聲明的:

1)const  int  *p;

2)int  const  *p;

常量指針的使用要注意,指針指向的對象不能通過這個指針來修改,可是仍然可以通過原來的聲明修改,也就是說常量指針可以被賦值爲變量的地址,之所以叫做常量指針,是限制了通過這個指針修改變量的值。

二) 指針常量

指針是形容詞,常量是名詞。這回是以常量爲中心的一個偏正結構短語。那麼,指針常量的本質是一個常量,而用指針修飾它,那麼說明這個常量的值應該是一個指針。

指針常量的值是指針,這個值因爲是常量,所以不能被賦值。

在C/C++中,指針常量這樣聲明:

int a;

int *const  b = &a;  //const放在指針聲明操作符的右側

只要const位於指針聲明操作符右側,就表明聲明的對象是一個常量,且它的內容是一個指針,也就是一個地址。上面的聲明可以這麼讀,聲明瞭一個常量b,它的值是變量a的地址(變量a的地址,不就是指向變量a的指針嗎)。

因爲指針常量是一個常量,在聲明的時候一定要給它賦初始值。一旦賦值,以後這個常量再也不能指向別的地址。

雖然指針常量的值不能變,可是它指向的對象是可變的,因爲我們並沒有限制它指向的對象是常量。

舉例代碼:

#include<iostream>
#include<cstdio>
using namespace std;

int  main()
{
    int x=3,y=5,z=6;
    const int *p=&x;        //p定義爲常量指針,指向值不可修改的常量x;
    int *const q=&y;        //q定義爲指針常量,其指向不能改變
    printf("%d %d\n",x,y);
    printf("%d %d\n",*p,*q);
    //(*p)++;     //(*p)是一個常量,不能修改
    p=&z;
    (*q)++;
    //q=&z;       //q是指針常量,指向不能修改
    printf("%d %d",*p,*q);
    return 0;
}
將第12行和第15行代碼打開時,會報錯:

 程序正確的運行結果如下:


結果說明:

p的指向變爲z後,*P的值爲6;而(*q)++後,值由5變成6;最後程序輸出 :6  6


 

 


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