函数指针用法说明

函数指针、函数指针数组、指向函数指针数组的指针 目录 一、函数指针(本质是指针) 1.( * ( void( * )( ) )0)( ) ; 2.void( * signal ( int,void( * )( int ) ) )( int ) 二、函数指针数组 (本质是数组) 三、指向函数指针数组的指针(本质上是一个指针) 4.回调函数 建议在看函数指针前,了解一下数组指针,指针数数组的解析,假如本来就了解的化就可跳过。 点击打... 阅读详情
函数指针用法说明
http://hi.baidu.com/theonlyking/blog/item/b3979533f89e565bad4b5f30.html
2011-06-07 10:55

从百度百科中整理出来的

函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是一致的。函数指针有两个用途:调用函数和做函数的参数。

函数指针的声明方法为:

  数据类型标志符 (指针变量名) (形参列表);

  注1:“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如:

  int func(int x); /* 声明一个函数 */

  int (*f) (int x); /* 声明一个函数指针 */

  f=func; /* 将func函数的首地址赋给指针f */

  赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。

  注2:函数括号中的形参可有可无,视情况而定。

  下面的程序说明了函数指针调用函数的方法:

  例一、

  #include<stdio.h>

  int max(int x,int y){ return(x>y?x:y); }

  void main()

  {

  int (*ptr)(int, int);

  int a,b,c;

  ptr=max;

  scanf("%d,%d",&a,&b);

  c=(*ptr)(a,b);

  printf("a=%d,b=%d,max=%d",a,b,c);

  }

  ptr是指向函数的指针变量,所以可把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数,实际上ptr和max都指向同一个入口地址,不同就是ptr是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你想怎么做了。在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数。不过注意,指向函数的指针变量没有++和--运算,用时要小心。

  不过,在某些编译器中这是不能通过的。这个例子的补充如下。

  应该是这样的:

  1.定义函数指针类型:

  typedef int (*fun_ptr)(int,int);

  2.申明变量,赋值:

  fun_ptr max_func=max;

  也就是说,赋给函数指针的函数应该和函数指针所指的函数原型是一致的。

  例二、

  #include<stdio.h>

  void FileFunc()

  {

  printf("FileFunc\n");

  }

  void EditFunc()

  {

  printf("EditFunc\n");

  }

  void main()

  {

  typedef void (*funcp)();

  funcp pfun= FileFunc;

  pfun();

  pfun = EditFunc;

  pfun(); 

  }

 指针函数和函数指针的区别  1,这两个概念都是简称,指针函数是指带指针的函数,即本质是一个函数。我们知道函数都又有返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。

  其定义格式如下所示:

  返回类型标识符 *返回名称(形式参数表)

  { 函数体 }

  返回类型可以是任何基本类型和复合类型。返回指针的函数的用途十分广泛。事实上,每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针。比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,不过这时的变量是函数本身而已,而整个函数相当于一个“变量”。

  2,“函数指针”是指向函数的指针变量,因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上一致的。函数指针有两个用途:调用函数和做函数的参数。

关于函数指针数组的定义方法,有两种:一种是标准的方法;一种是蒙骗法。

  第一种,标准方法:

  {

  分析:函数指针数组是一个其元素是函数指针的数组。那么也就是说,此数据结构是一个数组,且其元素是一个指向函数入口地址的指针。

  根据分析:首先说明是一个数组:数组名[]

  其次,要说明其元素的数据类型指针:*数组名[].

  再次,要明确这每一个数组元素是指向函数入口地址的指针:函数返回值类型 (*数组名[])().请注意,这里为什么要把“*数组名[]”用括号扩起来呢?因为圆括号和数组说明符的优先级是等同的,如果不用圆括号把指针数组说明表达式扩起来,根据圆括号和方括号的结合方向,那么 *数组名[]() 说明的是什么呢?是元素返回值类型为指针的函数数组。有这样的函数数祖吗?不知道。所以必须括起来,以保证数组的每一个元素是指针。

  }

  第二种,蒙骗法:

  尽管函数不是变量,但它在内存中仍有其物理地址,该地址能够赋给指针变量。获取函数地址的方法是:用不带有括号和参数的函数名得到。

  函数名相当于一个指向其函数入口指针常量。 那么既然函数名是一个指针常量,那么就可以对其进行一些相应的处理,如强制类型转换。

  那么我们就可以把这个地址放在一个整形指针数组中,然后作为函数指针调用即可。

  完整例子:

  #include "stdio.h"

  int add1(int a1,int b1);

  int add2(int a2,int b2);

  void main()

  {

  int numa1=1,numb1=2;

  int numa2=2,numb2=3;

  int (*op[2])(int a,int b);

  op[0]=add1;

  op[1]=add2;

  printf("%d %d\n",op[0](numa1,numb1),op[1](numa2,numb2));

  }

  int add1(int a1,int b1)

  {

  return a1+b1;

  }

  int add2(int a2,int b2)

  {

  return a2+b2;

  }

