C语言函数指针调用函数

C语言函数指针调用函数C 语言可以定义指针变量指向函数 通过指针来调用函数 使用 1 定义函数指针变量 nbsp 函数返回值类型 指针变量名 2 将已有函数入口赋值给函数指针变量 fnPt avg 3 使用指针变量调用函数 指针变量名 参数 例子 定义函数指针变量 将不同函数赋值给指针变量 调用函数 include 求最大值 intzhizhente 1

C语言可以定义指针变量指向函数,通过指针来调用函数。

使用:

1、定义函数指针变量:  函数返回值类型 (*指针变量名)();

2、将已有函数入口赋值给函数指针变量:fnPt = avg;

3、使用指针变量调用函数:(*指针变量名)(参数);

注意:看了一些参考资料里,声明函数指针时不用指定参数类型,但实际编辑时又提示指定参数类型才可以。

例如例子中的 int (*fnPt)(int*, int) = zhizhentest3_1_max;  这里就需要带上参数类型才行,否则编译时报错。

例子:定义函数指针变量,将不同函数赋值给指针变量,调用函数。

#include 
  
    //求最大值 int zhizhentest3_1_max(int* data, int len){ int max = *data;//获取数组首地址对应的元素值 //通过指针+1来获取下一个元素的地址 for(int* p=data; p < data+len; p++){ if(*p > max) max = *p; } return max; } //求平均值 int zhizhentest3_2_avg(int* data, int len){ int sum = 0; for(int* p=data; p < data + len; p++){ sum +=*p; } return sum/len; } //函数指针变量作为函数参数 void zhizhentest3_3_map(int* data, int len, int (*fn)(int)){ for(int* p = data; p < data + len; p++){ printf("%d, ", (*fn)(*p)); } printf("\n"); } //不变 int zhizhentest3_4_nochange(int val){ return val; } //求平方 int zhizhentest3_5_square(int val){ return val * val; } //求立方 int zhizhentest3_6_cube(int val){ return val * val * val; } //返回指针的函数 int* zhizhentest3_7_map(int* data,int len, int (*fn)(int)){ static int result[5]; int i=0; for(int* p = data; p < data + len; p++){ result[i++] = (*fn)(*p); } return result; } void zhizhentest3main(){ int arr[5] = {4,7,2,3,9}; int (*fnPt)(int*, int) = zhizhentest3_1_max;//定义返回值为int型的函数指针变量*fnPt,并将zhizhentest3_1_sum函数入口赋给fnPt int max = (*fnPt)(arr,5);//通过函数指针变量调用函数,传入参数 printf("max=%d\n", max); fnPt = zhizhentest3_2_avg;//将zhizhentest3_2_avg函数入口赋给指针变量fnPt int avg = (*fnPt)(arr,5); printf("avg=%d\n", avg); printf("\n"); printf("数组元素为:\n"); zhizhentest3_3_map(arr,5,zhizhentest3_4_nochange); printf("元素求平方:\n"); zhizhentest3_3_map(arr,5,zhizhentest3_5_square); printf("元素求立方:\n"); zhizhentest3_3_map(arr,5,zhizhentest3_6_cube); printf("\n"); int* result1 = zhizhentest3_7_map(arr,5,zhizhentest3_4_nochange); printf("返回的指针数组元素为:\n"); for(int* p1 = result1; p1 < result1 + 5; p1++){ printf("%d, ", *p1); } printf("\n"); int* result2 = zhizhentest3_7_map(arr,5,zhizhentest3_5_square); printf("返回的数组平方元素为:\n"); for(int* p2 = result2; p2 < result2 + 5; p2++){ printf("%d, ", *p2); } printf("\n"); int* result3 = zhizhentest3_7_map(arr,5,zhizhentest3_6_cube); printf("返回的数组立方元素为:\n"); for(int* p3 = result3; p3 < result3 + 5; p3++){ printf("%d, ", *p3); } printf("\n"); } 
  

输出:

C语言函数指针调用函数




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/221590.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午5:45
下一篇 2026年3月17日 下午5:45


相关推荐

  • 什么是 AI 智能体,和大模型有什么关系?

    什么是 AI 智能体,和大模型有什么关系?

    2026年3月15日
    2
  • 海思hi3798mv300和310的区别_海思3516

    海思hi3798mv300和310的区别_海思3516在网上搜寻海思HI3519或者hi3516实时识别除了官方给的SDK中有Rfcn的实时识别例子之外,其它都是读图片例子。官方例子中给了如下网络参考:Rfcn、Segnet、FasterRcnn、Cnn、Ssd、Yolov1、Yolov2、Yolov3、Lstm、Pvanet在SDK中文件夹路径为/rp-hi3516dv300-busybox/smp/a7_linux/mpp/sample/svp/nnie其中有一个sample_nnie_main.c文件,官方例子如下:/************

    2026年2月20日
    3
  • 空指针异常主要原因以及解决方案

    空指针异常主要原因以及解决方案空指针异常产生的主要原因如下 1 当一个对象不存在时又调用其方法会产生异常 obj method obj 对象不存在 2 当访问或修改一个对象不存在的字段时会产生异常 obj method method 方法不存在 3 字符串变量未初始化 4 接口类型的对象没有用具体的类初始化 比如 Lista 会报错 Lista newArrayList 则不会报错了当

    2026年3月19日
    2
  • maven配置本地仓库位置_在setting中配置自己的仓库

    maven配置本地仓库位置_在setting中配置自己的仓库在MAVE_HOME/conf/settings.xml文件中配置本地仓库位置:eclipse与maven配置指定maven安装目录UserSetting配置在eclipse中配置使用的maven的setting.xml文件,使用maven安装目录下的setting.xml文件。注意:如果修改了setting.xml文件需要点击上图中的“updatesettings”按钮

    2026年2月26日
    43
  • node使用express框架结合mysql实现登录、注册、忘记密码等功能(使用邮箱验证)

    node使用express框架结合mysql实现登录、注册、忘记密码等功能(使用邮箱验证)今天没废话 直接看代码 目录一 环境以及包二 数据库三 登录接口四 注册接口五 忘记密码接口六 数据库配置文件一 环境以及包 npmiexpressn parsernpmico parsernpmijs 二 数据库三 登录接口 constexpress require express constrouter express Router token 生成插

    2026年3月26日
    3
  • redis客户端连接(error) NOAUTH Authentication required「建议收藏」

    redis客户端连接(error) NOAUTH Authentication required「建议收藏」redis客户端连接成功,但是操作报异常——(error)NOAUTHAuthenticationrequired错误的含义是说你没有认证,说明没有使用密码连接查看密码:进入redis的安装目录(是安装目录的),查看redis.config文件viredis.config打开配置文件后,输入#requirepassfoobared(快速定位的命令)然后回车红框里的就是密码使用密码连接.

    2022年5月2日
    72

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号