2014-10-02 87 views
0

我總是在const指針中混淆。 有誰能夠解釋我簡單的方法是什麼試圖say.I以下 的代碼片段知道他們在說什麼,但我需要的原因 簡單way.Thanksconst限定符和Const指針

char *p="Hello";     /*pointer is variable,so string is*/ 
    *p='M'; 
    p="BYE";  /*works*/ 
    p="Bye";  /*works*/ 

    const char *q="Hello";   /*string is constant pointer is not */ 
    *q='M';  /*Error*/ 
    q="BYE";  /*works*/ 

    char const *s="Hello";   /*string is constant pointer is not */ 
    *s='M';  /*Error*/ 
    s="BYE"; /*works*/ 

    char* const t="Hello";   /*pointer is constant string is not */ 
    *t='M';  /*works*/ 
    t="BYE"; /*error*/ 

    const char* const u="Hello"; /*string is constant,so is pointer*/ 
    *u='M'; /*error*/ 
    u="BYE"; /*error*/ 
+0

不想聽起來令人滿意,圖表[在這個答案](http://stackoverflow.com/a/14566215/1322972)是一個不錯的詮釋,並將其應用於單向和雙向間接指針在不同的位置。並且總是有[** cdecl.org **](http://cdecl.org),如果您有關於type-decl的頻繁(或不頻繁)的問題,就值得加書籤。 – WhozCraig 2014-10-02 10:21:05

+0

您似乎認爲字符串文字的解釋不同,具體取決於其地址分配給哪種類型的指針。不是這種情況。一個字符串文字* always *變成一個'char *'類型值,但是*你仍然不能改變字符*。 – unwind 2014-10-02 10:23:38

回答

0

其實這三個代碼片段

char *p="Hello";     /*pointer is variable,so string is*/ 
    *p='M'; 
    p="BYE";  /*works*/ 
    p="Bye";  /*works*/ 

    const char *q="Hello";   /*string is constant pointer is not */ 
    *q='M';  /*Error*/ 
    q="BYE";  /*works*/ 

    char const *s="Hello";   /*string is constant pointer is not */ 
    *s='M';  /*Error*/ 
    s="BYE"; /*works*/ 

是等價的,您可能不會更改指針指向的對象。區別在於,將限定符const添加到q的定義允許編譯器在編譯時查找錯誤。

您不能修改字符串文字。任何修改字符串文字的嘗試都會導致程序未定義的行爲。在C字符串文字中有非常量字符數組的類型。但是,在第二個代碼片段中添加限定符常量可以讓編譯器在編譯時查找錯誤。

C標準(6.4.5字符串文本)

7這些陣列是否是不同的條件是它們的 元素具有適當的值是不確定的。 如果程序嘗試 修改這樣一個數組,行爲是未定義的。

有除了美學記錄之間

const char * 

char const * 

的都定義指針常量對象沒有區別。指針本身並不是常量。

但是如果你這樣寫的方式

char s[] ="Hello";     /*pointer is variable,so string is*/ 
char *p = s; 
const char *q = s; 
*p='M'; 
*q='M'; 

再有就是使用指針有或沒有const修飾,因爲你可能會改變字符數組之間的差異。對於最後一條語句,編譯器會發出錯誤。

最後兩個代碼片段與前三個代碼片段的不同之處在於後兩個代碼片段定義了常量指針,這些指針的值可能不會改變。然後你試圖重新分配一個常量指針,編譯器發出一個錯誤。常量對象在定義時應進行初始化。