【面试题】如何实现类似于C语言中函数指针的功能

C语言常见面试题:什么是函数指针,函数指针的作用是什么? 在C语言中,函数同样有个地址,所以可以定义一个指针来指向一个函数,称为函数指针。函数指针为C语言提供了灵活性和动态性,可以用于实现回调函数、动态函数调用、函数表等多种应用场景。函数指针是指向函数的指针变量,其本质是指向代码块的指针。每个函数在编译时都会有一个唯一的入口地址,这个地址就是函数指针所指向的地址。在C和C++等编程语言中,函数指针通常是指向特定函数类型的指针,即函数原型和返回类型都一致的函数。函数指针名后的括号中的内容表示函数的参数列表,括号内的内容表示函数的返回类型。函数,并输出了结果。 阅读详情

在C语言中,有一个非常重要的概念——函数指针,其最重要的功能是实现回调函数。什么是回调函数呢?所谓回调函数,就是指函数先在某处注册,而它将在稍后某个需要的时候被调用。在Windows系统中,开发人员想让系统动态链接库(Dynamic Link Library,DLL)调用自己编写的一个方法,于是利用DLL当中回调函数的接口来编写程序,通过传递一个函数的指针来被调用,这个过程就称为回调。回调函数一般用于截获消息、获取系统信息或处理异步事件。

函数指针一般作为函数的参数来使用,开发人员在使用时可以根据自己的需求传递自定义的函数来实现指定的功能,例如,在实现排序算法时,可以通过传递一个函数指针来决定两个数的先后顺序,从而最终决定该算法是按升序还是降序排列。

在Java语言中没有指针的概念,那么如何才能在Java语言中实现类似于函数指针的功能呢?可以利用接口与类来实现同样的效果。具体而言,应先定义一个接口,然后在接口中声明要调用的方法,接着实现这个接口,最后把这个实现类的一个对象作为参数传递给调用程序,调用程序通过这个参数来调用指定的函数,从而实现回调函数的功能,示例如下:

//接口中定义了一个用来比较大小的方法
interface IntCompare{
    public int cmp(int a,int b);
}
class Cmpl implements IntCompare{
    public int cmp(int a,int b){
        if(a>b) return 1;
        else if(a<b) return -1;
        else return 0;
    }
}
class Cmp2 implements IntCompare{
    public int cmp(int a,int b){
        if(a>b) return -1;
        else if(a<b) return 1;
        else return 0;
    }
}
public class Test{
    public static void insertSort(int[] a,IntCompare cmp){
        if(a !=null){
            for(int i=1;i<a.length;i++){
                int temp = a[i],j=i;
                if(cmp.cmp(a[j-1],temp)==1){
                    while(j>=1&&cmp.cmp(a[j-1],temp)==1){
                        a[j]=a[j-1];
                        j--;
                    }
                }
                a[j]=temp;
            }
        }
    }
    public static void main(String[] args){
        int[] array1={7,3,19,40,4,7,1};
        insertSort(array1,new Cmp1());
        System.out.print("升序排列:");
        for(int i=0;i<array1.length;i++)
            System.out.print(array1[i]+"");
        System.out.println();
        int[] array2={7,3,19,40,4,7,1};
        insertSort(array,new Cmp2());
        System.out.print("降序排列:");
        for(int i=0;i<array2.length;i++)
            System.out.print(array2[i]+"");
    }
}

/*
程序运行结果为:
升序排列:1 3 4 7 7 19 40
降序排列:40 19 7 7 4 3 1
*/

上例定义了一个用来比较大小的接口IntCompare,这个接口实际上充当了C语言中函数指针的功能,在使用时,开发人员可以根据实际需求传入自定义的类。在上例中分别有两个类Cmp1和Cmp2都实现了这个接口,分别用来在实现升序排序和降序排序时使用。其实这也是策略设计模式所用到的思想。

