C语言基础及指针④函数指针

C语言函数指针详解 C语言函数指针 一、什么是函数指针 1.理解函数指针 ​ 函数指针,首先根据他的名称我们就大概可以了解到他是一个指针,是什么样的指针呢?是和函数有关的一种特殊的指针。 ​ 我们知道 int*p 是指向int型变量的指针,char*p是指向char型变量的指针,那么不难理解,函数指针就是一个指向函数的指针。 int arr[10]={0}; int *p = arr; ​ 我们知道,在数组中数组名就是首元素的地址。 ​ 那么试着猜猜看,函数的地址是什么样的情况呢。 ​ 我们不妨打印一下看看结果是什 阅读详情

接续上篇C语言基础及指针③函数与二级指针

在上一篇中 , 我们学习了函数与二级指针 , 函数和java中的方法类似 , 只是缺少了访问控制符 , 二级指针也就是指针的指针 , 指针里面存储的是指针的地址 , 可以通过*操作符不断往上追溯 , 然后通过内存地址操作内存空间 。

函数指针

当我们定义一个函数的时候 , 这个函数也会像变量一样 , 会有一个内存地址 , 我们也可以将函数定义成为一个函数指针 , 但函数不同于变量 , 变量存储的是固定的值 , 而函数指针存储的是函数的内存地址 。下面我就用一个示例来说明:

// windows 弹出框头文件
#include <Windows.h>

/*函数*/
void message() {
    MessageBox(NULL, "我是弹出框", "消息", NULL);
}

void main() {

    // 函数指针定义 , 返回值(函数指针名称)(函数参数) = 函数名称
    void(*func_p)() = &message;

    // 调用函数指针
    func_p();

    printf("函数指针地址:%#x\n", func_p);

      getchar();
}

输出:

函数指针地址:0xe6d31073

我们可以通过函数指针地址 , 反汇编我们的程序员 , 查看他的跳转

函数指针汇编1.png

 

由上图我们可以看出 , 我们的函数指针 , 通过jmp指令跳转到另一个地址上 , 下面我来看看message的地址里面是什么:

函数指针汇编2.png

 

我们看到通过函数指针里面存储的是一个函数的地址 ,然后通过一个jmp指令调到我们的函数定义执行 。

有了我们的函数指针 , 我们可以做很多事情 , 下面我们来看一个简单的示例:

  
int add(int num1, int num2) {
    
    return num1 + num2;
}

int minus(int num1, int num2) {
    
    return num1 - num2;
}

// 将函数指针直接定义到函数形参中 , 类似java中的多态
// 我们可以函数指针作为函数参数传入
void showMsg(int(*c)(int num1, int num2), int a, int b) {
        int r = c(a, b);
        printf("计算完成=%d\n", r);
}

void main() {

    showMsg(add, 10, 10);

    showMsg(minus, 30, 2);
}

getchar();


输出:

计算完成=20
计算完成=28

通过传入函数地址 , 就可以调用函数进行运算 , 我们只要按照传入的参数和返回值 , 写我们自己的函数 , 通过这个方法 , 我们就可以统一的实现我们函数的功能 。下面我们来写一个回调函数:

/*模拟网络请求回调*/
void requestNet(char* url , void(*callBack)(char *)) {
    printf("请求地址:%s , 正在请求网络....\n",url);
    // 模拟网络请求耗时
    Sleep(2000);
    char* str = "我是请求的网络数据 , 落花有意随流水 , 流水无情恋落花\n";
    callBack(str);
}

/*回调函数*/
void netCallBack(char *str) {
    printf("网络请求回调\n");
    printf("请求到的数据:%s" ,str);
}

void main() {
    char* url = "www.zhuyongit.com";
    requestNet(url, netCallBack);
}

输出:

请求地址:www.zhuyongit.com , 正在请求网络....
网络请求回调
请求到的数据:我是请求的网络数据 , 落花有意随流水 , 流水无情恋落花

我们模拟了网络请求的常见封装 , 使用一个回调函数来接收我们请求回来的数据 。函数指针很强大 , 我们可以直接传入函数名称 , 再另一个函数里面执行我们传入的函数 , 如果是在java里面 ,我还需要传入一个对象 , 再通过对象来调用方法 , 在C语言里面 , 直接通过函数指针就可以搞定 。



作者:逝我
链接:https://www.jianshu.com/p/181b50e02c89
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

单片机c语言绝对地址跳转(使用函数指针) 文章简单介绍了单片机c语言绝对地址跳转 立即下载

相关推荐

世界模型和大语言模型结合开发自动驾驶算法

摘要:自动驾驶系统开发中,融合世界模型和大语言模型可显著提升效率和安全性。世界模型负责环境感知与预测(如目标检测、轨迹预测),而大语言模型优化代码生成、决策解释等环节。实施路径包括需求分析(1-2周)、模型开发(2-4个月)、模拟测试(1-2个月)、实车测试(2-3个月)和合规优化(1-2个月),总周期6-12个月。关键技术工具包括PyTorch/TensorFlow、CARLA模拟器和ROS系统,核心设计理念强调模块化、安全优先和敏捷迭代。示例代码展示了YOLO目标检测与大语言模型决策建议的集成方案。该方

