求助 一个简单的C程序 不懂!

wang6681 2011-05-07 08:04:43
#include<stdio.h>
#include<string.h>

char *fun1(char *p)
{
printf("%s\n",p);
return p;
}
char *fun2(char *p)
{
printf("%s\n",p);
return p ;
}
char *fun3(char *p)
{
printf("%s\n",p);
return p ;
}
void main()
{
char *(*pf[3])(char *p);
pf[0] = fun1 ;
pf[1] = &fun2 ;
pf[2] = &fun3 ;

pf[0]("fun1");
pf[1]("fun2");
pf[2]("fun3");
return 0;
}
这个程序的 pf[0] = fun1 ;什么意思?把指针变量的地址赋给数组吗???pf[0]("fun1");
又是什么意思啊??
...全文
156 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xspace_time 2011-05-07
  • 打赏
  • 举报
回复
对于这些简单的代码,不用看书,直接看结构即可明白
char *(*pf[3])(char *p);
char *fun1(char *p)
char *fun2(char *p)
char *fun3(char *p)
对比一下,后面都有一个(char *p),前都有一个*,中间的(*pf[3])刚好对应fun1 fun2 fun3
这个括号不是白加的,是为了说明括号内是一个有三个元素的指针数组,那么*pf[3]的意义已经很明确了
函数名fun1 fun2 fun3分别是已声明的三个函数的地址,pf[0] pf[1] pf[2]自然就是指针三个函数地址的指针了

在看
pf[0] = fun1 ;//这里很明确,函数地址指针指向函数地址,没有问题
pf[1] = &fun2 ;//这里多加了一个&,为什么能加&是因为函数声明的前面有个*,而函数前面这个*是表示函数的返回值类型的,即函数的返回值是一个指针型,因此可以很明确的知道&即是对函数返回的指针值的引用
即函数执行完后返回一个指针,而pf[1]则直接指向这个返回值所指的地址
pf[2] = &fun3 ;

再看
pf[0]("fun1");//看过上面的步骤不能明白这个试图将fun1的返回值赋值给p,结果是fun1返回p,又赋给p
,值得注意的是汇编语句先从保存p返回值的堆栈里取得p的值送入加法器,再由加法器赋给指针p,这两个p是不同的地址,而且中间存在加法器作为交换媒介,没有出现即读p又写p的情况,因此这里正确
pf[1]("fun2");
pf[2]("fun3");




AnYidan 2011-05-07
  • 打赏
  • 举报
回复
看一下 char *(*pf[3])(char *p);
从 左到右,根据优先级

pf[3] -- 一维3元素数组
(*pf[3]) -- 对每个数组求 解指针运算

char *(*pf[3])(char *p) -- 得到一个函数名,此函数的形参是 char *p, 并返回char *

因此, pf[3] -- 函数指针
abcdef0966 2011-05-07
  • 打赏
  • 举报
回复
char *(*pf[3])(char *p);

typedef pf[3] A;
typedef char *(*pf[3])(char *p) char* (*A)(char *p);

A是指向char* fun(char* p)的函数指针,可以这样赋值:A=fun

这样pf作为一个数组,就是一个函数指针数组了了,有3个元素。他的任一个元素都可赋值为fun

pf[0]("fun1");表示调用一个函数,函数参数为"fun1".(此函数原型为接受一个char*作为参数)

pf[1] = &fun2 ;
pf[2] = &fun3 ;

这样的赋值形式和pf[0]的是一样的,都是表示指向函数入口的指针。
srh342708502 2011-05-07
  • 打赏
  • 举报
回复
你自已以经明白了还问
terryzhu 2011-05-07
  • 打赏
  • 举报
回复
pf是个数组,这个数组里面每个元素存放的是一个函数指针(函数指针不理解的网上查一下资料),pf[0]("fun1");表示调用一个函数,函数参数为"fun1".(此函数原型为接受一个char*作为参数)
内容概要:本文围绕2026年高教社杯全国大学生数学建模竞赛E题“SEM广告投放策略优化”展开研究,基于某互联网公司2025年约142万元的搜索引擎营销(SEM)投放数据,构建了从诊断、分类、优化到鲁棒决策的完整建模框架。研究首先通过多维度指标体系与对数线性假日效应回归模型分析投放效益的时间规律与结构性问题;继而提出成本—效益二维归一化分类方法,将关键词科学划分为黄金词、重点词、潜力词、问题词与无效词五类;在此基础上建立0-1整数规划模型,结合贪心算法与拉格朗日对偶定价求解预算约束下的最优投放策略;最后引入条件风险价值(CVaR)框架应对竞价与转化的不确定性,实现鲁棒优化。实证结果表明,优化策略显著降低单位注册成本,提升预算使用效率与展位质量。; 适合人群:具备数据分析与数学建模基础,对运筹优化、市场营销量化分析感兴趣的高校学生、数据分析师及互联网广告从业者。; 使用场景及目标:①应用于企业SEM广告投放策略的优化,实现预算约束下的转化最大化;②作为数学建模竞赛的参考案例,学习如何将实际商业问题转化为数学模型并求解;③掌握关键词分类、整数规划、鲁棒优化等方法在真实场景中的综合应用。; 阅读建议:此资源不仅提供了完整的建模思路与算法实现,还包含详细的策略对比与稳健性分析。读者应在理解模型原理的基础上,结合所提供的代码与数据进行复现与调试,重点关注分类逻辑、优化模型构建及不确定性处理方法,以深入掌握从问题分析到决策落地的全过程。
内容概要:本文围绕2026年高教社杯全国大学生数学建模竞赛D题“时频冲突检测与消解”展开,旨在通过提供数学建模、代码实现与论文写作的完整资源,帮助参赛学生系统性地解决时频冲突问题。文档不仅涵盖该赛题的技术背景与建模范式,还拓展至SEM广告投放、无线电干扰源定位、微网电力调控等相关赛题的建模思路与求解方法,强调数据分析、优化算法与模型鲁棒性的综合应用。文中整合了灰狼优化、粒子群算法、LSTM-Attention等多种智能算法在实际工程问题中的建模实践,并配套提供MATLAB/Python代码支持,便于读者复现、验证与拓展研究成果。资源体系注重从问题分析、模型构建到算法实现与结果可视化的全流程技术贯通,助力提升建模实战能力。; 适合人群:全国大学生数学建模竞赛参赛者,具备一定数学建模、编程基础(MATLAB/Python)和优化理论知识的本科或研究生层次学生。; 使用场景及目标:①辅助完成数学建模竞赛中的问题分析、模型构建与算法实现;②学习如何将智能优化算法与实际工程问题(如信号冲突、广告投放、电力调度)相结合;③掌握从数据处理、模型求解到结果可视化的全流程技术路径; 阅读建议:建议读者结合提供的网盘资源(代码、论文模板、参考文献)同步学习,重点关注模型构建逻辑与算法实现细节,优先掌握某一类问题的完整解决方案后再横向拓展至其他赛题,以提升综合建模能力。

70,039

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