关于C语言中的函数指针

单片机中函数指针的示例(C语言) 在C 语言中,指针变量除了能指向数据对象外,也可以指向函数。一个函数在编译时,分配了一个入口地址,这个地址就称为函数的指针,可以用一个指针变量指向函数的入口地址,然后通过该指针变量调用此函数。 定义指向函数的指针变量的一般形式: 类型说明符 (*指针变量名) (形参列表) 函数调用可以函数名调用,也可以通过函数指针调用。在使用函数指针调用前,需要把函数名赋值给和函数类型一致的指针,然后在使用指针就可以调用该函数。 下面是函数指针使用实列:示列使用一个无符号整型函数计算两个无符号整型数的相加值, 阅读详情

今年由于老美造成的金融危机,工作很不好找,嵌入式还相对好一点,毕竟要的人多,今天听正在找工作的师兄说:那些中心3、4楼学模拟的都在狂学C了。可见c语言关键时刻还是吃饭的家伙啊!所以更应该好好学了!

 

trio老师的名言:想学好C就得学好指针,想学好指针就得学好函数指针,呵呵,今天就着trio老师的讲义和网上的一些资料,把函数指针的一些概念,思想好好整理一下,如下:

 

●函数指针的声明:

函数指针即指向函数地址的指针。利用该指针可以知道函数在内存中的位置。因此也可

以利用函数指针调用函数。函数指针的声明方法是:

<类型> ( *函数指针变量名 )( 函数的参数列表 );

 

例:int (*pf)(int);

让我们来分析一下,左边圆括弧中的星号是函数指针声明的关键。另外两个元素是函数的返回类型(int)和由右边圆括弧中的入口参数(本例中参数int型)。注意本例中还没有创建指针变量-只是声明了变量类型。目前可以用这个变量类型来创建类型定义名及用sizeof表达式获得函数指针的大小。

 

●如何操作一个函数指针:

简单声明一个函数指针并不意味着它马上就可以使用。和其它指针一样,对函数指针执行间接访问之前必须把它初始化为指向某个函数

      int  f(int);
      int 
(*pf)(int)=&f;

第 2 个声明创建了函数指针 pf ,并把它初始化为指向函数 f 。 函数指针的初始化也可以通过一条赋值语句来完成。 在函数指针的初始化之前具有 f 的原型是很重要的,否则编译器就无法检查 f 的类型是否与 pf 所指向的类型一致。

      初始化表达式中的 & 操作符是可选的,因为函数名被使用时总是由编译器把它转换为函数指针。 & 操作符只是显式地说明了编译器隐式执行的任务。

 

●三种调用方法

ans=f(25);
      ans
=(*pf)(25);
      ans
=pf(25);
     
第 1 条语句简单地使用名字调用函数 f ,但它的执行过程可能和你想象的不太一样。 函数名 f 首先被转换为一个函数指针,该指针指

定函数在内存中的位置。然后, 函数调用操作符调用该函数,执行开始于这个地址的代码。
     
第 2 条语句对 pf 执行间接访问操作,它把函数指针转换为一个函数名。这个转换并不是真正需要的,因为编译器在执行函数调用操作符

之前又会把它转换回去。不过,这条语句的效果和第1条是完全一样的。
      
第 3 条语句和前两条的效果是一样的。间接访问并非必需,因为编译器需要的是一个函数指针。

 

●用途

你不会每天都使用函数指针,但是,它们确有用武之地,特别是多态、回调和多线程的实现。

我个人觉得多态的使用在linux开发下非常有用和常见。这里详细说一下多态

 

以下复制trio老师高级C语言编程部分内容:

利用函数指针实现多态是很多系统软件常用的方法, 比如在操作系统中为了能够支持不

同硬件设备的统一管理,往往会定义一个内部的数据结构,这个结构中定义了具体的硬件操

作函数的函数指针,当然针对不同的硬件设备,这些函数指针指向不同的操作函数。当上层

软件需要访问某个设备时,操作系统将根据这个数据结构调用不同的操作函数,这就使得虽

然底层的操作函数各不相同,但是上层的软件却可以统一。下面是2.4.18 版本的 Linux 内核中 file_operations 结构:

