C语言进阶——函数指针
作者:敲代码の流川枫
博客主页:流川枫的博客
专栏:C语言从入门到进阶
语录:Stay hungry stay foolish
工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网
点击免费注册和我一起刷题吧
我们先看一个代码:
#include<stdio.h>
void test()
{printf("haha\n");
}
int main()
{printf("%p\n", test);printf("%p\n", &test); return 0;
}
输出的是两个地址,函数名就是函数的地址
将函数的地址存起来:
#include<stdio.h>
void test()
{printf("haha\n");
}
int main()
{//函数指针int (*pf)(const char*) = test;(*pf)("abc");pf("abc");test("abc");return 0;
}
函数指针也是一种指针,是指向函数的指针
int (*pf)(const char*) = test
pf先和*结合,是指针,指向test函数,无参数,返回值类型为void
《C陷阱和缺陷》中的一段代码:
( *(void (*)())0 )();
void(*)()是函数指针类型
( void (*)() )0 是强制类型转换,结果是函数的地址,0地址中存放一个函数,无参数,无返回值
以上代码总体是一次函数调用,调用的是0作为地址处的函数,首先把0强制转换为无参,返回类型是void的函数的地址,其次是调用0地址处的这个函数
再观察这段代码:
void (*signal(int , void(*)(int)))(int);
代码可以化简:
把void(*)(int)重命名为pfun_t
typedef void(*pfun_t)(int);
pfun_t signal(int, pfun_t);
signal 与后面的括号结合,是函数名
( int , void(*)(int) ) 是两个参数类型
以上代码是一次函数声明 ,signal函数的第一个参数的类型是int,第二个参数类型是函数指针,该指针指向的是一个参数类型为int,返回值为空的函数,signal函数的返回类型也是一个指针函数,该函数指针也指向的是一个参数类型为int,返回值为空的函数
使用函数指针简化代码:
当功能近似的函数中有较多相同的代码时,可以用函数指针来简化代码
void calc( int(*pf) (int, int) )
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void menu()
{printf("*****************\n");printf("***1.sum 2.sub***\n");printf("***3.mul 4.div***\n");printf("*****0.退出*****\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;
}
//计算
void calc(int(*pf)(int, int))
{int x = 0;int y = 0;int ret = 0;printf("输入两个操作数:");scanf("%d%d", &x, &y);ret = pf(x, y);printf("%d\n", ret);
}
int main()
{int input = 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");break;}} while (input);return 0;
}
上述代码使用了回调函数,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
C语言进阶——函数指针相关推荐
- c语言中将函数指针作为形参_在C中将有效指针作为NULL指针
c语言中将函数指针作为形参 Prerequisite: An Example of Null pointer in C 先决条件: C中的空指针示例 Any pointer that contains ...
- c语言函数指针封装函数,C语言之函数指针、回调函数的使用
一.背景 首先看下如下代码,这个定义是放在头文件的,在程序中tCdrvCallbackFkt也定义了另一个变量,而且括号后面还跟定义了几个变量,不理解这个定义. typedef void (PUBLI ...
- C语言:函数指针与指针函数
文章目录 C语言:函数指针与指针函数 一.概念 二.创建形式 2.1 普通函数创建形式: 2.2 指针函数创建形式: 2.3 函数指针创建形式: 三.使用例子 3.1 指针函数返回字符串 3.2 函数 ...
- c语言visit函数指针,C++中的函数指针总结
1.函数指针的引出 假设我们需要写个函数 sort( start, end, compare ); 对start 和end 之间的数组元素进行排序compare 定义了比较数组中两个字符串的比较操作. ...
- C语言_函数指针高级用法
什么是函数指针? 函数是计算机程序中一段可执行代码的封装,当程序运行时函数会被加载到内存布局中的代码段位置,这段代码会有一段内存空间,有内存空间就会有地址,这段内存空间的首地址,就是函数的地址 每当我 ...
- C语言用函数指针实现数组排序
最近看C语言有点烦,无论是自学的数据结构还是学校的指针课程,看着头都大了. 学校在PTA安排了此题,提交了多次总是报错,今天重新整理一遍且不按题目编程提示来写,提交终于正确. (其实是最后一个数字不能 ...
- c语言 万能函数指针,C/C++编程笔记:C语言精华解析之void *指针,指针中的万能指针...
什么是万能指针? 万能指针其实就是void *类型的指针,而void *指针一般被称为通用指针或叫泛指针.它是C语言关于纯粹地址的一种约定.当某个指针是void型指针时,所指向的对象不属于任何类型. ...
- 【C语言】函数指针(指向函数的指针)
文章目录 1. 函数指针的定义 2. 函数指针的定义形式 2.1 一般定义方法 2.2 加上typedef关键字的定义 3.利用函数指针调用其所指向的函数 3.1 情况1:一般调用 3.2 情况2:函 ...
- C语言中函数指针的主要应用场景
一个人C语言功底强不强,不是看他写的代码注释够不够全,代码逻辑够不够清晰,看下他对函数指针的理解和使用就可以了.我曾经被一家公司面试两次,两次面试的内容都有对函数指针的使用理解.函数指针的概念上很简单 ...
最新文章
- Winform程序只允许应用单开
- 来一场说聊就聊的压测分享
- crt查看开机日志_电脑开机要几分钟?这几个关键的设置你肯定没有做好
- matlab 读取csv_利用Pytorch进行数据加载1--CSV文件的读取和显示
- 【Java】ArrayList 列表的泛型
- Gentoo 安装日记 02 (建立并启动虚拟机)
- 帆软参数面板根据选择项type显示和隐藏参数项(或${if()}在SQL中的用法)根据条件动态显示参数控件
- 第四课曲面与曲线方程
- Mongodb 可视化工具 mongochef
- 汤晓鸥教授的一篇很有意思的文章
- Uncaught TypeError: Illegal invocation
- Sentinel流量防控卫兵
- js递归生成树结构数据
- html 设置图片左对齐,CSS设置图片的对齐
- 玩游戏计算机虚拟内存怎么设置,玩游戏时提示虚拟内存太小怎么办
- 脸部转正!GAN能否让侧颜杀手、小猪佩奇真容无处遁形?
- vue影院在线选座--可拖拽、缩放--A/B/C三级座位
- SDN控制器关键性能指标及测试方法—Vecloud
- 随心听出高质量 百度音乐更新支撑电台
- android自定义button样式【转】