一看就會的C語言筆記——指針函數、函數指針、回調函數

一看就會的C語言筆記——指針函數、函數指針、回調函數

//指針函數:指針函數本質是一個函數,只不過返回值為某一類型的指針(地址值)。

//函數返回值必須用同類型的變量來接受,也就是說,指針函數的返回值必須賦值給同類型的指針變量。

//指針函數的定義格式:類型名 *函數名(函數參數列表);(其中*號靠左靠右都行,比如int* sum(int a,int b);或者int *sum(int a,int b);)

//函數指針:函數指針本質是一個指針,只不過這個指針指向一個函數。

//常見的函數都有其入口,比如main()函數是整個程序的入口,我們調用的其他函數都有其特定的入口,正如我們可以通過地址找到相應的變量一樣,我們也可以通過地址找到相應的函數。而這個存儲著函數地址的指針就是函數指針。

//換言之,我們所說的指針變量通暢指向一個整形、字符型、或者數組等變量,而函數指針指向的是函數。

//正如我們可以通過指針訪問相應的變量,函數指針也可以像函數一樣用於調用函數、傳遞參數。

//函數指針定義格式:類型名 (*函數名)(函數參數列表)

//我們可以發現,這裡的"*函數名"是用括號括起來的

//

//回調函數:函數指針作為某個函數的參數

//我們知道,函數指針變量也是一個變量,那麼作為變量當然也可以當做參數來使用。

//為了理解回調函數,我們先要搞清楚回調函數有什麼作用。比如老闆、經理、你三個角色。老闆通常是規則的指定著,經理按照規則指派相應的人去做事,而你就是任務的具體執行者。

//當老闆要求經理去做一個事情,那麼老闆就是主調函數,經理就是回調函數,你按照規則去處理事情就是相應回調函數。你處理的結果會反饋給經理,經理拿著你的結果再反饋給老闆。老闆就可以使用這個結果去做相關的事情了。

//在這個環節中,你只需要按照指定的規則去做事,而經理不需要考慮事情是怎麼做的,他只需要把相應的事情分配給對應的人去處理即可,然後將獲取的結果反饋給老闆。如果規則有變,只需要對應的員工知道哪裡改變了,而經理不需要關注這些細節。

//以上就是回調函數

例如:

1、指針函數

#include 
int *sum(int a,int b);
int main()
{
int a=1;
int b=2;
int *P=NULL;
p=sum(a,b);
printf("%d",*p);
return 0;
}
int *sum(int a,int b)
{
static int sum=0;
sum=a+b;
return ∑
}

2、函數指針

#include 

int max(int x, int y)
{
return x > y ? x : y;
}

int main(void)
{
/* p 是函數指針 */
int (* p)(int, int) = & max; // &可以省略
int a, b, c, d;

printf("請輸入三個數字:");
scanf("%d %d %d", & a, & b, & c);


/* 與直接調用函數等價,d = max(max(a, b), c) */
d = p(p(a, b), c);

printf("最大的數字是: %d\n", d);

return 0;
}

3、回調函數

#include 

int add_ret() ;

int add(int a , int b , int (*add_value)())
{
return (*add_value)(a,b);
}

int main(void)
{
int sum = add(3,4,add_ret);
printf("sum:%d\n",sum);
return 0 ;
}

int add_ret(int a , int b)
{
return a+b ;
}

最後:

1、指針函數不同於函數指針, int (*f)(int a);或者char (*f1)(void);

2、函數指針聲明為指針,它與變量指針不同之處是,它不是指向變量,而是指向函數。所以一定要注意。

3、函數指針有兩個用途:調用函數和做函數的參數.


分享到:


相關文章: