函数指针介绍
就像 char
和 int
一样,函数是 C 的基本特征。因此,你可以声明一个指针:这意味着你可以传递哪个函数来调用另一个函数来帮助它完成它的工作。例如,如果你有一个显示图形的 graph()
函数,你可以将哪个函数传递给 graph()
。
// A couple of external definitions to make the example clearer
extern unsigned int screenWidth;
extern void plotXY(double x, double y);
// The graph() function.
// Pass in the bounds: the minimum and maximum X and Y that should be plotted.
// Also pass in the actual function to plot.
void graph(double minX, double minY,
double maxX, double maxY,
???? *fn) { // See below for syntax
double stepX = (maxX - minX) / screenWidth;
for (double x=minX; x<maxX; x+=stepX) {
double y = fn(x); // Get y for this x by calling passed-in fn()
if (minY<=y && y<maxY) {
plotXY(x, y); // Plot calculated point
} // if
} for
} // graph(minX, minY, maxX, maxY, fn)
用法
因此,上面的代码将描绘你传递给它的任何函数 - 只要该函数满足某些条件:即,你传递 double
并获得 double
。有许多功能 - sin()
,cos()
,tan()
,exp()
等 - 但有许多不是,如 tihuan11 本身!
句法
那么如何指定哪些功能可以传递到 graph()
以及哪些功能不可以?传统方法是使用可能不容易阅读或理解的语法:
double (*fn)(double); // fn is a pointer-to-function that takes a double and returns one
上面的问题是尝试同时定义两件事:函数的结构,以及它是指针的事实。那么,拆分两个定义! 但是通过使用 typedef
,可以实现更好的语法(更易于阅读和理解)。