问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

关于函数指针

发布网友 发布时间:2022-05-18 09:11

我来回答

4个回答

热心网友 时间:2023-10-13 05:10

在ISO C和部分编译环境下,一个函数指针用于函数调用时可以不用显式地反引用(就是*pmax),在这种情形下,你写(*pmax)(x,y)和pmax(x,y)都可以,其实你写pmax(x,y),是被非显式地反引用了的,这种非显式的反引用由编译器为你做了。但是这种有赖编译环境的边缘化特性,个人劝楼主少用。

其实,pmax(x,y);和(* pmax)(x,y);孰优孰劣对编程者来说并没有太大的意义,因为现在的编译器大多都支持这种非显式转换了,我刚才试过了,在TC上两者都可以了,估计应该没有编译器会不支持这中非显式转换了。但是从你的代码的阅读者的角度来看,用(*pmax)(x,y);更好一些,因为这可以提醒你的代码的阅读者,这里用的是一个指针的反引用来间接调用函数的,而不是一个直接的函数调用,你写pmax(x,y);如果离pmax=max很远,很容易让人误认为pmax是一个函数调用。虽然(*pmax)(x,y);比起pmax(x,y);写法上稍微复杂一点,但是能增加代码的可读性,所以从阅读者的角度来讲,(* pmax)(x,y);更好一些,而且如果你的程序篇幅很长,这样也不易产生混淆,有便于你做代码维护。

int(*pmax)();
pmax=max;
没有错,只不过编译器会警告你说你调用了没有原型声明的函数,这种情形在标准里面也不是错,只不过编译器不会检测你后面的调用传进的参数个数是否与max声明的参数个匹配,而且不会将你传进的参数自动转化为max声明中对应的形参相同的类型。所以这种用法有不妥之处,但这并不是问题的关键。并且楼主的程序在编译时,虽然会出现这样的警告,但并不影响程序的运行,程序能照常运行。

另外,C语言里面明文指出不带参数列表()的函数名被翻译为指向函数代码段在内存中的入口地址的指针,并且是右值(这就跟数组名一样)但两种情形除外:函数名作为sizeof的操作数(这是非法的),和函数调用时候的函数名,这两种情形下,函数名都不被翻译为函数指针,而是函数本身。pmax(x,y);仅仅是一种简约的写法,因为现在pmax里面放的是函数max的地址,那么运行的时候只要获取了pmax的值也就获取了max的地址,也就能找到函数max了。所以写pmax(x,y);也是被允许的,但是C标准里面绝对没有规定说这种写法就是标准写法,(*pmax)(x,y);就不是标准写法了。就是C99也同时容纳这两种写法。相反,大师们也都推崇的是(*pmax)(x,y);原因我已经在前面解释了。而(*pmax)(x,y);就相当于你已经到max所在的地址取出了整个函数。你把函数在内存中的代码整个看成一个值,然后仔细想想下面这几条语句是什么意思就会明白了:
int a[3] = { 78, 89, 99 };
int * pa = a;
pa = ? (Now you know where the array is, so you can perform any valid operation on its elements)
*pa = ? (you get the value at that address stored in pa, ie. a[0])

或者
int b = 3, * pb = &b;
pb = ?
*pb = ?

楼主,纠正你一个错误:PMAX是一个指向函数入口地址的指针,和原来的函数int MAX(int,int)中"MAX"定义是一样的。。。

pmax与max绝对不等价,虽然pmax(x,y);与max(x,y);的结果是一样的。在pmax与max都被解释为指向函数入口地址的上下文里面,pmax是一个可变更的左值,max是一个不可变更的左值,是绝对不等价的。当出现了我上面提到的两种特殊情况时,pmax的类型是函数指针,max的类型是函数,两者更不是等价的。pmax(x,y);与max(x,y);绝不等价!
(*pmax)(x,y);与max(x,y);才是等价的!
既然楼主喜欢用pmax(x,y);,那是个人的喜好,我没有什么可再多说的。不过,奉劝楼主一句,谭浩强的书最好别看。我个人对他老前辈没有任何意见,只是他的书不敢恭维!我知道,这里很多人都是看他的书的,我在这里如是说无异成为众矢之的,但是,如果一个人站在真理面前,都直不起腰,挺不起胸,不知其可!顺便说一句,昨天在网上看到有一篇文章把Herbert这位ANSI C和ISO C标准委员会里面的专家的那本备受推崇的书C: The Complete Reference都斥为C: The Complete Nonsense, 并且文章里面指出的书中的错误个个一针见血,矢矢中的,感慨良深。故在此牢*一阵,别无他意,如有任何冒犯之处,还往楼主和各位见谅。