ponygame的博客 826

C语言 指针函数

函数的局部变量用作返回值时,会生成一个局部变量的拷贝用作返回值,之后局部变量会被系统回收, 函数不能返回局部变量的地址,因为如果返回局部变量的地址,系统回收后,指针指向的内容就无意义了,但是对于静态变量也可以返回其指针。返回值:全局变量的地址 / static 变量的地址 / 字符串常量的地址。指针函数是指一个函数的返回值 为地址量的函数。<数据类型> * <函数名称 > (<参数说明>){为什么不能返回局部指针变量,却可以返回局部变量?

qq_47638391的博客 210

KEIL5编译报错L6200E:__stdout重定义问题分析与解决

本文深入分析KEIL5编译报错L6200E中__stdout重定义问题的根源,指出因未完整定义__stderr导致与标准库stdio_streams.o冲突。提供完整重定义标准流、启用MicroLIB库等解决方案,帮助开发者彻底解决Symbol multiply defined错误,提升嵌入式开发效率。

uran的专栏 954

2024年最全[Android]使用函数指针实现native层异步回调(1),字节跳动面试官工资

找工作是个很辛苦的事情,而且一般周期都比较长,有时候既看个人技术,也看运气。第一次找工作,最后的结果虽然不尽如人意,不过收获远比offer大。接下来就是针对自己的不足,好好努力了。最后为了节约大家的时间,我把我学习所用的资料和面试遇到的问题和答案都整理成了PDF文档“函数返回值类型”表示该指针变量可以指向具有什么返回值类型的函数;“函数参数列表”表示该指针变量可以指向具有什么参数列表的函数。这个参数列表中只需要写函数的参数类型即可。

2401_84545339的博客 1028

PX4/ArduPilot源码克隆提速秘籍:国内镜像与子模块优化全攻略

本文详细介绍了PX4/ArduPilot源码克隆的提速秘籍,包括使用国内镜像源和子模块优化技巧。通过阿木实验室、华为云等国内镜像,克隆速度可提升20倍,同时提供子模块替换和并行编译等实用方法,大幅提升开发效率。

weixin_29251567的博客 523

Comsol超声空化气泡仿真入门:从零搭建模型到网格划分的完整流程

本文详细介绍了使用Comsol进行超声空化气泡仿真的完整流程,从物理基础理解到模型搭建、网格划分及求解器设置。通过具体步骤和示例代码,帮助初学者和工程师快速掌握这一关键技术,应用于医疗设备和工业清洗等领域。

weixin_29289821的博客 161

Android 音视频入门之C入门序列(五)- 函数指针

指针类型有何用 指针也为内存地址,他在32系统中占用永远是 4个字节, 64位为8 所以用处就是在取值的时候系统知道怎么取,这就是类型规范的好处,因为是4个 固定,所双找下个只要知道偏移4就是下一个就可以 函数指针 函数本身就是指针,当我们定义了一个函数的时候他就有个内存地址,所以函数也可以当做参数传递,如下面例子 #include <stdio.h> // 先定义下面二个方法 void add (int num1, int num2) { printf("num1+num2 = %d\n",

qq_35651451的博客 2503

LabView实战:精准实现float到十六进制的转换与高低位拆分

本文详细讲解了在LabVIEW中实现单精度浮点数(float)到十六进制字符串转换,并进行高低16位拆分的实战方法。针对工业通信中设备协议要求,核心使用强制类型转换(Type Cast)获取内存原始数据,避免数值转换错误,并提供了完整的VI构建步骤、交叉验证技巧及常见踩坑经验(如字节序、字符串格式),确保数据通信的准确性。

assembly8low的博客 1765

IDA脚本笔记01

Author:ZERO-A-ONE Date:2019-10-29 0x01 读取和修改数据的函数 01 Byte long Byte(long addr) 从虚拟地址addr处读取一个字节值 02 Word long Word(long addr) 从虚拟地址addr处读取一个字(2字节)值 03 Dword long Dword(long addr) 从虚拟地址addr处读取一个双字(4字节)值 04 PatByte void PatchByte(long addr, long val) 设.

kelxLZ的博客 1219

运维系列【仅供参考】:微信版本过低 使用CheatEngine绕过

微信版本过低 使用CheatEngine绕过

weixin_54626591的博客 2133

【Python LeetCode 专题】面试经典 150 题

面试经典 150 题

一杯水果茶!足矣~ 1173

c语言函数用指针的指针的指针,C语言基础及指针④函数指针

在上一篇中 , 我们学习了函数与二级指针 , 函数和java中的方法类似 , 只是缺少了访问控制符 , 二级指针也就是指针的指针 , 指针里面存储的是指针的地址 , 可以通过*操作符不断往上追溯 , 然后通过内存地址操作内存空间 。函数指针当我们定义一个函数的时候 , 这个函数也会像变量一样 , 会有一个内存地址 , 我们也可以将函数定义成为一个函数指针 , 但函数不同于变量 , 变量存储的是固...

weixin_42362003的博客 140

SAP-ABAP:SAP数据库视图的创建图文详解

在“短文本”字段中输入视图的描述。在“表/视图”字段中输入要基于的表名。如果视图基于多个表,可以在这里输入主表。点击“表/视图字段”按钮,选择要包含在视图中的字段。如果视图基于多个表,点击“关系”按钮来定义表之间的连接条件。在弹出的窗口中,选择要连接的表,并定义连接条件(例如。

baidu_35680696的博客 973

详解C语言指针函数、函数指针、函数指针数组

在C语言中,指针是一个很重要但是又很容易弄错的概念,也可以说指针就是C语言的灵魂,所以说学好指针对于完全掌握C语言是一个必须的过程。而在指针中,指针函数、函数指针、指针函数数组、函数指针数组、指向函数指针数组的指针等等概念看着又绕又头疼。本问总结了一下以上一些概念以及用法,并给出例程深化理解。 1. 指针函数 指针函数就是返回指针值的函数,本质是一个函数。所以指针函数等价于“返回值为指针的函数...

一只大笨猫的博客 2万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【C语言】——指针四:字符指针与函数指针变量

对字符指针与函数指针有疑惑?快快看过来!

yusjushd的博客 1808

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C语言指针进阶之三——函数指针、函数指针数组、指向函数指针数组的指针

平常我们说这样一个类型比如:unsigned int这个类型,我们觉得每次书写都太长了很麻烦,那我们就可以进行类型重定义:那么下次我们书写的时候就可以使用uint来代替unsigned int,使得类型简化。同样的,对于指针类型也可以重定义,比如将int *重定义那么原来的:int * p1就可以改写为: ptr p1同理,也可以对我们的数组指针或者函数指针类型进行重定义,但是稍微不同的是,重定义的类型名要和*在一起。比如:这是一个数组指针类型:int (*)[10];如何进行类型重定义?

m0_71503225的博客 6625

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

(使用C语言详解)指针数组、数组指针、函数指针、函数指针的数组、指向函数指针数组的指针

本文主要讲解了C语言中的五种指针类型:指针数组、数组指针、函数指针、函数指针的数组以及指向函数指针数组的指针。这些指针类型在C语言编程中有着广泛的应用,掌握它们对于深入理解C语言以及进行高效的C语言编程都具有重要意义。指针数组是一种数组,其元素为指针;数组指针则是一个指向数组的指针,它可以指向数组的首地址,也可以指向数组的任一元素。函数指针则是指向函数的指针,通过它我们可以调用函数。函数指针的数组则是一个数组,其元素为函数指针;指向函数指针数组的指针则是一个指针,它指向函数指针数组。

StarPrayers.的博客 6325

【C语言 | 指针】函数指针详解

👉本文介绍C语言的函数指针,函数指针的定义、函数指针的使用、函数指针数组、函数指针数组的指针。

wkd_007的博客 3266

c语言-函数指针

本篇文章介绍c语言中的函数指针以及函数指针的应用。

pyc68的博客 3611

C语言基础:二级指针和函数指针

C语言基础:二级指针和函数指针

wy2458984254的博客 1848

C 语言 —— 函数指针

复习一下 C 语言的指针中的 函数指针 ...... 矜辰所致

不浮夸,不将就,认真对待学知识的我们 1375

C语言函数指针的使用、函数指针数组及使用、指向函数指针数组的指针,指针进阶版的冒泡排序等介绍

C语言函数指针的使用、函数指针数组及使用、指向函数指针数组的指针及使用,C语言库函数qsort、指针进阶版的冒泡排序等介绍C语言函数指针的使用、函数指针数组及使用、指向函数指针数组的指针及使用,C语言库函数qsort、指针进阶版的冒泡排序等介绍。

Farewell_me的博客 944

C语言基础:指针(函数指针与指针函数与二级指针)

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。简而言之,回调函数就是允许用户把需要调用的方法的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。函数指针本质上是指针,它是函数的指针(定义了一个指针变量,变量中存储了函数的地址)。在函数中不要直接返回一个局部变量的地址,因为函数调用完毕后,局部变量会被回收,使得返回的地址就不明确,此时返回的指针就是野指针。

weixin_51619876的博客 1348

C和C++的函数指针

这里int (MyClass::*member_func_ptr)(int)是类成员函数指针的声明,通过(obj.*member_func_ptr)(3)或者(ptr->*member_func_ptr)(3)的方式来调用成员函数。在这个例子中,func_ptr只能指向参数为int的print函数,不能直接指向参数为double的print函数。与类成员函数的结合(需要注意):在 C++ 中,普通函数指针不能直接指向类的成员函数,因为类成员函数有一个隐含的this指针。,这两种写法在 C 语言中是等价的。

wgf350357114的博客 1733
上一篇: Android开发者神器—Google移动开发平台Flutter发布
下一篇: C语言基础及指针⑤动态内存分配
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值