1.函数指针
#include <stdio.h>
int fun(int x, int y) {
return 0;
}
int main() {
int x, y;
int (*p1)(int, int) = &fun;//p为一个指向函数的指针,函数有两个int类型的参数,函数的返回值是int类型
int (*p2)(int, int) = fun;//fun与&fun是等价的,它们都表示函数fun的地址
//(*p)(x,y)与p(x,y)是等价的,前面的*没有意义,可以是任意多个
(*p)(x, y);
p(x, y);
(*(void (*)())0)();
//调用0地址处的函数
//该函数无参,返回类型是void
//1.void (*)()函数指针类型
//2.(void (*)())0强制类型转换
int (*p3[2])(int, int) = { NULL,fun };//函数指针数组定义,函数指针数组又叫转移表
int (*(*p4)[2])(int, int) = &p3;//指向函数指针数组的指针
//回调函数:如果把一个函数的地址作为参数传递给另一个函数,当这个指针被用来调用其指向的函数时,我们就说这是回调函数。
return 0;
}
void (*signal(int, void(*)(int)))(int);
//signal是一个函数
//signal的一个参数是int类型的,另一个参数是函数指针
//该指针指向一个参数类型为int,返回类型为void的函数
//signal的返回类型为一个函数指针
//该指针指向一个参数为int返回类型为void的函数
//这是一个函数声明
//简化
typedef void(*p_funt)(int);//对void (*)(int)重命名
p_funt signal(int, p_funt);
2.计算器
#include <stdio.h>
void menu() {
printf("************************\n");
printf("*****1.加法 2.减法*****\n");
printf("*****3.乘法 4.除法*****\n");
printf("***** 0.退出 *****\n");
printf("************************\n");
}
int Add(int x, int y) {
return x + y;
}
int Sub(int x, int y) {
return x - y;
}
int Mul(int x, int y) {
return x * y;
}
int Div(int x, int y) {
return x / y;
}
int main() {
int x = 0;
int y = 0;
int input = 0;
int (*p[5])(int, int) = { NULL,Add,Sub,Mul,Div };
do {
menu();
printf("请选择:");
scanf("%d", &input);
if (input >= 1 && input <= 4) {
printf("请输入两个操作数:");
scanf("%d %d", &x, &y);
int ret=p[input](x, y);
printf("%d\n", ret);
}
else if (0 == input) {
printf("退出程序\n");
break;
}
else {
printf("输入无效,请重新输入!\n");
}
} while (input);
return 0;
}
使用回调函数的计算器
#include <stdio.h>
void menu() {
printf("************************\n");
printf("*****1.加法 2.减法*****\n");
printf("*****3.乘法 4.除法*****\n");
printf("***** 0.退出 *****\n");
printf("************************\n");
}
int Add(int x, int y) {
return x + y;
}
int Sub(int x, int y) {
return x - y;
}
int Mul(int x, int y) {
return x * y;
}
int Div(int x, int y) {
return x / y;
}
void calc(int (*p)(int, int)) {
int x = 0;
int y = 0;
printf("请输入两个操作数:");
scanf("%d %d", &x, &y);
printf("%d\n", p(x, y));
}
int main() {
int x = 0;
int y = 0;
int input = 0;
do {
menu();
printf("请选择:");
scanf("%d", &input);
switch (input) {
case 0:
printf("退出程序\n");
break;
case 1:
calc(Add);
break;
case 2:
calc(Sub);
break;
case 3:
calc(Mul);
break;
case 4:
calc(Div);
break;
default:
printf("输入无效,请重新输入!\n");
break;
}
} while (input);
return 0;
}