百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

实例讲解C语言函数指针定义及回调函数应用

haoteby 2025-02-27 15:16 7 浏览

一个函数会占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这就和数组名表示数组的首地址概念类似。可以把函数的首地址赋予一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这样的指针就是函数指针,函数指针就是指向函数的指针。通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。


1.函数指针的定义

函数指针将C语言的灵活性和强大功能推向了一个新的高度。作为一种指向函数的指针,它不仅能够提高代码的复用性,还能实现回调、模拟面向对象编程以及设计模式等高级特性。

函数指针的定义形式为:

returnType (*pointerName)(param list);
# 返回值类型 +(指针变量名)(形参列表)

eg:

int (*p)(int, int);

例如:

typedef int (*fun_ptr)(int,int); // 声明一个指向同样参数、返回值的函数指针类型

(1)returnType 表示函数返回值类型,pointerNmae 为指针名称,param list 为函数参数列表。

(2)param list参数列表中可以同时给出参数的类型和名称,也可以只给出参数的类型,省略参数的名称,这一点和函数原型非常类似。

(3)注意( )的优先级高于*,第一个括号不能省略,如果写作 returnType *pointerName(param list);就成了函数原型,它表明函数的返回值类型为 returnType *。


2. 函数指针的三种定义方式

(1)先定义出函数的类型,再通过类型定义函数指针变量

/*定义出一个函数类型,返回值是void,形参列表(int,char)*/
typedef void(MAX)(int, char);
MAX* pFunc = func;

(2)先定义出函数指针的类型,再通过指针类型定义函数指针变量

typedef void(*MAX)(int, char);
MAX pFunc = func;

(3)重点:直接定义函数指针变量

int max(int a,int b);
int (*p1max) (int a,int b) = max;

函数指针和指针函数的区别:

# 指针函数本质是一个函数,其返回值是一个指针:

int* p(int, int);

# 函数指针本质是一个指针,其指向一个函数:

int (*p)(int, int);

简单点就是:函数名带括号的就是函数指针,否则就是指针函数。


3.函数指针的应用—回调函数

函数指针变量可以作为某个函数的参数来使用,回调函数就是一个通过函数指针调用的函数。

写一个函数A,并把这个函数A的地址赋值给一个函数指针,然后把这个函数指针当作参数赋给另一个函数B,函数B通过函数指针来调用函数A。这个函数A就是回调函数。为什么要使用回调函数,因为使用回调函数能够实现底层代码的解耦。


实例

functionpointMain.c

#include
#include "Method.h"




int main()
{
int x,y,max_value = 0;
int ps[2] = {0,0};
 /*定义函数指针*/
 /* 函数指针的定义形式:returnType (*pointerName)(param list);*/
int (*p1max) (int a,int b) = max;
int (*p2max) (int ,int ) = max;/*参数名称可以省略*/


printf("Input two numbers:");
scanf("%d%d",&x,&y);


max_value = (*p1max)(x,y);
printf("Max value: %d\n", max_value);
max_value = 0;


max_value = (*p2max)(x,y);
printf("Max value: %d\n", max_value);
max_value = 0;


populate_array(x,y,ps, sizeof(ps)/sizeof(ps[0]), max,min);/*max min 是回调函数 */
printf("Max value: %d\n", ps[0]);   
printf("Min value: %d\n", ps[1]);   
getchar();
return 0;  
}

Method.c


#include "Method.h"
#include
int max(int a,int b)
{
return a>b ? a : b;
}




