1. 程式人生 > >C++中復雜聲明和定義的辨析

C++中復雜聲明和定義的辨析

返回值 float 就是 str 兩個 順序 常量指針 例子 關鍵字

0x00 前言

c++中的復雜聲明往往令人無法下手,經常使人搞錯這到底聲明的是一個指針還是指針函數。但其實c++對於復雜聲明是遵循一定的規則的,叫做變量名—>---右規則。

0x01 規則解釋

對於復雜定義最好的處理方式是從中間開始向外擴展。“從中間開始的”的意思是從變量名開始。“向外擴展”的意思是先註意到右邊最近的項,遇到括號則往左邊讀,然後在前往下一層的右邊,遇到括號則向左邊讀,以此右左右直到全部讀完為止。類似於剝洋蔥,從裏到外層層剝離

0x02 實際應用

簡單例一:Void *funptr)();//指針

讀法:funptr是一個指針(PS:由於funptr開始向右讀就碰到了括號,所以返回左邊,讀到了指針符號

*),這個指針指向一個午無參的返回值為空的函數(PS:既然前面說到了funptr是一個指針,下一步就該說明他的用途了,指針的用途當然是指向的作用)。

簡單例二:Void* funptr();//返回指針的函數

讀法:funptr是一個無參函數(PSfunptr右邊有括號,故先讀出來,右邊帶括號的意思就是函數),該函數返回空型指針。

簡單例子三:int (*p)(char)//指針

讀法:p是一個指針,這個指針指向一個無參的返回值位int類型的函數。

0x02 更為復雜的情況

復雜定義常常帶有const,[]等關鍵字或者符號。特別是const更容易引起我們的誤讀。

例子一:char **p;

讀法:p是一個指針,該指針指向一個指針,這個被指向的指針是char類型的。

這樣讀看起來很拗口,但是可以幫你層層剝離定義之間的關系。當然也可以這樣讀:p是一個指向char類型的指針的指針,雖然這樣讀通順了很多,但是不熟悉的還是不建議。

例子二:const char **p2;

讀法:p2是一個指針,這個指針指向另一個指針,被指向的指針是const char型(PS:const char 這種順序放一起連讀即可,不然這個太拗口了)

也可讀作:p2是一個指向const char類型的指針的指針。

例子三:char * const * p3;

讀法:p3是一個指針,這個指針是const指針(理解為常量指針,值不變),被指向的const指針為char類型。也可讀作:p3是指向char型指針的const指針。

上訴幾個例子還不算難,下面來看幾個難度很大的。

難例一:
char ** (*p)(float, float);

讀法:p是一個指針,它指向了帶有兩個float參數的函數的指針,被P指向的指針是指向函數返回值char型指針的。簡單說來就是p是指向了一個返回值為char型指針的指針。

C++中復雜聲明和定義的辨析