2024年C语言最新经典面试题汇总(1-10) 在上面的示例中,声明了一个函数指针变量funcPtr,它可以指向返回类型为int、参数类型为int和int的函数。当n等于0或1时,满足基本情况,递归结束,函数返回1。否则,函数通过调用自身来计算n-1的阶乘,并将结果与n相乘,最终得到n的阶乘。需要注意的是,在使用递归时,必须确保递归调用最终会遇到基本情况,否则递归将进入无限循环,导致堆栈溢出。在C语言中,递归函数是一种非常有用的编程技巧,它可以将一个大问题分解成一个或多个相同类型的子问题,然后通过不断调用自身来解决这些子问题,最终得到问题的解。 阅读详情

相关推荐

C语言常见面试题

堆在内存中的管理由程序员自行管理,使用完毕后必须手动释放,否则会导致内存泄漏,堆的空间容量相对较大,可以动态扩展空间,访问堆需要通过指针间接访问,响应速度相对较慢。扩展:函数调用开销在C++中可以用内联函数规避,内联函数是在编译阶段进行函数体替换,但缺点是函数体内必须简洁,不能使用循环以及开关语句。栈在数据结构中分为顺序栈与链式栈,为顺序存储结构,存储数据要求先进后出,堆在数据结构中主要使用二叉树实现,分为大顶堆与小顶堆。//常量指针,不能通过指针p去修改变量a的值,但可以改变p的指向。

weixin_39158976的博客 1008

C语言指针相关——经典面试题

C语言指针相关——经典面试题,指针类型决定+-1的步长; 两个指针相减得到的是中间元素的个数;

m0_60416282的博客 1203

面试题:如果用C语言实现C++多态要怎么实现

