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)这种形式????为什么都可以得出相同的结果??
没有人回答这个问题吗??
小弟先谢谢了。。。 展开
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)这种形式????为什么都可以得出相同的结果??
没有人回答这个问题吗??
小弟先谢谢了。。。 展开
2个回答
展开全部
你可以理解函数名称本身就是个地址,你可以认为它就是个指针,而你声明的函数指针也是指针。当然仅仅是理解,其实是有差别的。
追问
我的问题是为什么如下两个形式都可以成功调用函数:
a = (* max)(65,43); //~~~~~~使用(* max)作为函数名调用函数~~~~~~~~~~~//
a = max(65,43); //~~~~~~使用 max作为函数名调用函数~~~~~~~~~~~//
追答
如果需要看它的实质,就需要到编译器里查看编译的环节。因为函数名称代表的就是函数的入口地址,只要调用了,那它就会转到入口地址去执行代码,至于两种形式确实可行,在我们当前使用的vs及vc6.0的编译环境里都适用。
展开全部
本身函数名就是代表函数的入口地址,另外ANSI C标准规定两种等价,具有相同作用,更推荐更自然的写法。
但是在K&R C标准下只允许(*max)();类型来使用
但是在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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询