函数指针和回调函数

简介: 简介函数的二进制代码存放在内存四区中的代码区,函数的地址是它在内存中的起始地址。如果把函数的地址作为参数传递给函数,就可以在函数中灵活的调用其它函数。使用函数指针的三个步骤:1.声明函数指针:声明普通指针时,必须提供指针的类型。同样,声明函数指针时,也必须提供函数类型,函数的类型是指返回值和参数列表(函数名和形参名不是)函数之间具有相同的返回值类型和参数列表数目和类型都相同即是同一类函数

简介

函数的二进制代码存放在内存四区中的代码区,函数的地址是它在内存中的起始地址。如果把函数的地址作为参数传递给函数,就可以在函数中灵活的调用其它函数。

使用函数指针的三个步骤:

1.声明函数指针:

声明普通指针时,必须提供指针的类型。同样,声明函数指针时,也必须提供函数类型,函数的类型是指返回值和参数列表(函数名和形参名不是)

函数之间具有相同的返回值类型和参数列表数目和类型都相同即是同一类函数

1.1声明函数指针语法

函数的返回值类型  (*自定义指针名字) (函数形参列表可写名字也可以不写)

#include <iostream>usingnamespacestd;
voideat_ming(stringfood1)
{
cout<<"小明吃"<<food1<<endl;
}
voideat_hong(stringfood2)
{
cout<<"小红吃饭"<<food2<<endl;
}
intmain()
{
//声明函数指针void (*ming_hong_ptr)(string); 
ming_hong_ptr=eat_ming;
//调用ming_hong_ptr("香蕉");
    (*ming_hong_ptr)("香蕉");        // 用函数指针名调用函数。 C语言ming_hong_ptr=eat_hong;
ming_hong_ptr("苹果");
    (*ming_hong_ptr)("苹果");     // 用函数指针名调用函数。 C语言return0;
}

2.让函数指针指向函数的地址:

2.1语法:

void (*ming_hong_ptr)(string); 
ming_hong_ptr=eat_ming;

3.通过函数指针调用函数。

//调用ming_hong_ptr("香蕉");
(*ming_hong_ptr)("香蕉");        // 用函数指针名调用函数。 C语言ming_hong_ptr=eat_hong;
ming_hong_ptr("苹果");
(*ming_hong_ptr)("苹果");     // 用函数指针名调用函数。 C语言

回调函数

现有一个饭店小明和小红还有很多不知名的客人,我们不可能用一个函数封装起来它的所有操作,只能封装起开他们的共同操作

例代码:

#include <iostream>usingnamespacestd;
voideat( stringname, stringfood1)
{
cout<<name<<"吃"<<food1<<endl;
}
voidfan_dian()
{
cout<<"点餐"<<endl;
cout<<"做饭"<<endl;
eat("某某", "某某食物");
}
intmain()
{
fan_dian()
return0;
}

在以上代码中我们就只能封装他们的共同性,可是他们的个人习惯也不能没有啊。

此时函数指针就有用了

例代码:

#include <iostream>usingnamespacestd;
voideat_ming(stringfood1, intspending_power=0)
{
cout<<"小明吃"<<food1<<endl;
cout<<"小明站在凳子上吃"<<endl;
}
voideat_hong(stringfood2,intspending_power=0 )
{
cout<<"小红吃饭"<<food2<<endl;
cout<<"小红站在桌子上吃"<<endl;
}
voidfan_dian(void (*habit)(string,int))
{
cout<<"点餐"<<endl;
cout<<"做饭"<<endl;
habit("香蕉",59); //缺省值没有用,函数指针写有几个参数就要传入几个参数}
intmain()
{
void (*habit)(string,int);
habit=eat_ming;
fan_dian(habit);
habit=eat_hong;
fan_dian(habit);
return0;
}

利用函数指针当形参可以传入你想要的客人习惯

目录
相关文章
|
5月前
|
Unix
网络编程之 信号捕捉器(函数指针与回调函数)(2)
sigaction()函数 前面我们讲到的内容已经足以用来防止僵尸进程生成的代码。之所以博主还要介绍sigaction()函数是因为它类似于signal()函数,而且完全可以代替后者,也更稳定(主要是书上介绍到了
57 1
|
5月前
|
Linux
网络编程之 信号捕捉器(函数指针与回调函数)(1)
接着我们的信号说下去 之前博主给大家分享到了信号的概念和初步介绍signal函数的形式后就没有继续往下介绍了,实在是因为时间不够,那个时候博主还要上课,现在博主放假了就好好给大家分享一下如何注册信号捕捉,以及信号捕捉器的妙用。
60 1
|
5月前
指针(5)---回调函数
指针(5)---回调函数
28 0
|
5月前
|
编译器 C语言
C语言进阶⑪(指针上)(知识点和对应练习)回调函数模拟实现qsort。(下)
C语言进阶⑪(指针上)(知识点和对应练习)回调函数模拟实现qsort。
38 0
|
4月前
|
C语言
指针进阶(回调函数)(C语言)
指针进阶(回调函数)(C语言)
|
5月前
|
算法 搜索推荐 C语言
c函数指针与回调函数
c函数指针与回调函数
34 2
|
5月前
|
算法 搜索推荐 程序员
C语言中的函数指针和回调函数
C语言中的函数指针和回调函数
36 2
|
5月前
|
存储 C语言
C语言进阶⑪(指针上)(知识点和对应练习)回调函数模拟实现qsort。(中)
C语言进阶⑪(指针上)(知识点和对应练习)回调函数模拟实现qsort。
34 0
|
5月前
|
存储 C语言 C++
C语言进阶⑪(指针上)(知识点和对应练习)回调函数模拟实现qsort。(上)
C语言进阶⑪(指针上)(知识点和对应练习)回调函数模拟实现qsort。
25 0
|
5月前
|
存储 C语言
c语言函数指针和指针函数的区别,以及回调函数的使用。
c语言函数指针和指针函数的区别,以及回调函数的使用。
40 0