void (*f(int, void (*)(int)))(int) 函数解析

手把手教你构建轻量级CLIP模型:从理论到实践 本文手把手教你从零构建一个轻量级CLIP模型,深入解析其核心原理——对比学习,并提供完整的代码实践。通过精简的模型架构、数据准备和训练循环实现,帮助读者彻底理解多模态模型如何让图像与文本在共享空间中对齐,为学习更复杂的AI模型打下坚实基础。 阅读详情

函数指针

今天与几个同学看到了一个函数指针定义:

void (*f(int, void (*)(int)))(int)

以前在C trap pit fails里面见过,但是文章里面介绍的很详细,但是往往使初学者抓不到重点, 结果弄的一头污水。这里就简单介绍一下这中函数指针的定义方法。

什么是函数指针?

这个问题从定义的角度来看很好理解,指向函数的指针就是函数指针,但是我们如何声明一个函数指针呢?又如何将一个地址强制转换为某一个类型的函数指针呢?这里看下面一个例子源码:

void function(int a)

{

      a = 5;

}

void (*pfunc)(int);

很简单,上面这段代码声明了一个函数fucntion和一个函数指针pfunc, 它指向的函数就是一个具有void返回值,int参数的函数。如果将function函数的地址给pfunc指针,可以简单的通过下面两种赋值:

       pfunc = function;

或者

       pfunc = &function;

通过指针调用该函数,也有两种方法:

       pfunc(5); 或 (*pfunc)(5);

我们看一下赋值语句,pfunc = function; 但有时候可能是一个常数0x8999940, 它恰好也表示一个安全的与function相同的函数,如何将这个数值赋给pfunc呢?显然我们需要强制类型转换,应该将该常数转换成什么类型呢?这就是问题的关键!

       在void (*pfunc)(int)语句里面,只有pfunc是变量名称,那么剩余的部分,void(*)(int),就是我们需要的转换类型。因此,新的赋值语句是:

                     pfunc = (void (*)(int)) 0x8999940;

       赋值完成后,就可以通过pfunc(5); 或 (*pfunc)(5);调用相应的函数了。

       如果理解了上面的内容,我们就可以解释void (*signal(int, void (*)(int)))(int)这个相对复杂的问题了

返回函数指针的函数声名

现在我们先抛开上面那个复杂的定义,先看一下下面的需求1) 定义一个函数;2) 该函数具有以下特点,两个参数,返回值是函数指针,并且一个参数也是函数指针。假如返回值和参数函数指针同为void (*)(int); 另一个函数参数是int型。该函数定义名称为my_func。

根据需求我们可以很容易定义出这种函数:

typedef void (*HANDLER)(int); //参数函数和返回函数定义

HANDLER my_func(int, HANDLER);

突然需求中又不让使用typedef,这就是早期C语言不支持typedef的情况,那么如何定义这种函数呢?

我们假如说my_func的返回值是int,是不是它的定义可以这么写:

