当前位置: 首页 > news >正文

【C语言进阶:指针的进阶】函数指针

本章重点内容:

  • 字符指针
  • 指针数组
  • 数组指针
  • 数组传参和指针传参
  • 函数指针
  • 函数指针数组
  • 指向函数指针数组的指针
  • 回调函数
  • 指针和数组面试题的解析

⚡函数指针

函数指针:指向函数的指针。 通过之前的学习我们知道数组指针中存放的是数组的地址,那么函数指针存放的是函数的地址吗?这里的答案是肯定的,代码示例如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void test()
{printf("hello world\n");
}
int main()
{printf("%p\n", test);printf("%p\n", &test);return 0;
}

代码运行结果如下:

 我们可以观察到,函数指针确实可以得到函数的地址。C语言中 函数名和&函数名 都是函数地址。接下来,我将为大家说明函数地址怎样存起来,代码示例如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int Add(int x, int y)
{return x + y;
}
int main()
{int(*pf)(int, int) = Add; //函数的地址要存起来,就得放在【函数指针变量】中去int ret = (*pf)(3,5); //使用指针进行函数调用//int ret = pf(3,5);//int ret = Add(3,5);//这三种写法都可以成功调用Add函数,其中第一种的*是一个摆设,写与不写都可以,写上是为了理解方便printf("%d\n",ret);return 0;
}

 函数指针的写法说明示例:

下面来阅读两段有趣的代码:

//代码1
(*(void (*)())0)();

想要真正阅读这个代码的意思,分为以下几步:

  1. 将0强制类型转化为void(*)()类型的函数指针
  2. 这就意味着0地址处放着一个函数,函数没有参数,返回类型是void。
  3. 调用0地址处的这个函数。
//代码2
void (*signal(int , void(*)(int)))(int);

代码二的括号内部是一个函数的声明,函数名字是signal,signal函数的第一个参数是 int 类型,第二个是 void(*)(int) 类型的函数指针,该函数指针指向的函数参数是 int ,函数返回类型为 void,signal 函数的返回类型也是一个函数指针。该函数指向的函数参数是 int ,返回类型为 void 。

这里给大家补充一个简化代码2的方法,代码示例如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>typedef int* ptr_t;    //将 int* 重新命名为 ptr_t
typedef void(*pf_t)(int); //意思是将 void(*)(int) 重新命名为 pf_t,pf_t是类型int main()
{void(* signal( int, void(*)(int) ) )(int);//化简后pf_t signal(int, pf_t);return 0;
}

这里要注意区分:typedef void(*pf_t)(int)中的 pf_t 是类型名;不写 typedef 时,void(*pf)(int) 中的pf是指针变量的名字。


感谢大家能够看完这篇博客,创作时长,小伙伴们觉得我的博客对你有帮助,不妨留下你的点赞的收藏,关注我,带你了解不一样的C语言。

98b76a6f4a9c4ca88fd93da1188ac6f9.gif

http://www.lryc.cn/news/26019.html

相关文章:

  • Sqoop 使用详解
  • 基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 1 code mapping总体介绍与Function标签页介绍
  • 第十四节 包、权限修饰符、final、常量
  • C++类和对象:初始化列表、static成员和友元
  • Windows 11 安装 Docker Desktop
  • 设计模式-第6章(工厂模式)
  • 【JAVA】线程和进程
  • 移动app安全测试工具好物分享
  • 原生微信小程序引入npm和安装Vant Weapp
  • ChatGPT文章自动发布WordPress
  • vue项目使用watch监听器监听数据变化
  • 动态规划(背包问题)
  • 04741自考计算机网络原理最详细汇总
  • MySQL 入门学习笔记(二) 基本操作
  • 【Linux】理解文件系统
  • Java如何String字符串带括号转成List
  • react 使用 mqtt
  • W25Q256被写保护如何修改
  • 论文投稿指南——中文核心期刊推荐(中国文学作品)
  • MySQL 问题总结
  • 62. 不同路径
  • 在windows安装python3.11同时进行一个数据的练习
  • Java接口专题
  • 6招优化WordPress打开速度-让你的网站飞起来
  • 春天到了,来一场 VoxEdit 创作大赛吧!
  • 异步Buck和同步Buck的特点
  • 基于轻量级YOLO开发构建中国象棋目标检测识别分析系统
  • 机器学习100天(三十五):035 贝叶斯公式
  • 大话数据结构-栈
  • javaFx实现放大镜效果——圆形、矩形、三角形放大镜,拖动调整放大镜大小,设置放大倍数