C语言中指向函数的指针(我见过的讲的最清晰的文章)

【数据结构基础】指向函数指针 指向函数指针这一部分内容在学习数据结构的过程是有些必要的,因为在严蔚敏老师的《数据结构(C语言版)》一书中多次出现了这部分的内容。想要看懂具体的算法,这部分内容是不可或缺的。... 阅读详情
转帖自:
http://wenku.baidu.com/view/7e566448cf84b9d528ea7a57.html

1 定义和调用
程序在编译后,每个函数都有一个首地址(也就是函数第一条指令的地址),这个地址称为函数的指针。可以定义指向函数的指针变量,使用指针变量间接调用函数。下面通过一个简单的例子来说明:
float max(float x,float y)
{
return x>y?x:y;
}
float min(float x,float y)
{
return x<y?x:y;
}
main()
{
float a=1,b=2, c;
float (*p)(float x, float y);
p=max;
c=(*p)(a,b); /*等效于 max(a,b)*/
printf("\nmax=%f",c);
p=min;
c=(*p)(a,b); /*等效于min(a,b)*/
printf("\nmin=%f",c); 
}
程序运行的结果为:
max=2.000000
min=1.000000 

说明:
(1)语句float (*p)(float x, float y);定义了一个指向函数的指针变量。函数的格式是:返回值为float型,形式参数列表是(float x, float y)。p定义后,可以指向任何满足该格式的函数。
(2)定义指向函数的指针变量的格式为:
(3)数据类型(*指针变量名称)(形式参数列表);
(4)其中数据类型是函数返回值的类型,形式参数列表是函数的形式参数列表。
(5)形式参数列表中,参数名称可以省略。比如,float (*p)(float x, float y);可以写为:float (*p)(float, float); 
(7)注意指针变量名称两边的括号不能省略
(8)语句p=max;将max函数的首地址值赋给指针变量p,也就是使p指向函数max。C语言中,函数名称代表函数的首地址
(9)第一个c=(*p)(a,b);语句:由于p指向了max函数的首地址,(*p)(a,b)完全等效于max(a,b)。函数返回2.0。注意*p两边的括号不能省略
(10)语句p=min; 将min函数的首地址值赋给指针变量p。p是一个变量,p的值实际上是一个内存地址值,可以指向max,也可以指向min,但指向函数的格式必须与p的定义相符合。
(11)第二个c=(*p)(a,b);语句:由于p指向了min函数的首地址,(*p)(a,b)完全等效于min(a,b)。函数返回1.0。
(12)将函数首地址赋给指针变量时,直接写函数名称即可,不用写括号和函数参数
(13)利用指针变量调用函数时,要写明函数的实际参数。

提示:定义一个指向函数的指针变量时,一定要使用括号。比较下面的两个定义:
float (*p1)(int x, long y);
float *p2(int x, long y);
第一个语句定义了一个指向函数的指针变量p1;第二个语句声明了一个函数p2,p2的形式参数为(int x, long y),返回值为一个float型的指针。

2 指向函数的指针作为函数参数
有 时候,许多函数功能不同,但它们的返回值和形式参数列表都相同。这种情况下,可以构造一个通用的函数,把函数的指针作为函数参数,这样有利于进行程序 的 模块化设计。比如下面的例子中,我们把对2个float型数进行加、减、乘、除操作的4个函数归纳成一个数学操作函数MathFunc。这样,在调 用 MathFunc函数时,只要将具体函数名称作为函数实际参数,MathFunc就会自动调用相应的加、减、乘、除函数,并计算出结果。下面是程序的代码:
float Plus(float f1, float f2);
float Minus(float f1, float f2);
float Multiply(float f1, float f2);
float Divide(float f1, float f2);
float MathFunc(float (*p)(float, float), float para1,float para2);
main()
{
float a=1.5, b=2.5;
printf("\na+b=%f", MathFunc(Plus, a,b));
printf("\na-b=%f", MathFunc(Minus, a,b));
printf("\na*b=%f", MathFunc(Multiply, a,b));
printf("\na/b=%f", MathFunc(Divide, a,b));
}

float Plus(float f1, float f2)
{
return f1+f2;
}

float Minus(float f1, float f2)
{
return f1-f2;
}

float Multiply(float f1, float f2)
{
return f1*f2;
}

float Divide(float f1, float f2)
{
return f1/f2;
}

float MathFunc(float (*p)(float, float), float para1,float para2)
{
return (*p)( para1, para2);
}

程序运行的结果为:
a+b=4.000000
a-b=-1.000000
a*b=3.750000
a/b=0.600000



C语言从零开始——学这一篇文章就够了 这个假期重新回顾了之前这个《C语言从零开始》的系列。当时由于没有整体规划,想到哪儿写到哪儿,导致了里面的文章质量不够统一。于是,我又对里面的部分文章做了些调整,力求整体脉络更加连贯。 后面我会对这些文章重新整理,可能会加入更多的实例制作成更容易上手的一个全新的系列。敬请期待。 这篇的目的是给这个系列做一个清晰的划分,希望后面的读者能够通过这个提纲更好地进行学习。 1. 概述C语言从零开始(一... 阅读详情

相关推荐

SAP PP实战:MRP Area怎么用?手把手教你按产线、委外供应商拆分物料计划

本文详细解析了SAP PP模块中MRP Area的功能与应用,指导如何按产线、委外供应商拆分物料计划,实现精细化物料需求管理。通过实战案例展示MRP Area在减少计划冲突、提升库存准确率方面的显著效果,为制造业企业提供可落地的解决方案。

weixin_27015733的博客 388

C语言指针操作(六)指向函数指针

指向函数指针详解,以及如何使用指向函数指针变量做函数参数。指向函数指针作为函数参数,是 C 语言实际应用中的一个比较深入的部分。

伯努利 9671

QGIS编译(跨平台编译)001:Flex、Bison编译(安装)(Windows、Linux、MacOS环境下安装)

QGIS编译;Flex、Bison编译(安装)(Windows、Linux、MacOS环境下安装)

LuckyHanMo的博客 3029

C语言指针p、*p、&p、*&p、&*p符号分别代表什么意思?

在C语言中,指针是非常重要的概念。指针是一个变量,其值为另一个变量的地址。使用指针可以直接访问内存中的数据,这使得C语言非常灵活和强大。在学习C语言时相比大家都已经知道了&和*的区别了,但你知道*&p和&*p又代表什么吗?

weixin_40365379的博客 1万+

C语言指针操作(五)*指向函数指针

C语言指针操作(五)*指向函数指针

醉蕤的博客 4088

指向函数指针 ------ 函数指针(function pointer)

一个函数函数名是一个指针,它指向函数的代码。函数的调用可以通过函数名,也可以通过指向函数指针来调用。 定义形式:         类型 (*指针变量名)(参数列表); 例如:         int (*p)(int i,int j);     p是一个指针,它指向一个函数,该函数有2个整形参数,返回类型为int。p首先和*结合,表明p是一个指针。然后再与()结合,表明它指向的是一个

str999_cn的专栏 9万+

C语言指向函数指针

函数是由指令序列构成的,其代码存储在连成一片的内存单元中,这些代码中的第一个代码所在的内存地址称为首地址。 首地址是函数的入口地址。主函数在调用子函数时,就是让程序转移到函数的入口地址去执行。 #include using namespace std; int sum = 0; int m = 0; void food1(){ cout<<"drink"<<endl; sum = s

Happy_Girl2012的专栏 549

【c语言进阶】如此清晰指针解让你再也不怕学不会指针了,硬核指针解。

大家是否对指针一知半解?是否看到繁杂的指针类型晕头转向?是否因为不能灵活使用指针而烦躁?看完本篇文章,妈妈再也不用担心我晕针了。

ai15013602354的博客 1431

C语言指针进阶-全面分析C指针重难点逐一突破(中篇)

指针的重难点逐一突破,细致分析,陪伴式学习!

qq_36935038的博客 2543

深入理解C语言指针(一)

文章目录深入理解指针地址字符指针指针数组数组指针数组指针的定义:**“&数组名”和“数组名”**数组指针的使用一维数组传参二维数组传参一级指针传参二级指针传参函数指针什么是函数指针怎样使用函数指针函数指针数组函数指针是什么函数指针的使用 深入理解指针 指针学习是C语言中十分重要的一个环节,利用指针,学会了指针的知识后,我们会对系统的内存有更为清晰的认识,也对更为底层的程序,这样就是C语言经久不衰的原因。 地址 了解指针之前我们要了解地址 内存被划分为以字节为单位的空间 每一个字节都有一个编号,这

cainiaochufa2021的博客 5708

C语言09)——关于指针(逐渐清晰版)

本文详细介绍了C语言指针的核心概念,包括内存划分、指针变量定义和使用方法。文章首先解释了内存单元和地址的概念,将内存比作酒店房间,指针就是房间号。然后重点解了指针变量的定义、类型(如int*、char*)以及指针变量在不同平台(32位/64位)下的大小差异。通过取地址操作符(&)和解引用操作符(*)的示例,说明了如何获取变量地址并通过指针修改变量值。文章还预告了后续将指针运算和野指针相关内容。这些基础知识对于理解C语言的内存管理和指针操作至关重要。

ankleless的博客 2965

考试C语言指针不会?看这一篇博客就够了

C语言指针的浅显理解。虽然不算登堂入室,但是应付考试足够了

布小禅的博客 1万+

一篇文章--超简单理解C语言中的地址和指针以及函数指针的关系

在了解指针之前,我们不得不谈一个东西,那就是地址和取址 在计算机中,存储的方式其实只有一个,不管是二维数组三维数组(这里不讨论,下次可能专门写一篇一维数组和二维数组之间存储的关系),还是什么抽象的东西也好,其实遵循的道理都是一样的。 下面我们就来好好看看计算机里面的存储和地址 其实计算机里数据是以这样的顺序存储的,并且每一个位置上会有一个地址。 我们现在来抽象把计算机存储的方式用 ”坑“ 的方式来理解,数据和存储空间就是萝卜和坑的关系,数据1,2,3分别是萝卜1,2,3。01,02,03是坑的地址,是不

The_RedMaple的博客 2122

C语言-指针高级(二级指针和多级指针、数组指针指针数组、函数指针);

本章详细解:C语言二级指针和多级指针、数组指针指针数组、函数指针函数指针数组;

李永奉的博客 1419

指向函数指针_函数指针(function pointer)

**一部分转自https://blog.csdn.net/str999_cn/article/details/78591369 代码跟小甲鱼老师课时基本一样** 函数具有可赋值给指针的物理内存地址,一个函数函数名就是一个指针,它指向函数的代码。一个函数的地址是该函数的进入点,也是调用函数的地址。函数的调用可以通过函数名,也可以通过指向函数指针来调用。*函数指针还允许将函数作为变元传递给其他...

铁头娃 6406

C语言 指向函数指针

        函数指针:如果在程序中定义了一个函数,在编译时,编译系统为函数代码分配一段存储空间,这段存储空间的起始地址(又称入口地址)称为这个函数指针。         可以定义一个纸箱函数指针变量,用来存放一个函数的起始地址,这就意味着次指针变量指向函数。例如: int (* p)(int, int);    //p的类型为int(*)(int, int)         定义...

Hola_ya的博客 1201

函数指针) 指向函数指针

函数指针- 指向函数指针 函数指针的声明和使用 通过函数指针调用函数 函数指针做参数 函数指针数组

Half-up的博客 1330

C语言函数指针详解:指向函数指针

函数指针是一种特殊类型的指针,它指向程序中的函数而不是变量。函数指针允许我们在运行时动态地选择调用哪个函数。本文将深入讨论函数指针的用法,通过示例代码详细说明其应用。: 定义一个求两数和的函数。: 定义一个打印字符串的函数

2302_78381559的博客 3199

函数指针指向函数指针

目录1. 函数指针指向函数指针)1.1 使用函数指针1.2 重载函数指针1.3 函数指针形参(形参是指向函数指针) 1. 函数指针指向函数指针函数类型由它的返回类型和形参类型共同决定,与函数名无关 函数指针指向的是函数 //函数声明 //比较两个string对象的长度 bool lengthCompare(const string &, const string &); //形参未初始化(&后没跟形参名字) //声明一个指向函数指针,用指针替换函数名 pf = &

一个搬运知识的笨小孩 2234

中国电信-空地一体5G增强低空网络白皮书2024.pdf

中国电信-空地一体5G增强低空网络白皮书2024.pdf

上一篇: wget 1.13.4 移植到嵌入式ARM上的过程
下一篇: 摆脱穷人思维,成就财富梦想
gsnet
博客等级 码龄25年 40粉丝 181原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值