C語言 const指針的一些特性

copy自:c++primer
  
  1, const double *cptr; //不允許用指針來改變其所指的 const 值
  爲了保證這個特性,C++ 語言強制要求指向 const 對象的指針也必須具有 const 特性:const double *cptr; // cptr may point to a double that is const
  這裏的 cptr 是一個指向 double 類型 const 對象的指針,const 限定了 cptr 指針所指向的對象類型,而並非 cptr 本身。也就是說,cptr 本身並不是 const。在定義時不需要對它進行初始化,如果需要的話,允許給 cptr 重新賦值,使其指向另一個 const 對象。但不能通過 cptr 修改其所指對象的值:
  *cptr = 42; // error: *cptr might be const
  把一個 const 對象的地址賦給一個普通的、非 const 對象的指針也會導致編譯時的錯誤:
  const double pi = 3.14;
  double *ptr = π // error: ptr is a plain pointer
  const double *cptr = π // ok: cptr is a pointer to const
  
  2,不能使用 void* 指針(第 4.2.2 節)保存 const 對象的地址,而必須使用 const void* 類型的指針保存 const 對象的地址:
  const int universe = 42;
  const void *cpv = &universe; // ok: cpv is const
  void *pv = &universe; // error: universe is const
  允許把非 const 對象的地址賦給指向 const 對象的指針,
  例如:
  double dval = 3.14; // dval is a double; its value can be changed
  cptr = &dval; // ok: but can't change dval through cptr
  
  3,const 指針
  除指向 const 對象的指針外,C++ 語言還提供了 const 指針——本身的值不能修改:
  int errNumb = 0;
  // curErr is a constant pointer 注意 這個*在const前面
  int *const curErr = &errNumb;
  我們可以從右向左把上述定義語句讀作“curErr 是指向 int 型對象的 const 指針”。與其他 const 量一樣,const 指針的值不能修改,這就意味着不能使 curErr 指向其他對象。任何企圖給 const 指針賦值的行爲(即使給 curErr 賦回同樣的值)都會導致編譯時的錯誤:
  curErr = curErr; // error: curErr is const
  與任何 const 量一樣,const 指針也必須在定義時初始化。
  
  4,指向 const 對象的 const 指針
  const double pi = 3.14159;
  // pi_ptr is const and points to a const object
  const double *const pi_ptr = π
  
  本例中,既不能修改 pi_ptr 所指向對象的值,也不允許修改該指針的指向(即 pi_ptr 中存放的地址值)。可從右向左閱讀上述聲明語句:“pi_ptr 首先是一個 const 指針,指向 double 類型的 const 對象”

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