问题描述
- 函数指针的一例子,求教?
-
#include
int max(int,int);void main()
{
int a=2,b=3;
int(*pmax)(int,int);
pmax=max;
printf("max is %dn", (*pmax)(a,b));
}
int max(int x , int y)
{
return x>y?x:y;
}
输出语句里调用max函数时(*pmax)(a,b)或(pmax)(a,b)都是正确的这是怎么回事???
解决方案
例如:void (*fptr)();
把函数的地址赋值给函数指针,可以采用下面两种形式:
fptr=&Function;
fptr=Function;
取地址运算符&不是必需的,因为单单一个函数标识符就标号表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。
可以采用如下两种方式来通过指针调用函数:
x=(*fptr)();
x=fptr();
第二种格式看上去和函数调用无异。但是有些程序员倾向于使用第一种格式,因为它明确指出是通过指针而非函数名来调用函数的。
解决方案二:
写法问题而已
参考
你帖子的回复
解决方案三:
http://bbs.csdn.net/topics/390986017
解决方案四:
int (*pFunction)(float,char,char)=NULL;
给函数指针赋值,就是为函数指针指定一个函数名称。这个过程很简单,下面是两个例子:
int func1(float f,int a,int b){return f*a/b;}
int func2(float f,int a,int b){return f*a*b}
然后我们给函数指针pFunction赋值:
pFunction=func1;
pFunction=&func2;
上面这段代码说明了两个问题:
(1)一个函数指针可以多次赋值(想想C++中的引用)
(2)取地址符号是可选的,却是推荐使用的。
我们可以思考一下为什么取地址符号是可选的,在普通的指针变量赋值时,如上面所示,需要加取地址符号,而这里却是可选的?这是由于要同时考虑到两个因素(1)避免二义性(2)形式一致性。在普通指针赋值,需要加取地址符号是为了区别于将地址还是将内容赋给指针。
而在函数赋值时没有这种考虑,因为这里的语义是清晰的,加上&符号是为了和普通指针变量一致---“因为一致的时候就不容易出错”。
最后我们来使用这个函数:
pFunction(10.0,’a’,’b’);
(*pFunction)(10.0,’a’,’b’);
上面这两种使用函数指针调用函数的方式都是可以的,原因和上面一样。
原地址:http://hipercomer.blog.51cto.com/4415661/792300
解决方案五:
int (*pFunction)(float,char,char)=NULL;
给函数指针赋值,就是为函数指针指定一个函数名称。这个过程很简单,下面是两个例子:
int func1(float f,int a,int b){return f*a/b;}
int func2(float f,int a,int b){return f*a*b}
然后我们给函数指针pFunction赋值:
pFunction=func1;
pFunction=&func2;
上面这段代码说明了两个问题:
(1)一个函数指针可以多次赋值(想想C++中的引用)
(2)取地址符号是可选的,却是推荐使用的。
我们可以思考一下为什么取地址符号是可选的,在普通的指针变量赋值时,如上面所示,需要加取地址符号,而这里却是可选的?这是由于要同时考虑到两个因素(1)避免二义性(2)形式一致性。在普通指针赋值,需要加取地址符号是为了区别于将地址还是将内容赋给指针。
而在函数赋值时没有这种考虑,因为这里的语义是清晰的,加上&符号是为了和普通指针变量一致---“因为一致的时候就不容易出错”。
最后我们来使用这个函数:
pFunction(10.0,’a’,’b’);
(*pFunction)(10.0,’a’,’b’);
上面这两种使用函数指针调用函数的方式都是可以的,原因和上面一样。
原地址:http://hipercomer.blog.51cto.com/4415661/792300
解决方案六:
点了一次,发了2遍,还没有删除按钮。
csdn这个功能做的真鸡肋。
作用和论坛也很像啊。