typedef 行為有點像 #define 巨集,用其實際型別替代同義字。
不同點:typedef 在編譯時被解釋,因此讓編譯器來應付超越預處理器能力的文字替換。
用法一:
typedef
int(*myfun)(int, int);
這種用法一般用在給函式定義別名的時候
上面的例子定義myfun
是乙個函式指標, 函式型別是帶兩個int 引數, 返回乙個int
在分析這種形式的定義的時候可以用下面的方法:
先去掉typedef 和別名,剩下的就是原變數的型別.
去掉typedef和myfun以後就剩:
int (*)(int, int) //宣告了乙個指標,該指標指向某種函式。函式有兩個整型引數,返回值也是整型。
/*lhl:通俗理解方式:
*與常見的typedef struct_ struct一樣,typedef 的用法之一就是給某種型別定義乙個別名,用來宣告變數
*果稍微變一下格式,改為:typedef myfun int(*)(int,int)
*/上面只是為了用常見是宣告格式進行理解。不是合法的宣告格式。
*那麼就可以理解為:myfun是乙個型別的別名,可以用它來宣告變數。用該型別宣告的變數是乙個指向某種函式(函式兩個整型引數,乙個整型返回值)的指標 。
*/用法二:
typedef給變數型別定義乙個別名.
typedefstructmy_type;
這裡把乙個未命名結構直接取了乙個叫my_type的別名, 這樣如果你想定義結構的例項的時候就可以這樣:
my_type tmp;
第二種用法:typedef原變數型別別名
typedef補充內容:
例如:
typedef int (*pf) (const char *, const char *);這個宣告引入了pf 型別作為函式指標的同義字,該函式有兩個 const char * 型別的引數以及乙個 int 型別的返回值。
簡單的函式指標的用法
//形式1:返回型別(*函式名)(參數列)
char(*pfun)(int);
char glfun(int a)
void main()
pfun =glfun;
(*pfun)(2);
第一行定義了乙個指標變數pfun.它是乙個指向某種函式的指標,這種函式引數是乙個int型別,返回值是char型別。只有第一句我們還無法使用這個指標,因為我們還未對它進行賦值。
第二行定義了乙個函式glfun().該函式正好是乙個以int為引數返回char的函式。我們要從指標的層次上理解函式-函式的函式名實際上就是乙個指標,函式名指向該函式的**在記憶體中的首位址。
使用typedef更直接
typedef
char(*ptrfun)(int)
ptrfun pfun;
char glfun(int a)
void main()
pfun = glfun;
(*pfun)(2);
typedef的功能是定義新的型別。第一句就是定義了一種ptrfun的型別,並定義這種型別為指向某種函式的指標,這種函式以乙個int為引數並返回char型別。
下面是個例子:
在typedef的使用中,最麻煩的是指向函式的指標,如果沒有下面的函式,你知道下面這個表示式的定義以及如何使用它嗎?
int (*s_calc_func(char op))(int, int);
如果不知道,請看下面的程式,裡面有比較詳細的說明
// 定義四個函式
int add(int, int);
int sub(int, int);
int mul(int, int);
int div(int, int);
// 定義指向這類函式的指標
typedef int (*fp_calc)(int, int);
//上面可以理解為typedef fp_calc int(*)(int,int)
// 我先不介紹,大家能看懂下一行的內容嗎?
int (*s_calc_func(char op))(int, int);
// 定義乙個函式calc_func,它根據操作字元 op 返回指向相應的計算函式的指標
fp_calc calc_func(char op); //函式返回乙個fp_calc型別的變數,該變數是乙個指向某種函式的指標。該種函式有兩個整型引數變數,返回整型值。
// 根據 op 返回相應的計算結果值
int calc(int a, int b, char op);
int add(int a, int b)
return a + b;
int sub(int a, int b)
return a - b;
int mul(int a, int b)
return a * b;
int div(int a, int b)
return b? a/b : -1;
// 這個函式的用途與下乙個函式作業和呼叫方式的完全相同,
// 引數為op,而不是最後的兩個整形
int (*s_calc_func(char op)) (int, int)
return calc_func(op);
fp_calc calc_func(char op)
switch (op)
return null;
int calc(int a, int b, char op)
fp_calc fp = calc_func(op); // 下面是類似的直接定義指向函式指標變數
// 下面這行是不用typedef,來實現指向函式的指標的例子,麻煩!
int (*s_fp)(int, int) = s_calc_func(op);
// assert(fp == s_fp); // 可以斷言這倆是相等的
if (fp) return fp(a, b);
else return -1;
void test_fun()
int a = 100, b = 20;
printf("calc(%d, %d, %c) = %d\n", a, b, '+', calc(a, b, '+'));
printf("calc(%d, %d, %c) = %d\n", a, b, '-', calc(a, b, '-'));
printf("calc(%d, %d, %c) = %d\n", a, b, '*', calc(a, b, '*'));
printf("calc(%d, %d, %c) = %d\n", a, b, '/', calc(a, b, '/'));
執行結果
calc(100, 20, +) = 120
calc(100, 20, -) = 80
calc(100, 20, *) = 2000
calc(100, 20, /) = 5
typedef用法詳解
用途一 定義一種型別的別名,而不只是簡單的巨集替換。可以用作同時宣告指標型的多個物件。比如 char pa,pb 這多數不符合我們的意圖,它只宣告了乙個指向字元變數的指標,和乙個字元變數 以下則可行 typedef char pchar 一般用大寫 pchar pa,pb 可行,同時宣告了兩個指向字...
typedef用法詳解
typedef作為型別定義關鍵字,用於在原有資料型別 包括基本型別 構造型別和指標等 的基礎上,由使用者自定義新的型別名稱。在程式設計中使用typedef的好處,除了為變數取乙個簡單易記且意義明確的新名稱之外,還可以簡化一些比較複雜的型別宣告。比如 typedef int int32 將int32定...
typedef用法詳解
用途一 定義一種型別的別名,而不只是簡單的巨集替換。可以用作同時宣告指標型的多個物件。比如 char pa,pb 這多數不符合我們的意圖,它只宣告了乙個指向字元變數的指標,和乙個字元變數 以下則可行 typedef char pchar pchar pa,pb 這種用法很有用,特別是char pa,...