关于函数指针

来源:百度知道 编辑:UC知道 时间:2024/09/28 13:57:46
在函数指针调用的过程中,例如:
main()
{ int max(int a,int b);
int(*pmax)();
int x=1,y=2,z;
pmax=max;
z=(*pmax)(x,y);
//z=pmax(x,y);
printf(\"maxmum=%d\",z);
}
该例子中,z=(*pmax)(x,y);与z=pmax(x,y);作用是等价的,各位高手,这将如何解释呢???
一楼的回答,感觉不太行,没解释(*PMAX)与PMAX()为什么作用相同.

day9981 - 魔法师 五级,那么应该用PMAX好一点吧.不应该用(*PMAX).在潭浩强前辈的书中,他就是那么写的,用的是PMAX,而不是(*PMAX)
问题继续讨论,是否还有更加的答案没?

我个人认为,既然,PMAX是一个指向函数入口地址的指针,和原来的函数int MAX(int,int)中"MAX"定义是一样的,两者都是指向函数入口地址的指针,那么
我感觉用PMAX更加容易理解一点.我还是多支持一点fengjian_net 的说法.

day9981,精神和勇气都可嘉,学习态度不畏权威!!!这一点大家都应该学习的,我们就应该这样去学习.不过,我看到许多书籍和网页上,函数MAX(INT,INT)中的MAX被认为是一个指针。每个人都会有错误,包括权威.本人才疏学浅,潭豪强前辈的书对于我来说无疑是学海明灯.我现在在学习C#,发现本质和C++一样的.我个人是这么感觉的。我大学毕业后从事C++BUILDER工作,前几天辞职了,想找份C++BUILDER方面的工作很难,于是想转型C#.平时遇到问题还是喜欢大家讨论讨论

在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);也是被允许的,但是