Fluent动网格+滑移网格+重叠网格对比介绍(以震荡水翼flapping foil为例) 初学fluent笔记,本文主要包含: Flapping foil在fluent内的几种实现方式 在哪设置动网格、滑移、重叠网格 flapping的UDF 示例 写在前面:Fluent在预览网格运动/提交计算之前,注意保存一个cas版本。 -------------------------Flapping foil 网格几种组合实现方式:---------------------- 直接重叠网格,overset, 需要建立两个几何part,part要重合。水翼局部区域(component),背景网格(ba 阅读详情

相关推荐

(ZOS-API)Matlab控制ZEMAX软件调整光学系统某镜面位姿

所用软件的版本:MatlabR2022a, Zemax OpticStudio2024R1交互扩展功能,Zemax和可以同时打开,操作会比较方便在ZEMAX软件中,调整次镜位置通常有两种方法:1.在次镜前后各添加一个坐标间断面,并修改其“偏心X”“偏心Y”等参数来调整次镜的位姿;2.或者直接在次镜属性选项中设置相关数值。这两种方法对Zernike系数的采集结果无显著影响。

ecilifurt的博客 911

C++关键字 typedef 的不同用法说明,含函数引用和函数指针

typedef的说明 在Cppreference 网站中对typedef的解释中给出了实际用例。 https://en.cppreference.com/w/cpp/language/typedef 其中下面的部分较难理解,在这里对其进行拆解分析。 // more complicated typedef typedef int int_t, *intp_t, (&fp)(int, u...

mhywoniu的博客 531

手机相机基础技术解析:从硬件到算法的全面指南

手机相机的成像过程可简化为的链路,其核心硬件包括 镜头、CMOS传感器、ISP(图像信号处理器) 以及配套的软件算法。

weixin_44239603的博客 2448

C语言基础知识:函数指针&指针函数(定义格式、作用及用法说明)

版权声明:本文为博主原创文章,未经博主允许不得转载。https://mp.youkuaiyun.com/postedit/83150266 一、函数指针的实质(还是指针变量) 1、函数指针定义格式:类型名 (*函数名)(函数参数列表); int (*pfun)(int, int); 2、函数指针的定义、赋值、调用 void func1(void) //定义一个函数,以方便下面定义函...

baidu_37973494的博客 4万+

BRep实战指南:从理论到文件格式的全面解析

本文全面解析BRep(边界表示法)从基础概念到文件格式的实战应用。详细介绍了BRep的数学定义、工业应用场景,以及STEP、IGES等主流文件格式的对比与使用技巧,帮助读者掌握三维建模核心技术并优化性能。

weixin_29235923的博客 407

东方通TongWeb虚拟主机配置全流程:从创建到应用部署的保姆级教程

本文提供东方通TongWeb虚拟主机从创建、HTTP通道配置到应用部署的完整实战指南。重点解析虚拟主机的逻辑隔离价值、通道参数调优原理及企业级多应用部署架构,并涵盖常见报错排查与性能优化建议,旨在帮助运维和开发人员高效、稳定地完成应用系统部署。

oil88的博客 530

函数指针和函数指针数组

函数指针:指向函数的指针。 函数指针数组:一个数组里面存的类型是函数指针。 一、函数指针的声明和调用 1.指针声明: 函数指针顾名思义就是一个指向函数的指针。 int Add(int x,int y) { return x+y; } char* Sub(char*) { } //声明函数指针并初始化 int (*Add)(int ,int ) ptr=&Add; char* (*Sub)(char*) prt_char=&Sub; 这里声明了两个函数指针.

weixin_45423515的博客 8820

Python爬虫实战:全方位解析前程无忧(51job)职位详情爬取及反爬破解

平台规模:覆盖全国各行业、数百万条岗位信息。数据特点:职位描述详细,职位标签丰富。数据价值:支持招聘趋势分析、职业发展研究、薪资行情调研。推荐Python 3.10+,支持最新async特性与库兼容。

2201_76125261的博客 1486

掌握指针进阶:一篇带你玩转函数指针、函数指针数组及指向函数指针数组的指针!!

数组是一个存放相同类型数据的存储空间,那我们已经学习了指针数组//数组的每个元素是int*那要把函数的地址存到一个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?答案是:parr1parr1先和[]结合,说明parr1是数组,数组的内容是什么呢?是int (*)()类型的函数指针。转移表总之,函数指针数组实际上是一个数组,其元素都是指向函数的指针。这使得我们可以将不同的函数存储在数组中,并通过索引来调用特定的函数。

深入解析C/C++编程技巧,带你探索高效开发之路 1408

[特殊字符] RK3588 平台上基于 Panfrost 的 Mesa 驱动编译全过程

摘要: 本文详细记录了在RK3588平台(Ubuntu 20.04 aarch64)上编译基于Panfrost的Mesa驱动的全过程。内容包括:1)系统依赖安装;2)libdrm编译;3)Mesa配置参数优化;4)LLVM 15与SPIRV工具链的安装方法;5)SPIRV-Tools版本问题的解决方案;6)最终编译命令及常见错误处理。关键点在于正确设置工具链路径(PKG_CONFIG_PATH)和版本匹配(LLVM 15对应SPIRV-LLVM-Translator v15.0.0),推荐将组件安装在/op

梁俊星的博客 941

Xinference新手指南(一个命令直接安装成功)

对于新手,必须得学会使用docker部署,这是基本功!这里就不过多去介绍了,如果评论要出教程的话,以后再出了。

Ven%的博客 818

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

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

一只大笨猫的博客 2万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

详解函数指针和类成员函数指针

作者:倾夜·陨灭星尘 一.什么是函数指针? 函数指针,顾名思义即指向函数的指针。 如果要问,为什么能用一个指针指向一个函数呢?我觉得要理解这个问题,以及要理解后面的函数指针和类成员函数指针,没有什么比从计算机原理的角度来理解更容易了。这里就简要回顾一下相关知识。 众所周知,计算机(图灵机)执行程序的基本流程就是:取指令->执行指令->取下一条指令->……。取指令的位置由一个寄存器PC决定。

yyx112358的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

jre9下载 jdk9

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

函数指针、函数指针数组,函数指针数组的指针

数组指针 概念:数组指针是指针,只要是指针他就占4个字节; 例如: 整形指针:int *p;能够指向整形数据的指针    浮点型指针:float *p;能够指向浮点型的数据的指针 那么数组指针,同样的理解就是指向数组的指针。 Eg:  int (*p)[10] 解释:这里的p由于小括号的原因和*先结合,所以他就是指针,然后指向的是一个大小为10的整形数组,所以p首先是一个指针,然后指向

Gary的面包屑小道 1万+

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

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

指针深入了解——函数指针,函数指针数组,指向函数指针数组的指针。

我们上期了解了,数组指针,指针数组,我们知道了,数组也有自己的地址,那么函数有没有自己的地址呢?如果有那又该怎么存起来呢?今天我们就一起来探讨一下。

qq_63943454的博客 1205

函数指针

