1. 程式人生 > >常量指針(pointer to constant)和指針常量(constant pointer)

常量指針(pointer to constant)和指針常量(constant pointer)

bsp spa end amp img ostream ace 指針變量 ons

  一個指針可以操作兩個實體,一個是指針值(即地址),一個是間訪值(即指向的實體)。於是指針的常量性也分為兩種:常量指針(pointer to constant)和指針常量(constant pointer)。

  指針常量是相對於指針變量而言的,也就是指針值不能修改的指針。常量指針是指向常量的指針的簡稱。

  定義指針常量還是常量指針就看const修飾,若const修飾指針本身,則為指針常量,若修飾指針類型(指向的實體的類型),則為常量指針。

  常量指針:const int* ip=&a;

  指針常量:int* const cp=&b; 或 int const* dp=&b;

  常量指針常量:const int* const icp=&c;

  常量指針不能通過該指針改變地址空間的值,但並沒有限制地址空間的課改變性。因為一個地址空間可能不止一個指針指向它,所以可以通過其他指向它的指針改變它的值。

  指針常量是相對於指針變量而言,就是這個指針成了常量,不能使這個指針指向其他地址空間,但可以通過該地址改變其地址空間內的值。這樣說好像也不太明白,直接看例子:

  #include <iostream>
  using namespace std;   int main() {
    int a = 18;
    int b = 28;
    int c = 58;

    //常量指針
    const int* ap = &a;
    //*ap = 12; //錯誤,因為ap是常量指針,不能通過這個指針改變其實體的值。
    cout << *ap << endl;
    a = 19; //正確,該實體依然可變。
    cout << *ap << endl;
    ap = &c; //正確,常量指針可以修改指針值。
    cout << *ap << endl;          //指針常量
    int* const bp = &b;
    cout << *bp << endl;
    *bp = 12; //正確,指針常量可以通過指針改變其實體的值。
    cout << *bp << endl;
    //bp = &a; //錯誤,指針常量不能改變指針值。          //常量指針常量
    const int* const cp = &c;
    //*cp = 33; //錯誤,常量指針常量不能通過該指針修改其實體的值。
    //cp = &b; //錯誤,常量指針常量不能修改其指針值。
    c = 57; //給實體的可變性沒變。
    cout << *cp << endl;
  } 結果如下: 技術分享圖片

  

常量指針(pointer to constant)和指針常量(constant pointer)