指针函数:返回类型是指针的函数!
int * fun(int x); //返回的类型是指针的函数。
函数指针:指向一个函数的指针!
int (*fun)(int x); //函数指针。返回值类型 (*指针变量名)(形参列表)
函数指针本身是指针变量。只不过指向函数。
函数指针:
例1:用typedef定义函数指针
typedef 返回类型(*新类型)(参数表)
typedef 返回类型(*新类型)(参数表)
typedef char (*PTRFUN)(int);
PTRFUN pFun;
//第二行的代码便使用这个新类型定义了变量pFun,此时就可以像使用形式1一样使用这个变量了。
char glFun(int a){
return;
}
void main(){
pFun = glFun;
(*pFun)(2);
}
typedef的功能是定义新的类型。第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int
为参数并返回char类型。后面就可以像使用int,char一样使用PTRFUN了。
例子:函数指针的使用。
#include<stdio.h>
typedef int (*
FP_CALC
)(int, int);
//声明一个变量类型FP_CALC,FP_CALC是一个指向函数的指针。函数有两个int型参数,并返回int
int
add
(int a, int b){
//函数名就是该函数所占内存的首地址。
return a + b;
}
int sub(int a, int b){
return a - b;
}
int mul(int a, int b){
return a * b;
}
int div(int a, int b){
return b? a/b : -1;
}
FP_CALC
calc_func
(char op){
//op为'+',根据op的值返回函数的地址。返回值的类型为函数指针。
switch (op){
case '+': return
add
;
//函数名就是该函数所占内存的首地址。
case '-': return sub;
case '*': return mul;
case '/': return div;
default:
return NULL;
}
return NULL;
}
int
calc
(int a, int b, char op){
FP_CALC
fp = calc_func(op);
//fp是函数指针,类型是函数指针类型。op为'+',calc_func函数返回值是add
if (fp) return fp(a, b);
//如何通过函数指针,使用函数。
else return -1;
}
void main(){
int a = 100, b = 20;
printf("calc(%d, %d, %c) = %d\n", a, b, '+',
calc(a, b, '+')
);
//调用calc函数。
printf("calc(%d, %d, %c) = %d\n", a, b, '-', calc(a, b, '-'));
printf("calc(%d, %d, %c) = %d\n", a, b, '*', calc(a, b, '*'));
printf("calc(%d, %d, %c) = %d\n", a, b, '/', calc(a, b, '/'));
}
运行结果
calc(100, 20, +) = 120
calc(100, 20, -) = 80
calc(100, 20, *) = 2000
calc(100, 20, /) = 5
|
例子2:函数指针的使用。
#include <stdio.h>
void printWelcome(int len){
printf("欢迎欢迎 -- %d/n", len);
}
void printGoodbye(int len){
printf("送客送客 -- %d/n", len);
}
void callback(int times,
void (* print)(int)){
//定义函数指针类型print,指向这样一种函数:参数是int型,返回类型为void。
int i;
for (i = 0; i < times; ++i){
print(i);
//通过函数指针print来使用函数。
}
printf("/n我不知道你是迎客还是送客!/n/n");
}
void main(void){
callback(10, printWelcome);
//调用callback函数,将 printWelcome传给函数指针。这样函数指针就可以使用函数了。
callback(10, printGoodbye);
printWelcome(5);
}
|
指针函数:
返回值是指针。这个也不常用。