在面向对象编程中,多态意味着同一个函数或方法可以对不同的对象表现出不同的行为。这一特性使得程序更加灵活,能够在运行时根据对象的类型来决定调用哪个方法。在C++中,多态通常通过虚函数(

CppPlayer 643

【C/C++】面试题:函数指针

前几天,一哥们在简历中声称自己“精通”C/C++。 我用了两个小问题让他知难而退了: 问题1:定义了一个类,类中有一个函数,想把这个函数赋值给一个函数指针应该注意什么? 他的回答是:函数指针应该加类域。正确 接下来再问,如果要赋值给一个没有类域的指针,应该怎么办? 他说:不能那样赋值,编译器会报错。 继续问:没有办法骗过编译器进行赋值吗? 他没回答上来。 虽然他最终没答上来

Data spark in Pypot 2109

C语言面试必须会的问题

C语言面试必须会的问题

从零复刻平衡小车(基于STM32F1)

平衡小车(基于STM32F1)

Legendyyy的博客 5040

C语言高频面试题——指针函数和函数指针的区别

是两个容易混淆的概念,但它们的功能和用途完全不同。以下是详细的对比分析,帮助你彻底理解它们的区别。

weixin_45252056的博客 1006

硬件学习笔记(器件篇)—— 磁珠与磁环

因为有这些差别,所有经常会让人们觉得他们并不是一类器件,但实际上他们的原理是一样的。我们使用磁珠是为了利用损耗消耗高频能量,所以如果我们理解了磁珠是如何消耗高频能量的,我们就能理解磁珠的工作原理。

y_u_yu_yu_的博客 1万+

C语言指针经典面试题

指针面试题

lim6ere的博客 468

USB2.0物理层实战:手把手教你用示波器抓取D+/D-信号(附波形分析)

本文是一份针对硬件工程师的USB2.0物理层信号调试实战指南。文章详细讲解了如何使用示波器捕获和分析D+/D-差分信号,从基础设置、核心信号状态解读,到信号完整性分析与常见问题排查,手把手教你定位USB通信故障。内容涵盖USB2.0协议物理层关键概念,并附有基础解码思路,旨在提升工程师的底层调试能力。

s8t9u0v1w的博客 449

GEO优化实战:用AnswerBit量化AI搜索可见度与品牌监控体系

生成式引擎优化(GEO)正取代传统SEO,成为品牌在AI搜索生态中获取可见度的关键。当用户习惯从“翻列表”转向“直接问AI”,品牌能否被生成式引擎识别、引用并正向推荐,直接决定了其在用户决策链条中的存在感。AI搜索可见度因此从模糊概念演变为可度量的运营指标,涵盖提及率、引文率、情感分与回源质量等维度。腾讯AnswerBit作为答案侧分析工具,帮助运营者拆解AI回复中的品牌语境与引用来源,让优化动作有据可循。从内容结构化改造、品牌实体建设到第三方权威背书,GEO要求团队建立“度量-优化-再度量”的闭环。文章结

weixin_31100517的博客 150

C语言 ---- 指针函数与函数指针

概述 指针函数和函数指针是C语言里两个比较绕的概念。但是不仅面试题爱考,实际应用中也比较广泛。很多人因为搞不清这两个概念,干脆就避而远之,我刚接触C语言的时候对这两个概念也比较模糊,特别是当指针函数、函数指针、函数指针变量、函数指针数组放在一块的时候,能把强迫症的人活活逼疯。 其实如果理解了这些概念的本质,是不需要死记硬背的,理解起来也比较容易。 指针函数 指针函数: 顾名思义,它的本质是一个函数,不过它的返回值是一个指针。其声明的形式如下所示: ret *func(args, ...); 其中,func

qq_41877840的博客 4810

ROS-订阅与处理激光雷达scan话题

激光雷达通常有四个性能衡量指标:测距分辨率、扫描频率(有时也用扫描周期)、角度分辨率及可视范围。测距分辨率衡量在一个给定的距离下测距的精确程度,通常与距离真实值相差在5-20mm;扫描频率衡量激光雷达完成一次完整扫描的快慢,通常在10Hz及以上;角度分辨率直接决定激光雷达一次完整扫描能返回多少个样本点;可视范围指激光雷达完整扫描的广角,可视范围之外即为盲区。

weixin_42438635的博客 4477

指针函数和函数指针

概述 指针函数和函数指针是C语言里两个比较绕的概念。但是不仅面试题爱考,实际应用中也比较广泛。很多人因为搞不清这两个概念,干脆就避而远之,我刚接触C语言的时候对这两个概念也比较模糊,特别是当指针函数、函数指针、函数指针变量、函数指针数组放在一块的时候,能把强迫症的人活活逼疯。 其实如果理解了这些概念的本质,是不需要死记硬背的,理解起来也比较容易。 指针函数 指针函数: 顾名思义,它的本质是一个函数...

禹鼎侯的博客 13万+

【WRF-Urban】使用 NUDAPT 数据集与 BEP/BEP_BEM 方案的 WRF 配置指南

【WRF-Urban】使用 NUDAPT 数据集与 BEP/BEP_BEM 方案的 WRF 配置指南

WW、forever的博客 1964

HyperLynx(十九)DDR(二)DDR的地址仿真

(5)设置水平标尺为2ns/div,垂直标尺为500mV/div,如果有必要,可以通过多次仿真,得到一个更加理想的结果。此外,还可以看到信号在高低电平切换时,反射波形基本趋于平缓,许多大的反射切换边缘已减小,这给了我们更大的定时裕量。如果这些DIMM是缓冲过的,则4个DIMM通道是可行的,但因为这是一个无缓冲DIMM,(20)在编辑传输线对话框中,选择“Values”选项卡,改变传输线长度为3in,具体设置如图所示,单击“确定”按钮。(17)为了增加电压摆幅,选择一个比原来的47Ω小的电阻。

小幽余生不加糖 4257

【C语言】C语言经典面试题详解

问题:什么是函数指针?如何使用?解答函数指针是指向函数的指针变量。通过函数指针,可以动态调用不同的函数。示例// 调用add函数关键点函数指针的类型必须与所指向函数的签名一致。函数指针可以用于回调函数、函数表等场景。问题:什么是宏定义?函数宏与普通函数有什么区别?解答宏定义是通过#define指令定义的文本替换规则。宏在预处理阶段被替换为定义的文本。函数宏是带有参数的宏,类似于函数调用,但在预处理阶段进行文本替换。示例// 预处理后替换为: int max = ((x) > (y)

Ape's IT Blog 1500

4.DJI-PSDK云台x-port控制:

使用PSDK 的“云台控制”功能,开发者需要先设计负载设备的云台并开发出控制云台的程序,将云台的控制函数注册到PSDK 指定的接口后,用户通过使用DJI Pilot、基于MSDK 开发的移动端App 及遥控器即可控制基于PSDK 开发的具有云台功能的负载设备,同时获得负载设备的相关信息,如姿态等。云台的姿态如 图2.云台姿态 所示,根据用户的控制指令,云台能够调整姿态;云台的关节如 图1.云台关节 所示,云台关节是云台上带动负载设备转动的结构件:云台电机,云台关节角即云台电机转动的角度。

哒宰的博客 856

C语言面试题每日一练(一)

C语言作为嵌入式Linux开发的必备工具,作为嵌入式Linux开发的基础语言,那么在面试嵌入式工程师时C语言定是面试中的重中之重 。作为一名开学就大三的老学长,不得不为找工作做必要准备。每天做一道C语言面试题,并且能够融会贯通。 2020.8.5 题目描述:        在未排序的数组中找到第k个最大元素。请注意,你需要找的是数组排序后的第k个最大的元素而不是第k个不同的元素。 示例 1: 输入:3 2 .

万里羊的博客 8968

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

c语言 指针

目录c语言 指针c语言 指针概念c语言 指针大小c语言 指针类型的意义 c语言 指针 c语言 指针概念 指针是个变量,存放内存单元的地址(编号)。 #include <stdio.h> int main() { int a = 10; // 在内存中开辟一块空间,存储10 int* p = &a; // 这里我们对变量a,取出它的地址,可以使用&操作符。 //将a的地址存放在p变量中,p就是一个之指针变量。 return 0; } c语言 指针大小 指针的大小在32位平

qq_43192537的博客 5318

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C语言常见面试题【备战春招秋招】

汇总近几年针对C语言软件开发岗,应届生常见面试题汇总,题目典型。不包含工作多年后的深度题目。包含一些常见关键字、内存管理、指针操作

少生孩子多写代码 8243

WINCC7.3破解文件

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

《C语言深度解剖》(11):函数指针、函数指针数组、指向函数指针数组的指针、回调函数

什么是函数指针?什么是函数指针数组?指向函数指针数组的指针是什么?回调函数是什么?回到函数的用法。

更新C/C++,数据结构与算法,计算机视觉,深度学习,目标检测 1004

指针的魔法世界:从字符指针到函数指针,解锁C语言的终极奥秘!

通过本篇博文,我们深入探讨了字符指针、数组指针、二维数组传参的本质、函数指针以及函数指针数组的使用。指针是C语言中非常强大的工具,理解指针的用法可以帮助我们编写更高效、更灵活的代码。希望本文的内容能够帮助你更好地理解指针的高级用法。

2201_76027234的博客 1812

【详解C语言指针】我真的让C指针给我唱征服了~乌拉

结合图解,深入探究指针,非常值得学习!

大猩猩!的博客 2万+

C:有关指针的经典笔试面试题

指针与数据类型 问题: a) 一个整型数(An integer) b)一个指向整型数的指针( A pointer to an integer) c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an intege)r d)一个有10个整型数的数组( An array of 10 integers) e) 一个有10个指针的数组,该指针是指向一个整型数的。(An array of 10 pointers to integers) f) 一个

诸葛一帆丶的博客 3739

《深入理解 C 语言指针(三):字符指针、函数指针与实战应用全解析》

本文系统解析了C语言中的高级指针技术,包括字符指针、数组指针和函数指针的核心概念与实战应用。通过对比字符指针的两种使用方式,剖析数组指针与指针数组的区别,并深入讲解二维数组传参的本质。文章还解读了复杂指针声明,演示了typedef简化技巧,最后通过计算器案例展示了函数指针数组(转移表)的优化实践,突出其消除冗余、高效执行的优势。这些技巧是提升C语言编程能力的关键所在。

月夜的风吹雨的博客 1247
上一篇: 【面试题】package有什么作用
下一篇: 【面试题】面向对象与面向过程的区别
红枫忆梦
博客等级 码龄8年 117粉丝 279原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值