热心网友 时间:2023-10-13 05:10

使用
int(*pmax)();
事实上表述我们定义一个函数指针,它可以指向相同申明的函数,但是,
pmax=max;
则是错误的,因为函数指针的申明和max不一致,也就是说该函数指针应该为:
int (*pmax)(int,int);
pmax = max;
使用时可以象调用类似函数一样调用,即:
z = pmax(a, b);
一般不使用:
z = (*pmax)(a, b);
除非这是早期代码!尽量不要这样用,因为它已经不是标准用法。

有时为了更好地使用函数指针,常常使用typedef,如:

typedef int(*Pmax)(int, int);
上面定义一个函数指针类型Pmax,
这样Pmax就像普遍变量一样使用,如:
Pmax ppmax; /* 象定义普通变量那些定义函数指针 */
ppmax = max;
z = ppmax(x, y);

热心网友 时间:2023-10-13 05:11

main()
{ int max(int a,int b); //定义个函数
int(*pmax)(); //定义个函数指针
int x=1,y=2,z;
pmax=max; //把函数的入口地址赋值给函数指针
z=(*pmax)(x,y); //(*pmax)其实是地址保存就是地址
//z=pmax(x,y); //pmax也也函数入口地址
printf(\"maxmum=%d\",z);
}

热心网友 时间:2023-10-13 05:11

很简单.你既然pmax=max; 就说明了这两者是等价的,都是调用了这个函数.所以结果相同.
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? 如何避免wps卡顿? 属鼠的男人找对象是属什么,属鼠的人和什么属相合 96年鼠的姻缘在哪年 属相相合年份运势提升 2024属鼠找对象属什么最佳 黑客攻击网站能报案吗 黑客攻击报案有用吗 函数调用(函数指针) 如何定义一个函数指针? 指针函数和指向函数的指针在意义和用法上有什么区别 请问函数指针和指针函数的运用? 函数指针定义 华硕r9 380显卡需要多大的电源 加盟亿爵餐饮开一家一绝披萨店,0经验如何经营好一家一绝披萨门店呢? 如何把多个word文档合并成一个文档 英雄杀中杀、血杀、暗杀有什么区别?? 手游英雄杀和端游有什么区别 三国杀 和英雄杀 哪个好玩有什么区别 英雄杀MVP是什么意思? 关于英雄杀的问题 英雄杀任桓之报数是什么意思? 三国杀与英雄杀的区别 AMDYXS,RTDSYBRXLDS这句话是什么意思 一个人的个性签名“amdyxs yqzsdwq csbfxj”是什么意思? yxs文件用什么打开 YXS什么意思 女孩子的网名叫yxs什么意思 c++ 函数指针 和 函数类型的形参 vc6中如何定义函数指针 请大家用指向函数的指针作函数参数为我举例!谢谢! 声卡怎么下载? 电池不耐用是怎么回事 手机电池太不耐用了? 户籍在河南,学籍在郑州,在哪儿高考呀? 苹果的IOS13.5更新了哪些功能? lol启动不了? 舌苔黄是有啥病 舌苔发黄是什么原因还有异味 舌头发黄是什么症状 宝藏世界下载 为什么我的宝藏世界闪退? 如果电脑版宝藏世界下载之后显示模块失效该怎么办? 什么软件里面买的游戏全,想买游戏宝藏世界 宝藏世界如何切换战斗模式和建造模式 宝藏世界攻略 夏家三千金的主要演员 夏家三千金全集80演员表 夏家三千金叫什么