2016-06-09 37 views
-2

是什麼下面的區別:它提到,基地指針,常量和類型aliasis

const char *c = 0; //Here c is a pointer to a constant character 

typedef char *pstring; 
const pstring cstr = 0 //cstr is a constant pointer to a character 

爲什麼會出現這兩種說法之間的差異,而他們看起來只是same.In C++入門第一個語句的類型是const char,*是聲明的一部分。而對於最後一條語句,基類型爲const pstring。我沒有得到兩者之間的區別。

+0

pstring是一個指向char的指針,所以const pstring是一個指向char的常量指針。 – immibis

回答

0
const char *c = 0; 

這聲明c到是指向const char。您無法通過c更改c指向的內容。但c可以指向一個不同的字符串。

char arr[] = "test"; 
c = arr; // OK 

另一方面。

typedef char *pstring; 
const pstring cstr = 0; 

聲明cstrconst指針char。您可以更改cstr指向的內容,但不能更改cstr指向的位置。如果沒有typedef,你可以使用:

char* const cstr = 0; 

不幸的是,語言允許const是基本類型,之前的地方。它會更清晰地使用:

char const* c = 0;  // what c points to is const 

閱讀從右到左。 c是指向constchar的指針。

char* const cstr = 0; // the pointer is const 

從右到左閱讀。 cconst指向char的指針。

IMO,const指針的性質和它指向的對象與上述相比更加清晰。

+0

我知道常量指針和指向常量字符的指針之間的區別。問題是當我們使用 時:typedef int num,那麼int的每個出現都被num替換。 所以現在如果我們編寫typedef char * pstring,那麼聲明const pstring將是const char *(我剛剛用char *替換了pstring,這裏有什麼不對) –

+0

@NamanSharma,*然後每個int的出現都被num替換。 *真的。這不像宏觀替代。 –

+0

所以你的意思是說我們並不真正代替,它只是一種寫作方式。但是在指針的情況下它會令人困惑。 –

1

從右向左讀取指針聲明有助於理解它們。

第一個是一個指向const的char的指針。您不能修改它指向的字符,因爲char是const。

第二個是一個char指針。你不能修改指針的值(它指向的char的位置),因爲指針是const。

typedef char* pstring(將星號從您的類型名移開,因爲它不是它的一部分是一個好主意),常量適用於它創建的類型,如其他所有類型一樣:

int i; 
const int i = 0; // actually int const i = 0 

char* p; 
const char* p = 0; // actually char const* p = 0 

typedef char* pstring; 
const pstring ps = 0; // actually 'pstring const' -> 'char* const' ps = 0 

正是因爲這個原因,一些編碼標準(如MISRA)要求你把簡歷預選賽的類型名稱後,因爲它工作得更好,以表明常量性資格的類型,它是依賴於它 - 而不是相反。

+0

明白了。謝謝! –

+0

@NamanSharma歡迎您。如果您發現它有幫助,請考慮upvoting /接受。謝謝! – zyndor

3

我認爲你的困惑源於不知道頂級const。如果您有typedef,則不能將const添加到基礎類型,僅在其上方。

const pstring pconst char *p不相同,即typedef不是宏替換。一旦typedef ed類型是原子的; const的位置並不重要,在const與此類型相關聯的類型的左側或右側,在此例中爲char*

typedef char* pstring; 
const pstring p1; // const pointer to char i.e. char* const 
pstring const p2; // const pointer to char i.e. char* const 

如果您的原始類型是這樣寫的,那麼其含義將會改變。

const char* p1; // pointer to const char 
char* const p2; // const pointer to char 

What are top-level const qualifiers?閱讀以瞭解更多。