尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

C语言 指针的理解 — 3

C语言 指针的理解 — 3
📅 发布时间:2026/7/2 9:41:27

什么是函数指针?

和数组指针有些类似,指向函数的指针就是函数指针。

其实函数也是有地址的:

int Add(int x, int y) { return x + y; } int main() { printf("%p\n", &Add); printf("%p\n", Add); return 0; }

这里的 &Add 和 Add 的效果是一样的,取出的都是函数的地址。

既然可以得到函数的地址那么函数也是存在的。

int(*pf)(int, int) = &Add;

左边的 int 表示函数的返回类型是 int,右边的(int ,int)是函数的参数的类型。

函数指针的书写形式是和函数返回类型以及函数的参数密切相关的。

函数指针有什么用?

通过存放函数的地址,间接访问函数,和其他指针的作用是一样的。

int Add(int x, int y) { return x + y; } int main() { int(*pf)(int, int) = &Add; int ret = (*pf)(2, 3); printf("%d\n", ret); ret = pf(3, 4); printf("%d\n", ret); return 0; }

这个 * 可写可不写,效果相同。

下面是函数指针的应用场景:

void menu() { printf("**********************\n"); printf("*** 1.Add 2.Sub ****\n"); printf("*** 3.Mul 4.Div ****\n"); printf("*** 0.Exit ****\n"); printf("**********************\n"); } int Add(int x, int y) { return x + y; } int Sub(int x, int y) { return x - y; } int Mul(int x, int y) { return x * y; } int Div(int x, int y) { return x / y; } int main() { int input = 0; int x = 0; int y = 0; int ret = 0; do { menu(); printf("请输入>"); scanf("%d", &input); switch (input) { case 1: printf("请输入2个数"); scanf("%d %d", &x, &y); ret = Add(x, y); printf("%d\n", ret); break; case 2: printf("请输入2个数"); scanf("%d %d", &x, &y); ret = Sub(x, y); printf("%d\n", ret); break; case 3: printf("请输入2个数"); scanf("%d %d", &x, &y); ret = Mul(x, y); printf("%d\n", ret); break; case 4: printf("请输入2个数"); scanf("%d %d", &x, &y); ret = Div(x, y); printf("%d\n", ret); break; case 0: printf("退出\n"); break; default: printf("输入错误\n"); } } while (input); return 0; }

可以发现:进入case语句时代码是非常冗余的,如果想把调用算数的冗余代码,分装成一个函数,但又要做到实现不同的函数调用时,函数指针就会帮大忙。

把代码用函数指针写成这样,就会大大减少冗余度。这种方法其实是回调函数的使用。

void calc(int pf(int , int )) { int x = 0; int y = 0; printf("请输入2个数"); scanf("%d %d", &x, &y); int ret = pf(x, y); printf("%d\n", ret); } int main() { int input = 0; int x = 0; int y = 0; int ret = 0; do { menu(); printf("请输入>"); scanf("%d", &input); switch (input) { case 1: calc(Add); break; case 2: calc(Sub); break; case 3: calc(Mul); break; case 4: calc(Div); break; case 0: printf("退出\n"); break; default: printf("输入错误\n"); } } while (input); return 0; }

相关新闻

  • Kali Linux在VMware中无法联网、显卡失灵、复制粘贴失效?(2024最新兼容性修复手册)
  • 什么是选择自己适合的赛道?
  • 我把一坨原始素材扔进文件夹,对AI说了句话,它直接还我一条成片

最新新闻

  • Wand-Enhancer终极指南:如何免费解锁WeMod完整功能的5大技巧
  • 题解:洛谷 B4500 [GESP202603 三级] 凯撒密码
  • 儿童近视防控眼科机构咋选择
  • 6款实用AI降重软件推荐,合规改写不踩学术红线
  • 被问到为何中间有一段长达半年的求职空窗期?留学生用积极事实消除疑虑「蒸汽求职分享」
  • 如何使用C++标准输入流cin读取字符串?

日新闻

  • Python Playwright录制功能:从零到一构建自动化测试脚本
  • 如何用开源工具永久保存你心爱的小说:novel-downloader全攻略
  • In-Context Learning不是教知识,而是模式对齐:从5个示例到100个工业级样本的真相

周新闻

  • Windows字体自定义终极方案:No!! MeiryoUI完全指南
  • Deepin Boot Maker:告别命令行,3分钟制作Linux启动盘的智能解决方案
  • Plain Craft Launcher 2:重新定义你的Minecraft游戏体验

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号