struct file_operations {struct module *owner;

loff_t (*llseek)(struct file *, loff_t, int);

ssize_t (*read)(struct file *, char *, size_t, loff_t *);

ssize_t (*write)(struct file *, const char *, size_t, loff_t *);

int (*readdir)(struct file *, void *, filldir_t);

unsigned int (*poll)(struct file *, struct poll_table_struct *);

int (*ioctl)(struct inode *, struct file *, unsigned int, unsigned long);

int (*mmap)(struct file *, struct vm_area_struct *);

int (*open)(struct inode *, struct file *);

int (*flush)(struct file *);

int (*release)(struct inode *, struct file *);

int (*fsync)(struct file *, struct dentry *, int datasync);

int (*fasync)(int, struct file *, int);

int (*lock)(struct file *, int, struct file_lock *);

ssize_t (*readv)(struct file *, const struct iovec *, unsigned long, loff_t *);

ssize_t (*writev)(struct file *, const struct iovec *, unsigned long, loff_t *);

ssize_t (*sendpage)(struct file *, struct page *, int, size_t, loff_t *, int);

unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long,

unsigned long, unsigned long);

#ifdef MAGIC_ROM_PTR

int (*romptr)(struct file *, struct vm_area_struct *);

#endif /* MAGIC_ROM_PTR */

};

这个结构的每一个成员的名字都对应着一个系统调用。 当用户进程利用系统调用对设备

文件进行诸如read/write操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程

序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数。这就是linux的设

备驱动程序工作的基本原理。因此,编写设备驱动程序的主要工作就是编写这些具体的子函

数,并赋给file_operations的各个域。

 

《高级C语言编程》——“可以说多态是函数指针最重要的一个应用之一, 我个人认为这也是程序员从初级编程进入高级编程阶段的一个重要里程碑。”

努力中!

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

相关推荐

C语言中的函数指针定义以及使用函数指针的示例

