9.5 指向函数的指针及返回指针值的函数
考点7 用函数指针变量调用函数
真考链接
考点7 在选择题中主要以读程序题的形式出现。此考点难度偏上,属于重点掌握知识点,在选择题中的考核概率为20%。
已经知道,可以用指针变量指向整型变量、字符型变量、字符串、数组,同样指针变量也可以指向一个函数。编译时,一个函数将被分配给一个入口地址,这个入口地址就称为该函数的指针。因此,可以通过使用一个指向函数的指针变量调用此函数。
说明:
(1)指向函数的指针变量的一般定义形式为:
数据类型(*指针变量名)();
例如:int(*s)();,“数据类型”指该函数返回值的类型。
(2)(*s)()表示定义了一个指向函数的指针变量,但目前它不是固定指向哪一个函数,而只是表示定义了这样一个类型的变量,它的作用是专门用来存放函数的入口地址。在程序中实现把某一个函数的地址赋给它,它就指向该函数,这样它的值也就确定了。在一个程序中,一个指针变量可以先后指向不同的函数,也就是说指向函数的指针变量和普通指针变量一样,可以多次使用。
(3)在给函数指针变量赋值时,只需给出函数名而不必给出参数。例如:
s=fun;/*fun为已有定义的有参函数*/
因为是将函数入口地址赋给s,不涉及参数的问题,不能写成:
s=fun(a,b);
(4)用函数指针变量调用函数时,只需将(*s)代替函数名即可(s为已经定义过的指向函数的指针变量名),在(*s)之后的括号中根据需要写上实参。
(5)对指向函数的指针变量,有些运算,如++s、--s、s+3等都是没有意义的。
小提示
在C语言中,()的优先级比*高,因此,在定义指向函数的指针变量时,“*指针变量名”外面必须有括号。
和变量的指针一样,函数的指针也必须赋初值,才能指向具体的函数。由于函数名代表了该函数的入口地址,因此,一个简单的方法是:直接用函数名为函数指针变量赋值。
真题精选
有以下程序:
int fa(int x)
{ return x*x;
}
int fb(int x)
{ return x*x*x;
}
int f(int(*f1)(),int(*f2)(),int x)
{
return f2(x)-f1(x);
}
main()
{ int i;
i=f(fa,fb,2);
printf("% d\n",i);
}
程序运行后的输出结果是( )。
A.-4 B.1 C.4 D.8
【答案】C
【解析】本题考点是函数之间的参数传递。只要注意在被调用函数中的形参是指针类型还是基类型即可。