指標 常量和型別別名

2021-09-12 10:15:45 字數 1302 閱讀 8365

今天看了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 型別。本節,我們介紹幾個非主流的型別,第乙個是 ...