【C/C++】指针函数与函数指针

1、指针函数--指针作为函数的返回值

指针函数本质是一个函数,只不过函数的返回值是一个指针

cpp 复制代码
#include <stdio.h>
#include <malloc.h>
#include <string.h>

char * funGetString();
int main() {

    char * sentence =funGetString();
    printf(" == %s\n",sentence);

    return 0;
}

char * funGetString(){
    char * str =(char* )malloc(100);
    strcpy(str,"hello darkness My old friend!");
    return str;
}

2、函数指针 -指针保存函数地址

咱们定义的函数,在运行程序的时候,会将函数的指令加载到内存的代码段,所以函数也有
起始地址。
c语言规定:函数的名字就是函数的首地址,即函数的入口地址 咱们就可以定义一个指针
变量,
来存放函数的地址,这个指针变量就是函数指针变量。

1 函数指针变量的定义方法

返回值类型 (*函数指针变量名 )( 形参列表 );

cpp 复制代码
//定义了一个函数指针变量p,p指向的函数
//必须有一个整型的返回值,有两个整型参数。
 int (*p)(int,int);

 int max(int x,int y) { }
 int min(int x,int y) { }

 //可以用这个p存放这类函数的地址。
 p=max; p=min;

2 调用函数的方法

1.通过函数的名字去调函数(最常用的)

cpp 复制代码
1 int max(int x,int y) { }
2 int main()
3 {
4 int num;
5 num=max(3,5);
6 }

2.可以通过函数指针变量去调用

cpp 复制代码
1 int max(int x,int y) { }
2 int main()
3 {
4 int num;
5 int (*p)(int ,int);
6 p=max;
7 num=p(3,5);
8 }

3、回调函数

其实还可以把函数指针作为参数传递给 其他函数,这样可以构建一个 回调的效果
函数指针最常用的地方在于将一个函数作为参数传递给另一个函数的时候要使用函数指针
将一个函数作为参数传递给另一个函数,将这个函数称之为回调函数

cpp 复制代码
//测试函数指针回调
void funcExecute(void (*p)(int),int value){
  printf(" Prepare to callBack!!\n");

  p(value);

}

//回调函数
void funcCallBack(int x){

  printf("mission accomplished! %d\n",x);
}
cpp 复制代码
int main(){

 //测试回调 只需要传入函数名
funcExecute(funcCallBack,666);

return 0;
}

例2

cpp 复制代码
1 #include <stdio.h>
2
3 int add(int x,int y)
4 {
5 return x+y;
6 }
7 int sub(int x,int y)
8 {
9 return x‐y;
10 }
11 int mux(int x,int y)
12 {
13 return x*y;
14 }
15 int dive(int x,int y)
16 {
17 return x/y;
18 }
19
20 int process(int (*p)(int ,int),int a,int b)
21 {
22 int ret;
23 ret = (*p)(a,b);
24 return ret;
25 }
26
27 int main(int argc, char *argv[])
28 {
29 int num;
30 num = process(add,2,3);
31 printf("num = %d\n",num);
32
33 num = process(sub,2,3);
34 printf("num = %d\n",num);
35
36 num = process(mux,2,3);
37 printf("num = %d\n",num);
38
39 num = process(dive,2,3);
40 printf("num = %d\n",num);
41
42 return 0;
43 }

4、函数指针数组

函数指针数组:本质是一个数组,数组里面的每一个元素都是一个函数指针

返回值类型 (*函数指针变量名函数指针的个数)(形参列表);

int(*p10)(int,int);
定义了一个函数指针数组,有10个元素p0 ~p9,每个元素都是函数指针变量,
指向的函数,必须有整型的返回值,两个整型参数。

相关推荐
LDR00621 分钟前
LDR6500赋能POS机底座:单口Type-C供电、维护与产测一体化解决方案
大数据·c语言·人工智能
鱼很腾apoc1 小时前
【Linux】第7期 进程间通信 (IPC) 详解:管道 (匿名 / 命名) + System V
linux·服务器·c语言·学习·进程间通信·ipc
weixin_423533992 小时前
c++类的继承学习-去中心化交易所(DEX)的“流动性池初始化与交易指令”设计
c++·学习·去中心化
wuyk5552 小时前
21. 嵌入式面试避坑指南:sizeof 是关键字,不是函数!
c语言·开发语言·stm32·单片机·嵌入式硬件
fzm52985 小时前
车载ECU单元测试技术与应用研究
c语言·自动化测试·单元测试·嵌入式·白盒测试
unicrom_深圳市由你创科技5 小时前
数据库用SQLite还是SQL Server?工业数据存储选哪个?
c++
郝学胜_神的一滴5 小时前
CMake 037:宏传递流转机制与C++编译特性跨平台适配指南
c++·cmake
十月的皮皮6 小时前
C语言学习笔记20260703-牛牛与后缀表达式(逆波兰表达式)
c语言·笔记·学习
apocelipes2 天前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
郝学胜_神的一滴3 天前
CMake 034:生成器表达式:解耦构建时序、精简分支逻辑的终极利器
c++·cmake