2016-09-14 75 views
0

我已閱讀this在維基百科(粘貼以下爲好):C/C++對指針公約和`const`

按照對聲明通常的C慣例,聲明如下使用,並且在指針*是寫在指針上,指示解引用。例如,在聲明int * ptr中,解引用的形式* ptr是一個int,而參考形式ptr是一個指向int的指針。 因此,const修改名稱爲。相反,C++約定將*與類型關聯,如int * ptr,並將const作爲修改類型的左邊來讀取。 int const * ptrToConst因此可以被讀爲「* ptrToConst是一個int常量」(該值是常量),或者「ptrToConst是一個int常量*」(指針是一個指向常量整數的指針)。

我真的很沒能得到一個滿意的解釋:

  • 在這意義上它修改?

  • 什麼打算與 VS (見上面的鏈接)?

  • 爲什麼它應該在const的右側?

+0

該鏈接並不會導致任何地方有用。 – molbdnilo

+1

我只是修復了這個鏈接。 –

+1

該wikipedia部分感到困惑。如果例子是'const int * ptrToConst;'和'const int * const constPtrToConst;' – user3386109

回答

1

在這意義上它修改?

修改的意思是它使它保持不變,這意味着它不能被修改(賦值或傳遞給可能修改它的函數)。

什麼意圖與名稱與類型(見上面的鏈接)?

名字的意思是在這裏寫的源代碼中的詞,我認爲。

爲什麼它應該在const的右側?

「修飾名右」的方式,通過例如:

const char * str,這裏常量修改焦炭,換句話說,字符常量,則無法修改它們。你可以讓str指向一個新的字符,但是你仍然不能修改它(至少不能通過str)。 *str = 'a';是編譯器錯誤,str = "foo";沒問題。

char * const str,這裏常量修改STR,換句話說STR的值不能被修改。它指向某些字符,並且您可以通過str修改該字符,但不能使str指向另一個字符。*str = 'a';現在可以,str = "foo";是錯誤的。

+0

非常感謝你們。我通過維基百科的引用部分走出我的頭腦。一些事實,我已經正確推斷與其他Stackoverf的幫助。線程..但最多(例如左/右)我真的沒有。感謝用戶,特別是Shankar的評論。兩個答案也很好:我將所有的兩個答覆標記爲答案。我不能,所以我先按照時間順序排列。 – Bento

5

constvolatilerestrict(C99起)關鍵字都被認爲類型限定符。它們是類型簽名不可分割的組成部分,並描述了有關類型的附加語義。

如果它們出現在一個聲明的最上層,它們會影響聲明標識符:

const int a = 5; // prevents modifications of "a" 
int *const p = &x; // prevents modifications of "p", but not "*p" 
int **const q = &y; // prevents modifications of "q", but not "*q" and "**q" 

如果它們出現在指針亞型(星號之前),因爲它們影響到指向的在特定值提領的水平:

const int *p = &x; // prevents modifications of "*p", but not "p" 
const int **q = &y; // prevents modifications of "**q", but not "*q" and "q" 
const int *const *r = &z; // prevents modifications of "**r" and "*r", but not "r" 
const int *const *const s = &a; // prevents modifications of "**s", "*s" and "s" 

的維基百科摘錄討論了聲明指針兩種不同的約定:

int *p; // more common in C programming 
int* p; // more common in C++ programming 

我會說「真」約定是第一個,因爲它根據語言的語法(聲明鏡像使用)工作。該聲明中的星號實際上是與正常表達式中的指針相同的解引用操作符。因此,在p(指針本身)上應用*(間接)後,返回int類型。

還要注意的是類型限定符相對於排序,以類型說明符和其他類型的預選賽沒有關係,所以這些聲明是等價的:

const int a; // preferred 
int const a; // same, not preferred 

const volatile int b; // preferred 
volatile const int b; // same, not preferred 
volatile int const b; // same, not preferred 

const int *p; // preferred 
int const *p; // same, not preferred