C typedef 疑難定義收集整理

2021-09-21 10:34:23 字數 2234 閱讀 4870

(注:文章謹代表個人理解,如有錯誤,還望盡快指正,大家都能獲益,我定感激不盡^^)

至今已遇到兩個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...