c++指針函數和函數指針概述


歡迎指正

代碼寫的不夠規范: 目的是縮短文章篇幅,實際中請注意

 

  閱讀完本文, 你一定能判斷和寫出:指針函數和函數指針。 

0、結論

  A、指針函數: 函數的返回值是指針類型

  B、函數指針: 函數名是一個指針

 

1、分析

  A、一定出現在函數。

  B、關鍵詞: 函數和指針。

  C、 函數, 包括返回值類型、函數名、函數參數

  D、指針: 地址運算符*  和 指針變量

  E、排除函數參數。那么就剩下 函數返回值類型 和 函數名了。 

  F 、函數和變量一樣,也是有地址的。 函數名就是函數的地址。

  一個例子:xcode輸出main函數和add函數的地址

 

2、形式  

  先給出形式,下面再解釋。

  A、 指針函數

    聲明格式:  類型說明符 *  函數名(參數);

    舉例: 

char* get_buf();

 

  

    這是一個指針函數的聲明, 函數的返回類型是 char* , 函數名:get_buf, 沒有參數需要傳入。 

 

  B、函數指針

    聲明格式:類型說明符 (*指針變量名)(參數); 或者 typedef 類型說明符 (*指針變量名)(參數);

    舉例:

typedef char (*pfunc)();

 

 

   這是一個函數指針的聲明格式,返回類型為char, 函數名是一個指針,無參數需要傳入。

 

3、解讀

  方法: 解讀順序:根據聲明,從左到右依次解讀。關鍵: *與什么結合

  A、指針函數 舉例: char* get_buf(); 

  首先, 整體判斷,這是一個函數。 那我們找找函數的返回值類型,函數名,參數。

  返回值: char* 

  函數名: get_buf

  參數:無

  這里,char 與 * 結合形成整體,表示的是函數的返回值類型。 不要理解錯: * 不是與函數名get_buf先結合。  指針的地址運算符在前,函數名在后,連起來: 指針函數, 這是一個返回值為char*的函數,沒有參數需要傳入。

  

  B、函數指針, 舉例: int (*pfunc)();

  首先,整體判斷,這是一個函數。 找找函數的返回值類型 、函數名、參數

  返回值類型: int

  函數名:(*func)

  參數:無

  這里:*與pfunc結合,形成指針。 和平常常見的函數不一樣。 比普通的函數名多了一個指針的地址解析運算符*。  將*pfunc視為整體,這個整體表示的是函數名,也就是說,用一個指針代替了原來的函數名。 函數指針: 函數名是一個指針。 函數也有地址,這里只使用一個指針指向了函數的地址。

 

4、一個例子

// 指針函數

int* get_result()

{

    static int index = 100;

    return &index;

}

 

// 用作舉例函數指針使用

int get_id()

{

    static int index = 1;

    return index++;

}

 

// 用一個函數指針指向上面的get_id函數

typedef int (*pfunc)();

 

int main(int argc, const char * argv[])

{

    std::cout << "1、輸出指針函數結果:" << *(get_result()) << std::endl;

    

    std::cout << "\n2、下面演示調用函數指針輸出:";

    pfunc pget_id_func = get_id;

    std::cout << pget_id_func() << std::endl;

    return 0;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  結果:

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM