指针和函数相联系
目录
函数指针
创建
使用
声明简化(typedef)
编辑
函数指针数组
转移表
函数指针
创建
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int add(int x,int y) { return x + y; } int main() { //创建函数指针 int (*p)(int, int) = &add; //或者int (*p)(int x, int y) = &add; return 0; }使用
通过函数指针p调用这个函数
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> //写一个打印二维数组的函数 int add(int x,int y) { return x + y; } int main() { //创建函数指针 int (*p)(int, int) = add; //int (*p)(int, int) = &add;后面 add可以加 &或不加 int ret = (*p)(2, 3); //int ret = p(2, 3);可以不写 * printf("%d\n", ret); return 0; }声明简化(typedef)
像这种复杂的函数声明,可以用typdef重新命名,方便使用
比如
但如果是数组指针类型、函数指针类型就不一样
因为这里的p是数组指针变量,想重新命名这个数组指针类型,就要改这个p变量
函数指针变量也是改这个地方
函数指针数组
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> //函数指针数组 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 main() { int(*pf[3])(int, int) = { add,sub,mul }; for (int i = 0; i < 3; i++) { printf("%d\n", pf[i](3,2)); } return 0; }只有当函数类型一样的时候才能用这个函数指针数组
类型不同不能用
理解:
函数指针是 int(*pf)(int, int)
因为要函数指针数组,所以让函数指针变量和数组相结合,就是(* pf[3] )
转移表
函数指针数组用于转移表
实现一个计算器,用于整数的加、减、乘、除
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> //函数指针数组 void menu() { printf("1.add 2.sub 3.mul 4.div\n"); printf("0.exit\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 input = 0; int x = 0; int y = 0; int ret = 0; int(*pf[5])(int, int) = { 0,add,sub,mul,div }; do { menu(); printf("请输入你的选择:"); scanf("%d", &input); if (input >= 1 && input <= 4) { printf("请输入两个数:"); scanf("%d %d", &x, &y); ret = pf[input](x, y); printf("%d\n", ret); } else if (input == 0) { printf("exit"); } else { printf("选择错误,请重新选择:\n"); } } while (input); return 0; }