同樣,可以像下面這樣隱藏指標語法:
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,怎麼肥事呢...