由乙個typedef問題引發的思考

2021-10-06 02:25:28 字數 2180 閱讀 8637

同樣,可以像下面這樣隱藏指標語法:

typedef

char

* pstr;

intmystrcmp

(const pstr p1,

const pstr p3)

;

用gnu的gcc和g++編譯器,是會出現警告的,按照順序,「const pstr」被解釋為「char* const」(乙個指向char的指標常量),而事實上,const char和char const表達的並非同一意思,const char的意思是建立乙個指向char型別的指標且不能更改指向位址上的值,而char const則是不能更改指向的位址;

char* const p : 定義乙個指向字元的指標常數,即const指標,常量指標。

const char* p :定義乙個指向字元型常量的指標。

typedef的用法和相關問題

下面的**中編譯器會報乙個錯誤,你知道是哪個語句錯了嗎?

typedef

char

*pstr;

char string[4]

="abc"

;const

char

*p1=string;

const pstr p2=string;

p1++

;p2++

;

答案與分析:

是p2++出錯了。

這個問題再一次提醒我們:typedef和#define不同,它不是簡單的文字替換。上述**中const pstr p2並不等於const char * p2。const pstr p2和pstr const p2本質上沒有區別,都是對變數進行唯讀限制,只不過此處變數p2的資料型別是我們自己定義的而不是系統固有型別而已。因此,const pstr p2的含義是:限定資料型別為char *的變數p2為唯讀,因此p2++錯誤。

然後去編譯器中求證:

這是在mingw7.3編譯器,基於gcc的

vs2017編譯器中:

由此引發了我們的乙個思考:編譯器將

typedef char* pstr;

const pstr p2;

處理後得到的是pstr const p2; 即char *const p2;

為什麼?

終於看到了線索:

const

int a=

5; 與 int

const a=

5; 等同

類名 const 物件名 與 const 類名 物件名 等同

這與指標不同,

char

*const cp;

//到char的const指標

char

const

*pc1;

//到const char的指標

const

char

*pc2;

//到const char的指標(後兩個宣告是等同的)

typedef char* pstr;是定義了乙個新的型別pstr,而編譯器不把pstr當做是char指標看待,而是將其看做乙個新的型別。

const int a=5; 與 int const a=5; 等同

那麼在編譯器看來:

const pstr p;和pstr const p;等同

pstr const p;再展開就是char const p;了

至此解釋通了。

大膽猜測

const

int a=

5; 與 int

const a=

5; 等同

類名 const 物件名 與 const 類名 物件名 等同

編譯器應該是統一處理成:

類名 const 物件名

即:int const a=5;

pstr const p;

指標型別的預處理規則應該是另外一套規則了。

由Typedef引發的問題

由typedef 引發的問題 自 用來宣告乙個別名,typedef 後面的語法,是乙個宣告。本來筆者以為這裡不會產生什麼誤解的,但結果卻出乎意料,產生誤解的人不在少數。罪魁禍首又是那些害人的教材。在這些教材中介紹 typedef 的時候通常會寫出如下形式 typedef int para 這種形式跟...

由乙個經典布局問題引發的思考

相信每個前端玩家在初學css的時候都遇到過這麼乙個問題 如何實現乙個三欄布局。假設高度已知,左欄右欄寬度各300px 中間自適應。看似很簡單的乙個問題,但這麼簡單的乙個問題,可以體現出乙個前端玩家的段位水平。初級玩家的回答 1.浮動 2.絕對定位。中級玩家的回答 1.浮動 2.絕對定位 3.flex...

乙個由copyBean引發的血案

一次開發中使用輪子bean互轉突然發生了問題 new setdlevel 1 dto dto new dto dto beancopyutils.copybean dto.class system.out.println dto.getdlevel 列印出輸出結果 輸出結果卻變成null,怎麼肥事呢...