C语言高手请进:使用函数指针调用函数的问题----

代码段1如下:int(*max)(int,int);intadd(intx,inty);intmain(){inta=0;max=add;a=(*max)(65,43);... 代码段1如下:
int (* max)(int ,int);
int add(int x,int y);
int main( )
{
int a = 0;
max = add;
a = (* max)(65,43); //~~~~~~使用(* max)作为函数名调用函数~~~~~~~~~~~//
printf("%d",a);
retrun a;
}
int add(int x,int y)
{

int z =0;
z = x + y;
return z;

}

代码段2如下:
int (* max)(int ,int);
int add(int x,int y);
int main( )

{

int a = 0;
max = add;
a = max(65,43);
//~~~~~~使用 max作为函数名调用函数~~~~~~~~~~~//
printf("%d",a);
retrun a;
}
int add(int x,int y)
{
int z =0;
z = x + y;

return z;
}

调试得出结论如下两点:
a = (* max)(65,43)与a = max(65,43)调试得出来的a值是相同的
使用printf("%d\n%d\n",(* max), max);可以输出相同的地址

疑问:???????
C语言书上教大家的是第一种代码,自己分析的思路是这样: 一开始就定义max为函数指针,是个地址, add是函数名,代表函数的进口地址,既然两者都是地址,同时己让函数指针指向函数名了(max = add),所以本人认为使用函数指针调用函数的时候,就直接使用max(65,43);就可以了,为什么谭浩强C语言书上教大家的是(*max)(65,43)这种形式????为什么都可以得出相同的结果??
没有人回答这个问题吗??

小弟先谢谢了。。。
展开
 我来答
haiyangfenghuo
2015-02-09 · TA获得超过2439个赞
知道大有可为答主
回答量:2388
采纳率:0%
帮助的人:779万
展开全部
你可以理解函数名称本身就是个地址,你可以认为它就是个指针,而你声明的函数指针也是指针。当然仅仅是理解,其实是有差别的。
追问
我的问题是为什么如下两个形式都可以成功调用函数:

a = (* max)(65,43); //~~~~~~使用(* max)作为函数名调用函数~~~~~~~~~~~//

a = max(65,43); //~~~~~~使用 max作为函数名调用函数~~~~~~~~~~~//
追答
如果需要看它的实质,就需要到编译器里查看编译的环节。因为函数名称代表的就是函数的入口地址,只要调用了,那它就会转到入口地址去执行代码,至于两种形式确实可行,在我们当前使用的vs及vc6.0的编译环境里都适用。
GarfieldGCat
2015-02-09 · TA获得超过500个赞
知道小有建树答主
回答量:445
采纳率:92%
帮助的人:270万
展开全部
本身函数名就是代表函数的入口地址,另外ANSI C标准规定两种等价,具有相同作用,更推荐更自然的写法。

但是在K&R C标准下只允许(*max)();类型来使用
追问
你提到ANSI C标准规定两种等价

请问你是在谭浩强哪个版本C程序设计哪页见过这两种等价?
我想找出来学习学习
追答

http://www.open-std.org/JTC1/SC22/WG14/www/standards

C99标准文档,位于

Language 6.5.2.2 Function calls小节, p69


已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式