1. 程式人生 > >指標常量與常量指標(const用法總結)

指標常量與常量指標(const用法總結)

 const是一個C語言的關鍵字,它限定一個變數不允許被改變。使用const在一定程度上可以提高程式的安全性和可靠性

指向常量的指標

const int *pa;
int const *pa;
兩者等價。因為指向常量的指標有時候會指向常量,所以它具有這個性質:“不能靠解引用改變它指向的物件的值”,以此保護它所指向的常量的常量性:
*pa =d; // 不可行(d是已經宣告過的整型)

但指標本身的值是可變的:
pa=& d; // 可行(d是已經宣告過的整型)

而且指向常量的指標有時候也會指向變數,如下:
int t,u;
const int *pa;
pa =&t; //可行,指向變數t
pa =&u; //也可行,指向變數u

我們可以把它理解成:“為了指向常量而發明的指標”,這樣比較貼切。

常量指標:

int *const pa =&n; // n是之前已經宣告過的整型變數,注意必須是變數,理由見下

“常量指標”即指標本身的值是常量,但“能靠解引用改變它指向的物件的值”,如下:
pa=&d; // 不可行(d是已經宣告過的整型)
*pa =d; // 可行(d是已經宣告過的整型)

因為常量指標也是一種const常量,所以它同樣必須在第一次宣告時就初始化,不過它的初始值縮小為只能是變數(的地址),因為只有變數才能確保以後能靠解引用而改變它指向的物件的值。這使得常量指標不象一般的const常量,用變數或常量初始化都可以。
也就是說,常量指標反而總是指向變數的。

舉例:

typedef char * pStr;
char string[4] = "abc";
const char *p1 = string;
const pStr p2 = string;
p1++;
p2++;


  答案與分析:

  問題出在p2++上。

  1)、const使用的基本形式: const char m; 

  限定m不可變。

  2)、替換1式中的m, const char *pm; 

  限定*pm不可變,當然pm是可變的,因此問題中p1++是對的。

  3)、替換1式char, const newType m; 

  限定m不可變,問題中的charptr就是一種新型別,因此問題中p2不可變,p2++是錯誤的。

char *p = "i'm hungry!";
p[0]= 'I';


  答案與分析

  上面的程式碼可能會造成記憶體的非法寫操作。分析如下, “i'm hungry”實質上是字串常量,而常量往往被編譯器放在只讀的記憶體區,不可寫。p初始指向這個只讀的記憶體區,而p[0] = 'I'則企圖去寫這個地方,編譯器當然不會答應。
總結:

  1)、const在前面

const int nValue; //nValue是const
const char *pContent; //*pContent是const, pContent可變
const (char *) pContent;//pContent是const,*pContent可變
char* const pContent; //pContent是const,*pContent可變
const char* const pContent; //pContent和*pContent都是const

  2)、const在後面,與上面的宣告對等

int const nValue; // nValue是const
char const * pContent;// *pContent是const, pContent可變
(char *) const pContent;//pContent是const,*pContent可變
char* const pContent;// pContent是const,*pContent可變
char const* const pContent;// pContent和*pContent都是const

答案與分析:

  const和指標一起使用是C語言中一個很常見的困惑之處,在實際開發中,特別是在看別人程式碼的時候,常常會因為這樣而不好判斷作者的意圖,下面講一下我的判斷原則:

  沿著*號劃一條線,const和誰在一邊,那麼誰就是const,即const限定的元素就是它。你可以根據這個規則來看上面宣告的實際意義,相信定會一目瞭然。

  另外,需要注意:對於const (char *) ; 因為char *是一個整體,相當於一個型別(如 char),因此,這是限定指標是const。