读书人

函数名函数指针到底代表什么?解决思

发布时间: 2012-02-16 21:30:36 作者: rapoo

函数名,函数指针到底代表什么??
int f(int)
{
return 1;
}

int (*f1)(int);
int (*f2)(int);

f1 = f;
f2 = &f;

f1(1); // (*f1)(1); 也可以
f2(1); // (*f2)(1) 也可以

怎样理解f?
怎样理解f1?



[解决办法]
程序在内存中的起始地
[解决办法]
函数指针是一个指针,指向函数的地址
函数是一群代码
函数名是一个用于调用的信息
[解决办法]
f是函数名。f1是函数指针。
f1 = f;的作用就是把函数的指针指向函数的入口地址。
[解决办法]
f1(1); // (*f1)(1); 也可以

两种都可以,而且等价,你可以把它看作使用函数指针调用函数的约定.
[解决办法]
f2 = &f;这句怎么理解?
和f2 = f;等价吗?
f是函数名即函数入口地址。
&f呢?

[解决办法]
函数的名字本身就是函数地址,下面给你一个使用函数指针的经典例子,求解积分。
下面的例子中fsin、fcos、fexp、func1、func2是任何一个初等函数或者能被化为初等函数的
函数。
这些函数都是调用者本人来写的。
至于Integral函数则是利用矩形法来求积分的一个C函数,它是一个通用的函数,可能精确度是个问题。但是,不妨碍作为例子使用。
这个Integral函数不用动,你可以根据被积函数的不同,写相应的C函数,然后把函数名字传给Integral函数即可。


#include <stdio.h>
#include <math.h>
#include <stdlib.h>

double fsin(double x);
double fcos(double x);
double fexp(double x);
double func1(double x);
double func2(double x);
//func是被积函数,a是积分下限,b是积分上限,n是等分区间数
double Integral(double (*func)(double),double a,double b,int n);
int main(void)
{
double a,b;
double(*p)(double);
int n=20;

a = 0;b = 1;
printf( "%f\n ",Integral(fsin,a,b,n));

a = -1;b = 1;
printf( "%f\n ",Integral(fcos,a,b,n));

a = 0;b = 2;
printf( "%f\n ",Integral(fexp,a,b,n));

a = 0;b = 2;
printf( "%f\n ",Integral(func1,a,b,n));

a = 0;b = 2;
printf( "%f\n ",Integral(func2,a,b,n));

system( "pause ");
return 0;
}
double fsin(double x)
{
return sin(x);
}
double fcos(double x)
{
return cos(x);
}
double fexp(double x)
{
return exp(x);
}
double func1(double x)
{
return (1+x)*x;
}
double func2(double x)
{
return (2*x+3)*x;
}
double Integral(double (*func)(double),double a,double b,int n)
{
double sum,x,h;
int i;

x = a;
sum = 0;
h = (b-a)/n;
for(i=0;i <n;i++)
{
x = x + h;
sum += (*func)(x) * h;
}
return sum;
}

[解决办法]
函数名就是函数的入口地址,它和函数指针的作用是相同的。

读书人网 >C语言

热点推荐