(注:文章謹代表個人理解,如有錯誤,還望盡快指正,大家都能獲益,我定感激不盡^^)
至今已遇到兩個typedef詭異的定義,因此決定下筆記之,以備後用。
【typedef之const指標】
【案例】
typedef string * pstr;
const pstr cpstr;
問上述**中cpstr是乙個怎樣的指標?
【分析】
很多朋友,包括我自己在剛接觸到時,第一反應是:cpstr被定義為乙個指向const string物件的普通指標,原因很簡單,置換一下string*與pstr的位置就得到
//這顯然就是乙個指向const string物件的普通指標
const string * cpstr;
然而,事不如人願,cpstr的確切定義為:乙個指向string型別的const指標。
看到這個答案,想必不少朋友稍顯驚訝,我也如此,其中內因,且聽我慢慢道來。
之所以出錯,在於我們「置換一下就好了」,「置換」這個詞不應該用在typedef,而該用在#define巨集身上,typedef是定義了乙個型別別名,定義的結果遵循任何正常定義的標準。那麼這個typedef到底是怎麼定義了乙個const指標呢?
首先分析
const pstr cpstr;
這段**定義了乙個pstr型別的const cpstr,實際上就是
pstr const cpstr;
為了便於理解,就拿int定義來說
//二者等價,前者是習慣用法,後者是標準規定
const int ival = 0;
int const ival = 0;
既然理解了cpstr是乙個const的pstr型別的物件,pstr是什麼呢?pstr是string*,因此這樣一來,就成了cpstr是乙個const的string*型別的物件,也即cpstr是乙個指向普通string的const指標。
【總結】
本次誤解主要源於大家認為typedef等同於#define巨集定義,以為簡單替換字元就可以了。實則不然。以後見到這樣的定義,最簡單的辦法就是從定義該變數的地方入手
typedef string * pstr;
const pstr cpstr;
按步驟(熟練了就很快了)思考:
①cpstr是乙個型別為 pstr 的常量
②pstr 是什麼?
③pstr 是 string*
④所以,cpstr是乙個型別為 string* 的常量,也即 string *const cpstr
【typedef之函式型別】
【案例】
typedef int func (int);
請問typedef定義了乙個什麼型別?
【分析】
不要驚訝,就是這樣,它不是乙個函式指標,也不是被我寫錯了。
它定義了乙個函式型別func,這個函式型別要求乙個int形參,返回乙個int結果。
【總結】
func testfunc(func f);
func的用法是有限制的,上述語句會導致編譯時錯誤。
上述**使用了兩次func,出錯的是第乙個,也就是func型別的函式返回型別是有錯的。
func是函式型別,在另乙個函式中,函式型別變數只能夠用作另乙個函式的形參,而不能是返回型別。
func用作形參時,編譯器會自動將其轉換為func* /*函式指標*/,而編譯器不會將作為函式返回型別的func進行轉換,因此會出現編譯時錯誤,可修正如下
func* testfunc(func f);
宣告了乙個函式testfunc,該函式要求乙個函式型別為func的函式f作為形參,並返回乙個func型別的函式指標func*
【typedef與#define】
【案例】
typedef int* tpi;
#define int* dpi;
tpi p1,p2;
dpi p3,p4;
問上述**中定義的四個變數分別為什麼型別?
【分析】
區分p1,p2,p3,p4四個變數的型別,首先要理解typedef和#define巨集的區別,typedef是給已有的型別取別名,而#define只是簡單的字元替換。於是上述**等同於
int *p1,*p2;
int *p3,p4;
也就是說p3被定義為了乙個整型指標,而p4則只是整型。
【總結】
需要掌握typedef與#define的區別,以防這些細微的陷阱,為高質量**做好保障。
C typedef 結構體指標定義理解
在c語言裡面,struct是用來定義新的資料型別 結構體,typedef是給資料型別取別名。typedef struct filefileinfo typedef struct filefileinfo,filep 例如 typedef struct lnode lnode,linklist 相當於...
IT專案管理 收集需求與定義範圍
頭腦風暴 通過小型會議的組織形式,讓所有參加者在自由愉快,暢所欲言的氣氛中誘發集體智慧型,相互啟發靈感,最終產生創造性思維的決策。目標集中,這一階段追求需求的數量,越多越好,暫時不關注質量 會議時間在1小時之內 問卷調查 訪談 對同學進行訪談,要確定訪談時間 訪談地點 訪談內容。內容可以參考問卷調查...
演算法收集 Hash解析 01 hash定義
hash雜湊演算法詳細解析 一 本文詳細描述了hash演算法的通用模式,在這個基礎上對目前作為標準的幾種主要hash演算法進行了一些分析 md5,ripemd系列,sha系列,tiger以及剛加入到標準不久的whirlpool。給出了部分演算法的 1 hash定義 傳統hash函式的定義 乙個has...