typedef 用法詳解(二)

2021-06-29 17:00:36 字數 4061 閱讀 2137

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,...