typedefef函數指針的用法(轉載)

原文連接:http://blog.sina.com.cn/s/blog_5e71ee700100fo13.html

typedef函數指針的用法(轉載)
 

 代碼簡化, 促進跨平臺開發的目的.

 typedef 行爲有點像 #define 宏,用其實際類型替代同義字。

 不同點:typedef 在編譯時被解釋,因此讓編譯器來應付超越預處理器能力的文本替換

用法一:

typedef int (*MYFUN)(int, int);
這種用法一般用在給函數定義別名的時候
上面的例子定義MYFUN 是一個函數指針, 函數類型是帶兩個int 參數, 返回一個int

分析這種形式的定義的時候可以用下面的方法:
先去掉typedef 和別名剩下的就是原變量的類型.
去掉typedef和MYFUN以後就剩:

int (*)(int, int)

用法二:

typedef給變量類型定義一個別名.

typedef struct{
int a;
int b;
}MY_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){return;}

void main()

{

pFun =glFun;

(*pFun)(2);

}

第一行定義了一個指針變量pFun.它是一個指向某種函數的指針,這種函數參數是一個int類型,返回值是char類型。只有第一句我們還無法使用這個指針,因爲我們還未對它進行賦值

第二行定義了一個函數glFun().該函數正好是一個以int爲參數返回char的函數。我們要從指針的層次上理解函數-函數的函數名實際上就是一個指針函數名指向該函數的代碼在內存中的首地址

使用typedef更直接

typedef char(*PTRFUN)(int)

PTRFUN pFun;

char glFun(int a){return;}

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);


// 我先不介紹,大家能看懂下一行的內容嗎?

int (*s_calc_func(char op))(int, int);//這裏函數的返回值是指向函數的指針。


// 下一行的內容與上一行完全相同,

// 定義一個函數calc_func,它根據操作字符 op 返回指向相應的計算函數的指針

FP_CALC calc_func(char op);


// 根據 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)

    {

    case '+': return add;

    case '-': return sub;

    case '*': return mul;

    case '/': return div;

    default:

        return NULL;

    }

    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



原文連接:點擊打開鏈接


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章