1.函数类型
C语言中的函数有自己特定的类型
函数的类型由返回值,参数类型和参数个数共同决定,int add(int i,int j) 的类型为int(int,int)
C语言中通过typedef为函数类型重命名, typedef type name(parameter list)
2.函数指针
函数指针用于指向一个函数
函数名是执行函数体的入口地址
可通过函数类型定义函数指针:FuncType* pointer;
也可以直接定义: type(*pointer)(parameter list);
pointer为函数指针变量名
type为所指函数的返回值类型
parameter list为所指函数的参数类型列表
3.函数指针的用法
#include<stdio.h>
typedef void(Func)(void);
typedef void(*Func1)(void);
void f(void)
{
printf("hello world\n");
}
int main()
{
Func* pf = f;
pf();
Func1 pf2 = f;
pf2();
void(*pf3)(void) = f;
pf3();
(*pf3)(); // 这种写法也可以,老的编译器会有这样的写法,现在仍然兼容
void(*pf4)(void) = &f; // 这种写法也可以,老的编译器会有这样的写法,现在仍然兼容
pf4();
(*pf4)(); // 这种写法也可以,老的编译器会有这样的写法,现在仍然兼容
return 0;
}
4.使用函数指针跳转到某一个固定地址
#include<stdio.h>
void f(void)
{
printf("hello world\n");
}
int main()
{
void(*pf3)(void) = "0xFFaa33"; // 固定的函数地址,这里就当作指向上面的f函数
pf3();
return 0;
}
5.使用函数指针实现回调
#include <stdio.h>
typedef int(*Weapon)(int);
void fight(Weapon wp, int arg)
{
int result = 0;
printf("Fight boss!\n");
result = wp(arg);
printf("Boss loss: %d\n", result);
}
int knife(int n)
{
int ret = 0;
int i = 0;
for(i=0; i<n; i++)
{
printf("Knife attack: %d\n", 1);
ret++;
}
return ret;
}
int sword(int n)
{
int ret = 0;
int i = 0;
for(i=0; i<n; i++)
{
printf("Sword attack: %d\n", 5);
ret += 5;
}
return ret;
}
int gun(int n)
{
int ret = 0;
int i = 0;
for(i=0; i<n; i++)
{
printf("Gun attack: %d\n", 10);
ret += 10;
}
return ret;
}
int main()
{
fight(knife, 3);
fight(sword, 4);
fight(gun, 5);
return 0;
}