以下内容摘自 c++primer(第五版) 函数指针指向的函数而非对象。与其他指针一样,函数指针也指向特定的类型。函数的类型是由返回值和参数列表决定,与函数名无关。例如: //比较两个字符串的长度 bool lenghtCompare(const string &s1, const string &s2); 函数的类型是bool(const string &s1, c...

feng_shaoxia的博客 2676

函数指针和函数指针类型

参考:https://blog.youkuaiyun.com/candyliuxj/article/details/6339414 函数指针 1.     定义 每一个函数都占用一段内存单元,它们有一个起始地址,指向函数入口地址的指针称为函数指针。 注意:函数指针的本质是一个指针变量,且指针指向的函数的入口地址 2.     语法 指向函数的指针变量的一般定义形式为:        数据类型  ...

杨树的博客 7778

【C语言】函数指针、函数指针数组、函数指针数组的指针

一.函数指针 1.定义理解 函数指针:是一个指针,存放函数地址的指针。 函数的地址可以通过取地址函数名拿到,也可以通过函数名直接拿到。2.函数指针 (1)定义一个函数test void test(char *str) {     printf("%s\n",str); } int main() {     //函数指针的定义方式     void (*p)(char *str) = test...

Miss_Monster的博客 1229

函数指针详解

  这篇文章把函数指针的各种常用情况做了一个详解的总结。 1. 指向普通函数的指针 很简单,如下的例子可以说明基本格式和用法:int int_add(int a, int b){ return (a+b);}int int_sub(int a, int b){ return (a-b);}int (*int_operato

sparkliang的专栏 1万+

函数指针和返回函数指针的函数

前言 无 函数指针 这里函数在前,指针在后所以很明显这是再说一个指针,也就是那个十六进制整数。 可以知道函数名所指向的就是内存中函数的首地址,那么完全可以使用一个指针来指向这个首地址。声明方式如下 type (*变量名)(参数); // 如 int (*pf)(int, int) 这个声明的意思就是一个函数指针,指向一个返回值为 int型,参数为两个 int型的函数首地址。这里面用一个括号强行将*的优先级提高,使得这个变量名先代表的是指针。但是很明显这里是没有具体的函数内容的,也就是说需要一个现成的函

cuoxin123的博客 1517

三种函数指针的表达以及函数指针概念讲解

函数指针的使用和定义方法函数指针的概念三种表达函数指针的方法函数指针的调用方法 函数指针的概念 三种表达函数指针的方法 函数指针的调用方法 #函数指针概念 如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。 #三种表达函数指针的方法 接下来通过简单加法运算函数:int add(int a,int b)来演示其对应的函数指

qq_37975668的博客 1587

函数指针,函数指针数组,函数指针数组指针实例

  实例1: #include<stdio.h> void fun1(void) { printf("call fun1\n"); } void fun2(void) { printf("call fun2\n"); } void main(void) { void(*pf1)(void); //定义函数指针变量 void(*pf2)(void); pf1 = fun1; //函数指针变量赋值(方式1) pf2 = &fun2; //函数指针变量赋值(方

Marc Pony 462

C/C++函数指针、函数指针数组、函数指针数组的指针理解与应用

转自:https://www.cnblogs.com/haore147/p/3647262.html 1.函数指针的定义   顾名思义,函数指针就是函数的指针。它是一个指针,指向一个函数。看例子: A) char * (*fun1)(char * p1,char * p2); B) char * *fun2(char * p1,char * p2); C) char * fun3(...

job_baiqiang的博客 2054

使用 typedef 定义函数指针,更优雅的使用函数指针

简介 关于函数指针的介绍,这里就不做过多说明了,不了解的同学可以看看这篇博客: https://blog.youkuaiyun.com/afei__/article/details/80549202   使用 typedef 定义函数指针 通过下面这个例子,我们看看 typedef 是怎么搭配函数指针使用的吧。 int add(int a, int b) { return a + b; ...

阿飞的博客 3万+
上一篇: 十字路口
下一篇: Source Insight Tab的使用
ericdev
博客等级 码龄15年 0粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值