int my_func(int, void (*)(int));

       也就是说,my_func(int, void (*)(int))就是一个int型数据。现在将int换成一个函数,也就是

              void (*)(int) my_func)(int, void (*)(int);

       这样一种定义,显然这种语法不支持,那么,实际是如何表示呢?回过头来,我们先看看函数指针的声明格式

       void (*pfunc)(int);

       其中pfunc 等价于 void (*)(int)。现在在看看上面的格式,是不是很相识,对了,pfunc就是my_func(int, void (*)(int))。现在如果将两者代替一下是不是就成了这种格式:

              void (*my_func(int, void(*)(int)))(int)

如果将my_func换成signal,是不是就是我们文章开始提到的那个复杂声名?现在是不是明白了,原来如此啊,它是一个返回函数指针的的函数声名!

强化学习从基础到进阶-常见问题和面试必知必答[7]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解 阅读详情

相关推荐

Codex接入CCSwitch:本地代理与模型路由配置指南

在AI编程工具链中,本地代理与模型路由是连接智能体与模型服务的核心桥梁。Codex作为OpenAI推出的编程智能体,虽然具备强大的仓库理解和自主编码能力,但其默认模型链路固定,导致在多模型切换、内网统一管理及成本控制上存在天然瓶颈。CCSwitch正是为解决这一痛点而生的本地代理工具,它通过OpenAI兼容协议将Codex的请求透明转发至DeepSeek、通义千问等第三方模型服务,使模型切换如同点击按钮般简单。本文从本地代理和模型路由器的基础原理切入,系统讲解Codex与CCSwitch的安装配置、模型ID

weixin_33910460的博客 427

C语言之解析

概述    C语言像一把雕刻刀,锋利,并且在技师手中非常有用。和任何锋利的工具一样,C会伤到那些不能掌握它的人。本文介绍C语言伤害粗心的人的方法,以及如何避免伤害。 [1]0 简介     C语言及其典型实现被设计为能被专家们容易地使用。这门语言简洁并附有表达力。但有一些限制可以保护那些浮躁的人。一个浮躁的人可以从这些条款中获得一些帮助。     在本文中,我们将会看一看这些未可知的益

网络空间安全与企业信息化 3562

torch.jit.script 与 torch.jit.trace

它们是 PyTorch 的即时编译(Just-in-Time Compilation)模块的一部分,用于提高模型的执行效率并支持模型的部署。方法只跟踪了给定输入张量的执行路径,因此在使用转换后的模块对象进行推理时,输入张量的维度和数据类型必须与跟踪时使用的相同。跟踪模型可以看作是一个具有相同功能的脚本模型,但它还保留了原始模型的动态特性,可以使用更多高级特性,如动态图和控制流。它接受一个模型和一个示例输入,并记录模型在给定输入上的执行过程,然后返回一个跟踪模型。的模型文件,并将其转换为评估模式。

leoatliang的博客 1万+

C++中typedef void (*func)的理解 以及 函数地址的概念

首先明确,这是一个函数指针!本质是:指针! 1、指针函数 先将简单的,下列例子是一个指针函数(即:这个函数返回一个指针类型),这里只给一个例子,学过指针的都应该很容易理解。 int *fun(); int *p; p = fun(); 2、函数指针 这就是标题所示的知识点,它是一个指针,指针,指针!一个可以调用多种函数的指针。来看一个例子: //这里有两个函数 void apple(vo...

wch0lalala的博客 4359

Spring Cloud 整合(一) CRUD

Springcloud 整合之 CRUDSpringcloud介绍功能概述为什么要选用Springcloud Springcloud介绍 功能概述 实现微服务 Spring Cloud为开发人员提供了工具,以快速构建分布式系统中的某些常见模式(例如,配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布式会话,群集状态)。分布式系统的协调导致样板式样,并且使用Spring Cloud开发人员可以快速站起来实现这些样板的服务和应用程序。 为什么要选用Springcloud

Kerwin-Lin的博客 1501

高动态范围结构光三维测量技术:从多曝光融合到深度学习的演进与应用

本文深入探讨了高动态范围结构光三维测量技术的演进与应用,从传统的多曝光融合技术到深度学习驱动的创新方案。通过工业案例展示了该技术在提升测量精度和效率方面的显著优势,特别是在处理高反光、复杂表面时的突破性表现。文章还提供了针对不同工业场景的技术选型指南,帮助工程师优化三维测量解决方案。

weixin_29063979的博客 293

进阶typedef用法

1、在编程中使用typedef目的一般有两个 一个是给变量起一个容易记住且有意义明确的别名 另一个是简化一些比较复杂的类型声明 int (*ptr)[3]; 数组指针(先是指针,再是数组) typedef int (*PTR_TO_ARRAY)[3]; 栗子1: #include<stdio.h> #include<stdlib.h> typedef int (*PTR_TO_ARRAY)[3]; int main() { int array[3] = {1

m0_53630259的博客 416

对E-R模型向关系模式转换的认识

一:基本E-R图的转换 1     属性处理 派生属性:直接忽略。 复合属性:展平技术。 多值属性:单独建立一个关系表,关系名就是多值属性名,如果是实体集的多值属性,关系的属性就是实体集的码加上多值属性,如果是联系集的多值属性,关系的属性就是各个实体集的码加上多值属性,关系的码要具体情况具体分析。 2     基本E-R图转换为关系模式 强实体集:一个关系,关系名就是强实体集名,关系属

优快云_LYY的专栏 2731

type void func(int)

#include #include #include "Serial.h" using namespace std; typedef void func(int); //定义一个新类型 func,该类型的变量是一个带有一个int型参数,没有返回值的函数 void p2(int i) { printf(" i = %d\n", i); } int main() { p2(10);

lingtianyulong的专栏 897

企业数字化转型解决方案架构设计:一个五维全景视角

本文系统探讨了企业数字化转型的架构设计框架,提出五维协同模型:企业架构作为战略罗盘,业务架构聚焦价值创造,应用架构实现能力载体,数据架构提供智能燃料,技术架构奠定基础支撑。文章深入分析了各架构域的核心要素、设计原则及相互关系,并指出数字化转型需通过渐进路径,结合战略引领、技术赋能和组织变革,构建有机统一的架构体系。该框架为企业应对数字化复杂性提供了系统性方法论,强调从整体视角实现技术与业务的深度融合。

金牌架构师 1256

S7-1200中OB100和OB20中断使用方法及示例程序说明(图文)

S7-1200中OB100和OB20中断使用方法及示例程序说明(图文)

Robot_PLC_HMI_Automation 8584

typedef void (*Fun) (void) 的理解——函数指针——typedef函数指针

typedef void (*Fun) (void) 的理解——函数指针——typedef函数指针

qq_33973712的博客 600

RK3399平台开发系列讲解(外设篇)交换芯片RTL8306M

网络:交换芯片RTL8306M 电路: make menuconfig 配置: 目录:arch/arm64/configs/rk3399_b201_defconfig CONFIG_FIXED_PHY=y 设备树: arch/arm64/boot/dts/rockchip/rk3399-b201-rev1.dts 时钟: Open之后首先校验网卡mac地址是否正确(stmmac_chec...

内核笔记 2390

void (*f(int, void (*)(int)))(int) 函数解析 转

今天与几个同学看到了一个函数指针定义: void (*f(int, void (*)(int)))(int) 以前在C trap pit fails里面见过,但是文章里面介绍的很详细,但是往往使初学者抓不到重点, 结果弄的一头污水。这里就简单介绍一下这中函数指针的定义方法。 什么是函数指针? 这个问题从定义的角度来看很好理解,指向函数的指针就是函数指针,但...

weixin_30360497的博客 200

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

void (*f(int, void (*)(int)))(int) 函数解析 转

函数指针 今天与几个同学看到了一个函数指针定义: void (*f(int, void (*)(int)))(int) 以前在C trap pit fails里面见过,但是文章里面介绍的很详细,但是往往使初学者抓不到重点, 结果弄的一头污水。这里就简单介绍一下这中函数指针的定义方法。 什么是函数指针? 这个问题从定义的角度来看很好理解,指向函数的指针就是函数...

weixin_30527323的博客 160

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

void (*f(int, void (*)(int)))(int)

void (*f(int, void (*)(int)))(int) 函数解析   函数指针   一个函数指针定义:   void (*f(int, void (*)(int)))(int)   以前在C trap pit fails里面见过,但是文章里面介绍的很详细,但是往往使初学者抓不到重点, 结果弄的一头污水。这里就简单介绍一下这中函数指针的定义方法。   什么是函

1135

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

关于void (* signal(int, void(*)(int) ) )(int);的学习与理解

从以上三个实例不难看出,语法希望我们将函数指针类型后面的东西(不论是作为1.函数的返回类型 2.数组的储存内容 3.函数指针所指向函数的返回类型 这三种情况的时候,语法规定不会把这个函数指针类型单独的放在最前面,就像 void (*)(int) my_func(int, void (*)(int);而是把后面的内容: my_func(int, void (*)(int)放在前面*的后面,从而变成void (*my_func(int, void(*)(int)))(int))

2301_79501467的博客 261

int **p 、int (*p)() 、 int (*p)[5] 和int (**p)()

int **ptr 与 int ptr[4][4] 的区别??? *(*(ptr+1)+2);相当于ptr[1][2]; **p可以理解成*((*p+0)+0);相当于ptr[0][0];   区别在于:int **ptr定义了一个指针(具体的,二级指针),它使得编译程序使程序在运行时分配一点点内存用来存放这个指针——某个数值,它标明了内存中的某个位置; 而int ptr[4][4]定

loverz的专栏 8531

typedef int (*init_fnc_t)(void) 如何理解

最近在看uboot启动流程源码中看到了这一个用法,特此记录学习。 截取u-boot部分代码出来如下: typedef int (*init_fnc_t)(void); static init_fnc_t init_sequence_f[] = { setup_ram_buf, setup_mon_len, initf_console_record } typedef...

浪迹天涯的博客 2391
上一篇: 进程和线程
下一篇: _C_#ifdef
LinuxJoey
博客等级 码龄15年 117粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值