您的位置:首页 > 其它

【归纳总结】函数指针和回调函数

2015-05-23 01:53 239 查看

函数指针和回调函数

函数指针

在C语言中,函数也有地址,而函数名称就可以用来表示函数的地址,既然有地址,那就代表可以用一个指针变量来存储这个地址,函数指针就是用来记录函数的地址。

例 一:

#include <stdio.h>

void func(void)
{
printf("HelloWorld\n");
}

int main()
{
printf("func== %p\n", func);         //可以看出函数名称func是有自己的地址
void(*p_func)(void) = func;          //声明一个函数指针,记录函数func的地址
func();
p_func();
printf("p_func== %p, func == %p\n", p_func, func);      //函数func的地址和
//p_func存储的地址一样。

return0;
}


在例一中,func()和p_func()在屏幕上打印出来的结果是一样,证明了一个函数指针与函数捆绑后,该函数指针就能当作一个函数使用。

函数指针需要先声明然后再使用,函数指针的声明可以根据函数声明变化得到,同时函数指针也分类型,不同格式的函数适合与不同类型的函数指针捆绑。

函数指针的声明

声明函数指针,可以把声明看成3个部分:

例 二:

(函数的返回类型) (*函数名称) (参数列表); //函数名称前加*号,表示是指针。

void (*p_func)(void); //指向一个无返回值、无参数的函数。

int (*p_func)(void); //指向一个无参数、返回值为整型的函数。

char* (*p_func)(char**) //指向一个参数为char**类型、返回值为char*的函数。

所以声明函数指针的时候,必须清楚它所指向的函数的返回值和参数。

在C语言中,结构体单中不可以声明函数,但是我们可以在结构体单中声明一个函数指针,给此指针赋值,就可以实现在结构体声明函数的目的。

回调函数

函数指针可以作为形式参数使用,会作为实际参数使用的函数叫回调函数。我在网上搜过了资料,发现回调函数是十分重要的知识,但目前本人水平有限,还不是很清楚这玩意,等了解后,会重新开一个文章,把所知道的再详细的总结一次。

现在先举个以函数指针作为参数的例子

例 三 :

#include <stdio.h>
void big(int* num, int* num2)
{
inttmp = 0;
if(*num > *num2)
{
tmp = *num;
*num = *num2;
*num2 = tmp;
}
}

void little(int* num, int* num2)
{
big(num2,num);
}

void bubble(int* p_arr, int size, void(*p_func)(int*,int*))
{
inti = 0;
intj = 0;

for(i = 0; i < size; i++)
{
for (j = 0; j < size - i - 1; j++)
{
p_func(p_arr+ j, p_arr + j + 1);
}
}
}

void print(int* p_arr, int size)
{
inti = 0;
for(i = 0; i < size; i++)
{
printf("%d ", *(p_arr + i));
}
printf("\n");
}

void for_each(int* p_arr, int size, void(*p_func)(int*, int))
{
p_func(p_arr,size);
}

int main()
{
intarr[7] = {5, 2, 9, 8, 1, 3, 7};
bubble(arr,7, little);
for_each(arr,7, print);
bubble(arr,7, big);
for_each(arr,7, print);

return0;
}


这是我们熟悉的冒泡排序法,这里通过传入一个函数指针,来让bubble判断是升序排序,还是降序排序,同时bubble函数里面的数据会作为参数再传递到函数指针里面。(我都不知道想说什么了,因为在我这3个星期的学习中还没写过这样的程序,所以还是等接触了以后再深入了解后再总结把,今天就到此为止了。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: