你说的对啊~
double process(double(*f)(double,double))
{
int i;
double result=1;
for(i=2;i<=10;i++)
result=f(result,i);
return result;
}
通过主函数调用process()函数吧add赋值给f,也就是说让process()知道这么一个
类型的函数指针(入口),然后调用的时候就能使用了呗。result=f(result,i);
这个文件里面add的定义在process定义下面,也不用前置声明add函数,在process函数就直接可以使用了。
参数传递情况:
main函数里面:
printf("%.0f\n",process(add));
这里,add是实际参数,是add函数的入口(函数地址),这里直接使用的add地址,没有重新开辟命名空间
然后,调用了process函数:
double process(double(*f)(double,double))
这是process的头部(原谅我不知道咋说了),这时候通过main函数里面的调用,把add的地址,也就是一个指针的值复制赋值给了f,process函数被调用运行的时候开辟了f的命名空间,分配了存放地址(指针)的内存单元,值就是add的函数入口。
然后在process函数里面调用f:
result=f(result,i);
通过类似*f的访问
(再一次原谅我,具体访问方式是啥样我不清楚,只是让你能好理解一下,就跟 int a; int *add=&a; int *f=add; 差不多,这时候 使用 *add 和 *f都是访问a)
,把实际参数result和i传递给add函数的double add(double x,double y)形式参数,
调用add函数,为 x y分配内存单元,值分别是x=result,y=i然后运行函数体。
我的理解是这样的