徹底搞懂函數指針和指針函數回調函數


參考:http://www.cnblogs.com/CBDoctor/archive/2012/10/15/2725219.html

背景:以前看別人的代碼,總是會看到函數指針的用法。(當時感覺,好高打上,代碼移植性真好!絕必技術大拿呀!)

今天:工作任務很多,但是不想做(嘿嘿,偷懶一會吧,畢竟今天周五,哈哈...),整理一下函數指針的用法吧。

溫馨提醒:讀者千萬不要着急,從頭到尾認真的看一遍,保證可以搞懂(針對新手,或者模糊的人,高手可以噴噴)。

 

1. 首先看看通常調用函數的例子

#include <stdio.h>

void MyFun(int x);  //此處也可以寫成 void MyFun(int);

int main(void)
{
  MyFun(10);
  return 0;
}

void Myfun(int x)
{
  printf("%d\n",x);
}

這個MyFun函數是一個無返回值的函數,他並不完成什么事情。As we all know的用法。

我們一開始只是從功能上或者說從數學意義上理解MyFun這個函數,知道MyFun函數名代表的是一個功能(或是說一段代碼)。

直到————>注意到函數指針概念時,不得不在思考:函數名到底又是什么東西?

(不要以為這沒有什么意義的事噢!呵呵... 繼續看你就知道了。)

 

2. 函數指針變量的申明

As we all know 數據變量的內存地址可以存儲在相應的指針變量中,函數的首地址也可以存儲在某個函數指針變量里的。這樣我就可以通過這個函數指針變量來調用所指向的函數了。

在C系列語言中,任何一個變量,總是要先申明,之后才能使用。那么函數指針變量也應該要先申明吧?那又是如何來申明的呢?以上面例子為例,我來申明一個可以指向MyFun函數的函數指針變量FunP。下面就是申明FunP變量的方法:

void (*FunP)(int);  //也可以寫成void (*FunP)(int x);

你看,整個函數指針變量如同函數MyFun的申明處一樣,只不過——我們把MyFun改成(*FunP)而已,這樣就有了一個能指向MyFun函數的指針FunP了。(當然,這個FunP指針變量也可以指向所有其他具有相同參數及返回值的函數。)

沒有代碼,都是文字,累死寶寶了...

 

3. 通過函數指針變量調用函數

有了FunP指針變量后,我們就可以對它賦值指向MyFun,然后通過FunP來調用MyFun函數了。看我如何通過FunP指針變量來調用MyFun函數的:

1 #include <stdio.h>
2 
3 int main(void)
4 {
5     
6 return;
7 }

 

回調函數:在一處聲明和調用,在其他地方實現的這樣一個函數稱為回調函數

一般回調函數的用法為:

甲方進行結構體的定義(成員中包括回調函數的指針)

乙方定義結構體變量,並向甲方注冊,

甲方收集N個乙方的注冊形成結構體鏈表,在某個特定時刻遍歷鏈表,進行回調。

當 函數指針 作為函數的參數,傳遞給一個被調用函數,被調用函數就可以通過這個指針調用外部的函數,這就形成了回調

一般的程序調用函數作用不是非常明顯,可以不使用這種形式

最主要的用途就是當函數不處在同一個文件中,比如動態庫,要調用其他程序中的函數就只有采用回調的形式

通過函數指針參數將外部函數地址傳入來實現調用

函數的代碼做了修改,也不必改動庫的代碼,就可以正常實現調用便於程序的維護和升級。

 


免責聲明!

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



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