语言中,函数指针是一个指向函数的指针。这意味着你可以通过函数指针来调用函数,就像通过指针来访问数据一样。函数指针在需要动态地选择和执行函数时特别有用,例如在回调函数、函数表或动态链接库中。这个函数指针类型指向没有参数且返回类型为void的函数。定义两个函数,我们将通过函数指针来调用它们。使用while循环输出从10到0的数字。在这个例子中,我们首先定义了两个函数。使用printf函数输出两个数的和。头文件,它包含了标准输入输出函数(如。,并输出了相应的结果。在这个例程中,我们首先包含了。

2402_84885073的博客 1200

C语言——函数指针

1. 函数指针概念 1.1 函数指针的声明 类似变量在内存中会分配一个空间,函数在内存中也会分配一个空间,这个空间的入口(或者叫首地址)称为函数的地址。用整型指针可以保存整形变量的地址,同样地,用函数指针可以保存函数的地址。 我们回顾一下怎么定义一个整型指针: int *p_int; 由于整型变量只需要定义变量的类型即可完全规定这个变量的格式(个人理解,变量声明限定了变量的格式,变量定义规定了其内容)。但是对于一个函数来说(将函数也看成一种复杂的变量),函数的格式由哪些东西唯一确定呢?函数返回值

jay_zzs的博客 4503

C语言函数指针

函数指针本质上是一个指针变量,指向一个函数的入口地址。通过函数指针,我们可以间接地调用函数,而不必直接使用函数名。return_type:函数的返回类型。pointer_name:函数指针的名字。parameter_types:函数的参数类型。// 定义函数指针类型,指向返回int类型,参数为int的函数函数指针是C语言中非常重要的一种功能,它使得程序更具灵活性和可扩展性。通过函数指针,我们能够实现回调函数、事件处理、模块化编程等多种功能。

hzz812503533的博客 1429

C语言许·学习笔记

.1、在 C 语言中,sizeof() 是一个判断数据类型或者表达式长度的运算符。返回一个变量或者类型的大小(以字节为单位);例如:sizeof(int i);返回一个4,即为int类型的字节大小; char类型定义的变量大小为1个字节长度 short类型 为2个字节大小 int类型为4个字节大小 3、Typedefint INT32 Typedefstruct tag_ts ...

hu_sirs的博客 891

Auto.js实战:从解锁手机到自动阅读的全流程避坑指南(MIUI系统适配版)

本文详细介绍了Auto.js在MIUI系统下的自动化操作全流程优化指南,包括设备唤醒、应用启动、界面交互等关键环节的实战技巧。特别针对MIUI系统的变速检测机制和电源管理策略,提供了有效的避坑方案和性能优化建议,帮助开发者实现从解锁手机到自动阅读的稳定运行。

醉三国 246

手把手教你安装 Vivado2022.2(附安装包)

Vivado 2022.2版本与之前的版本相比,具有以下几个显著的优势:电源设计管理器(PDM):Vivado 2022.2引入了全新的电源设计管理器(PDM),这是一个下一代功耗评估平台,为Versal® 和 Kria™ SOM提供了准确一致的功耗估计能力。PDM是Versal产品家族的首选功耗评估工具,为Versal ACAP硬IP块提供增强向导,简化从XPE向PDM的迁移,帮助用户获得准确的功耗评估。

dpwkj的博客 2万+

unsigned int用法

注意使用unsigned int(无符号常数) 正如我们所知道的,编程语句都有很多的基本数据类型,如char,inf,float等等,而在C和C++中还有一个特殊的类型就是无符号数,它由unsigned修饰,如unsigned int等。大家有没想过,就是因为这些不同的类型,而使大家编写的看似非常正确的程序出现了预想不到的错误呢? 一、迷惑人的有符号下无符号数的比较操作 废话不多说,马上来看一下例子,让你先来体验一下这个奇妙的旅程,源代码文件名为unsigned.c,源代码如下: #include <

chenmi123321的博客 7万+

EVE-NG 新增 qcow2 镜像教程

本文介绍了如何在 EVE-NG 网络仿真平台中添加 QCOW2 镜像并配置 YML 文件。首先,用户需要了解 EVE-NG 的目录结构,上传并重命名 QCOW2 镜像,然后设置文件权限并刷新界面以识别设备。接着,讲解了 YML 文件的作用,它用于定义设备的CPU、内存、网卡等参数,并给出了配置示例。若有多个设备版本,可以通过复制并重命名 YML 文件使其独立显示。最后,通过检查 QEMU 进程和日志验证 YML 配置是否生效。总结部分强调了 EVE-NG 的自动识别机制以及独立管理设备版本的方式。

qq_41862216的博客 3075

函数指针与函数指针数组

函数指针数组又被称作转移表!函数指针数组并不是一种可以有可无的东西,确实是有自己使用的场景。

Z123ZQZZXVVB的博客 264

奥比中光Gemini335L SDK实战:从标定参数到3D点云转换

本文详细介绍了奥比中光Gemini 335L深度相机的SDK实战应用,重点讲解如何跳过繁琐的棋盘格标定,直接调用出厂预标定参数实现高效的3D点云转换。通过解析内参、外参获取及四种核心坐标转换模式,并结合OpenCV等工具,指导开发者快速将相机集成到机器人抓取、三维测量等项目中,实现开箱即用的3D视觉解决方案。

raspberrypi5的博客 639

HyperLynx(十五)多板仿真

在对话框的“Design file#1”下拉列表中选择“B00,Mainboard”,在其下方的“Reference designators”列表中选择元器件“J1”,然后在“Designfile#2”下拉列表中选择“BO1、RAM1”,在其下方的“Refer ence designators”列表中选择元器件“J1”,单击“Insert”按钮,为这两个元器件建立互连映射。在“Assign Models”对话框中,选择“B00 Motherboard”,将“U16.B12”设置为输出。

小幽余生不加糖 5060

【C语言进阶】⑥函数指针详解

一、函数指针 1.概念 函数指针:首先它是一个指针,一个指向函数的指针,在内存空间中存放的是函数的地址; 请看示例: int main(){ int a = 10; int*pa = &a; char ch = 'c'; char* pc = &ch; int arr[10] = {0}; int (*parr)[10] = &arr;//取出数组的地址 return 0; } 解析:parr是一个指向数组的指针,存放的是数组的地址; 所以: 数组指针 —存放数组地址的指针

森林里的白杨 6万+

在 SAP S/4HANA 分析模型中添加 Measures,Calculated、Restricted、Currency Conversion 与 Unit Conversion 的建模思路

摘要: SAP S/4HANA分析查询建模中,度量(measure)的加工层级是关键难点,涉及聚合时机、币种/单位语义、过滤上下文等复杂因素。度量不仅是数字字段,还需处理计算口径(Calculated Measures)、上下文绑定(Restricted Measures)和单位转换等问题。Calculated Measures适合派生指标(如毛利率),需注意聚合前后计算差异;Restricted Measures通过固化过滤条件(如区分实际/计划金额)确保业务语义一致性。建模时应将业务逻辑下沉到分析模型层

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1022

【c语言】函数指针详解

一、 函数名的本质 我们定义一个函数,然后输出函数名查看一下:函数名就是地址!!! 既然函数名是地址,就可以用指针变量来保存,就需要函数指针的概念。 二、如何定义函数指针 根据指针的使用经验: 指针变量必须强调是什么类型的指针。因此,函数的指针定义时必须把函数的特征表述清楚。 数组的特征:int [ ] 把函数名去掉就是函数的特征:int (int a, int b) 数组指针:把数组名替换成指针 再加上数组的特征 int(*parr)[5]; 类比数组指针 函数指针类型

努力让自己的能力配得上梦想. 1万+

企业数字化建设之——品牌零售全渠道运营中台解决方案

OMS审单 --> 订单进入OMS待发货列表区域 --> 备货(线下)-->拣货((线下 )-->质检(线下)--> 包装(线下)--> 快递员取货(线下)(物品 + 客户收货地址清单 )--> 快递员发货(2.2.5 正常退货,客户发起 --> 客服助理审核 --> 评审组 --> ( 货物运输 ) -->质检 ->仓库收货入 正常仓库 -->财务退款,记账。OMS审单 --> 订单进入物流公司系统(如:*丰),--> 快递员发货 --> 物流状态同步OMS --> OMS同步物流状态到销售平台。

java_zhong1990的专栏 612

ADAMS软件二次开发:ADAMS软件API接口详解

API(Application Programming Interface,应用程序编程接口)是一种允许不同软件应用程序之间进行交互的接口。在ADAMS软件中,API提供了与软件内部功能直接交互的能力,使用户能够通过编写自定义代码来扩展软件的功能,实现自动化操作或集成到其他系统中。ADAMS软件的API主要基于C++和Python,允许用户通过这些编程语言来访问和控制ADAMS的模型、仿真和分析功能。API接口的使用,需要对编程语言有一定的了解,同时也需要熟悉ADAMS软件的基本操作和模型结构。

kkchenjj的博客 1863

C 语言 —— 函数指针

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

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

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【C语言】函数指针全面总结

函数指针是指向函数的指针,它存储了函数的地址。函数指针是C语言中的一个强大特性,它提供了函数作为一等公民的能力,使得可以编写更灵活、更通用的代码。通过函数指针,可以实现多态、回调函数、闭包等高级编程技巧。掌握函数指针的使用,可以大大提高C语言编程的能力和水平。在嵌入式系统的开发中,函数指针的应用非常广泛,它们提供了一种灵活的方式来组织和调用函数,尤其是在资源受限的环境中。本文将探讨函数指针在嵌入式系统中的应用,并讨论如何优化函数指针的使用以提高性能和资源效率。

极客代码 1911

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

c语言-函数指针

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

pyc68的博客 3611

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

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

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

一只大笨猫的博客 2万+

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

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

wkd_007的博客 3266

c语言中函数指针用法,C语言函数指针的用法

这篇文章简单的叙述一下函数指针在结构体中的应用,为后面的一系列文章打下基础引言指针是C语言的重要组成部分, 于是深入理解指针并且高效地使用指针可以使程序员写出更加老练的程序。我们要记住指针是一个指向内存地址的变量。指针可以引用如int、char……常见的数据类型,例如:int * intptr; // 声明一个指向整型值的指针int intval = 5 ; // 定义一个整型变量int...

weixin_42510453的博客 1815

C语言的函数指针数组

简要介绍以下函数指针以及一些函数调用需要输入函数指针作为形参的情况。

qq_46284844的博客 2992

C语言:函数指针的使用

在C语言中,函数指针是指向函数的指针变量。它可以存储函数的地址,使得可以通过该指针来调用函数。

qq_43279097的博客 3058

C语言函数指针数组

函数指针数组

weixin_42215853的博客 1360
上一篇: 解释次贷危机的三张图
下一篇: 关linux的RTC驱动
myleeming
博客等级 码龄18年 75粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值