int min(int a,int b)
{
return a

Method.h


#ifndef _METHOD_H /*防止头文件重复包含*/
#define _METHOD_H




int max(int a,int b);/*有函数返回值的求最大值函数*/
int min(int a,int b);




void populate_array(int a,int b,int *array, int arraySize, int (*getMaxValue)(int a,int b),int (*getMinValue)(int a,int b));
#endif

运行结果


4.参考内容

[1]菜鸟教程《C函数指针与回调函数》

https://www.runoob.com/cprogramming/c-fun-pointer-callback.html

[2]CSDN作者极客代码的文章《C语言函数指针全面指南:从入门到精通》,文章链接为

https://blog.csdn.net/suifengme/article/details/141174126

[3]C语言中文学习网

[4]CSDN作者woshizuopie的文章《嵌入式C语言基础知识 -- 函数指针&回调函数&结构体指针》,文章链接为:
https://blog.csdn.net/woshizuopie/article/details/118608507


本文内容来源于网络,仅供参考学习,如内容、图片有任何版权问题,请联系处理,24小时内删除。


作 者 | 郭志龙

编 辑 | 郭志龙
校 对 | 郭志龙

相关推荐

手把手教你构建一个简单的Eclipse RCP应用

EclipseRCP应用,通常用来构建跨平台的图形化管理客户端,Eclipse从IBM开源以来,一直占据开源Java开发平台的头把交椅,现在仍然收到很多人的追捧。今天就带大家通过一个简单的例子:开发...

Eclipse配置maven 环境(maven的配置、以及eclipse中配置maven)

Eclipse配置maven环境的先决条件是,Windows系统已经配置好maven环境Eclipse配置maven环境步骤如下:一、给Eclipse添加本地maven...

如何在Eclipse中搭建Zabbix源码的调试和开发环境

Zabbix是一款非常优秀的企业级软件,被设计用于对数万台服务器、虚拟机和网络设备的数百万个监控项进行实时监控。Zabbix是开放源码和免费的,这就意味着当出现bug时,我们可以很方便地通过调试源码来...

Eclipse中将现有的maven项目 导入Git,并发布到

Eclipse中将现有的maven项目导入Git,并发布到github一、Eclipse中将现有的maven项目导入Git1.将本地的maven项目,添加他的子项目到git仓库,并发布到githu...

eclipse安装图解(eclipse安装教程2021)

下载eclipse之前请先安装jdk、查看自己电脑系统是多少位第一步:打开官网https://www.eclipse.org/downloads/第二步:点击DownloadPackages第三...

Eclipse IDE for C/C++ Developers 开发环境搭建详解

EclipseIDEforC/C++Developers开发环境搭建详解1.到官网下载eclipseforC/C++Developmer解压就行2.下载MinGW用来编译C/C+...

来来来!一文告诉你Eclipse的正确安装使用姿势,你都清楚吗?

前言本学习笔记是有关如何设置Eclipse的详细说明。即使你天天在使用它,但是,相信我,或许你并不足够了解它。安装Java运行时环境Eclipse是Java应用程序,因此设置Eclipse的第一步是安...

纯干货!Eclipse的安装与使用(eclipse 安装教程)

之前有人给小华君留言,说让小华君讲一讲Eclipse,那好,我们今天就简单地讲一下。讲得也是基础部分,如题,主要是Eclipse的安装与使用。废话不多说,开始讲。Eclipse是Java开发的集成开发...

2020 最新版jdk & eclipse下载安装 之JDK(一)

首次安装Eclipse,去官网下载资源找不对安装包,安装之后又报错,如果和我一样的话,那就来看我的分享吧安装eclipse前,需要先安装JDK软件首先,到oracle官网下载JDK安装包下载链接:...

Eclipse 安装教程(附安装包下载)(eclipse安装教程最新版)

Eclipse软件介绍是一个开放源代码、基于Java的可扩展开发平台。它本身只是一个框架和一组服务,通过插件组件构建开发环境。幸运的是,Eclipse附带了一个标准的插件集,包括Java开发工具(Ja...

JDK安装、Eclipse安装及运行环境配置

1、eclipse下载打开地址:http://www.eclipse.org/downloads/;根据自己机器的操作系统,页面上显示适应机器操作系统的Eclipse下载列表,也可以点击下图所示位置切...

Ubuntu Linux 21.10官方壁纸现已提供下载 最高8192×4608分辨率

距离十月份的Ubuntu21.10Linux发行版的到来,已只有数周的时间。在今年4月介绍了与之有关的大量细节之后,Canonical现又放出了代号为“ImpishIndri”的这一大...

Linux 4.7系统内核发布:支持RX 480

经过一周休假之后,LinusTorvalds今天正式发布了新版LinuxKernel4.7,可在官网直接下载。Linux4.7版内核的开发启动于5月29日,经过了七个RC候选版,加入了不少新特...

开发企业官网就用这个基于SpringBoot的CMS系统,真香

前言推荐这个项目是因为使用手册部署手册非常...

非常详细的Linux系统安装教程!建议收藏

公众号:老油条IT记一、下载ISO镜像#官网:CentOS:http://mirror-status.centos.org/#cn#其他:网易:http://mirrors.163.com/cento...