今天看了c++primer的2.5.1的一點小理解。
如果某個型別的別名指代的是復合型別或是常量,那麼它用到宣告語句裡面就會產生意想不到的後果,例如下面的宣告語句用到了型別pstring,它實際上是型別char*的別名:
typedef char* pstring;
const pstring cstr = 0; //cstr是指向char的常量指標
const pstring* ps; //ps是乙個指標,指向char的常量指標。
上述兩條宣告語句的基本資料型別都是const pstring,和過去一樣,const是對給指定型別修飾,pstring實際上是指向char的指標,因此,const pstring就是指向char的常量指標,而非指向常量字元的指標。
遇到了一條使用了型別別名的宣告語句時,人們往往會錯誤地嘗試將型別別名替換為本來的樣子,以理解這條語句的含義:
const char* cstr = 0; //對const pstring cstr的錯誤理解
在強調一遍:這種理解是錯誤的。宣告語句用到的pstring時,其基本資料型別是指標。可使用char*重寫了宣告語句後,資料型別變為char, *成為宣告的一部分。這樣寫的結果是,const char成立基本資料型別,前後兩種宣告截然不同,前者宣告了乙個指向char的常量指標,改寫後的形式宣告了乙個指向const char的指標。
上面書上的原話,下面是我的理解,如有不正確之處,還請您指出,先在此謝謝了:
const pstring cstr = 0; //這裡的const是修飾cstr的型別,而cstr的型別是const pstring,所以理解cstr是指向char常量指標
const pstring* ps; //這裡的const是修飾*ps的型別,但*ps的型別是const pstring,以理解為ps是乙個指標,指向char的常量指標
const char* cstr = 0; //這句的理解在這句話下面黑體部分解釋的很清楚了吧,我就不廢話了
總結起來就一句,const修飾定義的變數的型別,*ps本身就是乙個指標,再加上const pstring,所以const pstring* ps這句才會是ps是乙個指標,它的物件指向char的常量指標。
posted @
2017-06-15 19:54
1點er執著 閱讀(
...)
編輯收藏
C 指標 常量和型別別名
在 c primer 61頁看到這個,有點繞。typedef char pstring const pstring cstr 0 cstr 是乙個指向char 型別的常量指標?const pstring ps ps首先是乙個指標。並且它指向的是乙個char型別的常量指標我看到第二行的時候,當時的反應...
Go No nil 型別別名
為型別起個別名,方便 編寫過程中使用。type alias ttype 關鍵字 alias 型別別名 t 型別 例如資料型別中提到的unicode字元型rune和ascii字元型byte就是型別別名 type rune int32 type byte uint8在 go 中有一些基本的資料型別,如s...
聯合 列舉 和型別別名
在c 裡還有許多其他型別使我們暫時還沒有提到的。除了物件外,c 中最重要的資料型別已經一一帶來和大家見過面了。物件將在下一節開始介紹 到目前為止,我們已經見過了整數 實數 字元 字串 陣列 指標和結構。今後我們還會討論一種優於陣列的向量 vector 型別。本節,我們介紹幾個非主流的型別,第乙個是 ...