第一次看到声明函数指针的语法时你可能会感到迷惑。不过跟C的很多方面一样,一旦熟悉这种表示法,理解起来就顺理成章了。下面我们声明一个函数指针,该函数接受空参数,返回空值。
void (*foo)();
这个声明很像函数原型声明。如果去掉第一对括号,看起来就像函数foo
的原型,它接受void
,返回void
指针。不过,括号让这个声明变成了一个名为foo
的函数指针。星号表示这是个指针。图3-9说明了函数指针声明的各个部分。
注意 使用函数指针时一定要小心,因为C不会检查参数传递是否正确。
下面是声明函数指针的其他一些例子:
int (*f1)(double); //传入double,返回int
void (*f2)(char*); //传入char指针,没有返回值
double* (*f3)(int, int); //传递两个整数,返回double指针
注意 我们对函数指针在命名约定上的建议是用
fptr
做前缀。
不要把返回指针的函数和函数指针搞混。下面的f4
是一个函数,它返回一个整数指针,而f5
是一个返回整数的函数指针,变量f6
是一个返回整数指针的函数指针。
int *f4();
int (*f5)();
int* (*f6)();
可以调整这些表达式中的空白符,如下所示:
int* f4();
int (*f5)();
很明显,f4
是个返回整数指针的函数,而f5
的括号则明确地把表示“指针”的星号和函数名绑定在一起,所以它是个函数指针。