目录
1.函数指针
1.1 定义
函数指针就是指向函数的指针。
#include <stdio.h>
int Add(int a, int b)
{
return a + b;
}
int main()
{
int arr[5];
int(*pa)[5] = &arr; //pa是数组指针
int(*pf)(int, int) = &Add; //pf是函数指针
return 0;
}
1.2 函数的地址
函数和&函数,都是函数所在的位置:↓
#include <stdio.h>
void test()
{
printf("hehe\n");
}
int main()
{
printf("%p\n", test); //打印出的地址一样
printf("%p\n", &test); //打印出的地址一样
return 0;
}
1.3 函数指针的调用
#include <stdio.h>
int Add(int a, int b)
{
return a + b;
}
int main()
{
int (*pf)(int, int) = &Add;
int sum = (*pf)(2, 3);
printf("%d", sum);
return 0;
}
*pf函数指针的存在,相当于函数名
#include <stdio.h>
int Add(int a, int b)
{
return a + b;
}
int main()
{
int (*pf)(int, int) = &Add;
int (*pf)(int, int) = Add;
int sum = (*pf)(2, 3);
int sum = (pf)(2, 3);
int sum = pf(2, 3);
int sum = Add(2, 3);
printf("%d", sum);
return 0;
}
1.4 练习
1.4.1 练习1
#include <stdio.h>
int main()
{
//1.把0强制类型转换为void(*)()类型的函数指针
//2.再去调用0地址处这个参数为无参,返回类型为void的函数
( *( void(*)() )0 )(); //这是一次函数调用,调用0地址处的函数
return 0;
}
1.4.2 练习2
void ( *signal(int, void(*)(int)) )(int);
signal是一个函数声明。
这个函数的参数有两个,第一个是int类型,第二个是函数指针void(*)(int),该指针指向的函数,参数是int,返回类型是void。
这个函数的返回类型也是函数指针,该指针指向的函数,参数是int,返回类型是void。
简化代码
typedef void(* pfun_t )(int) ; //pfun_t是新的函数指针类型的名字
pfun_t signal(int, pfun_t);
void (*p)(int); //p是函数指针变量的名字
typedef void(*pf_t)(int); //pf_t是类型名
2. 函数指针数组
函数指针数组就是存放函数指针的数组,每个元素都是函数指针类型。
# 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 Div(int x, int y)
{
return x / y;
}
int main()
{
//int (*pf1)(int, int) = Add; //pf1就是Add函数的函数指针
//int (*pf2)(int, int) = Sub;
//int (*pf3)(int, int) = Mul;
//int (*pf4)(int, int) = Div;
int (*pfArr[4])(int, int) = { Add, Sub, Mul, Div };//函数指针数组
int i = 0;
for (i = 0; i < 4; i++)
{
int ret = pfArr[i](8, 4);
int ret = (*pfArr[i])(8, 4); //都一样
printf("%d\n", ret);
}
return 0;
}
应用(简易计算器小程序)
# 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 Div(int x, int y)
{
return x / y;
}
void menu()
{
printf("***************************\n");
printf("***** 1.add 2.sub ****\n");
printf("***** 2.mul 4.div ****\n");
printf("********* 0.exit ********\n");
printf("***************************\n");
}
int main()
{
int input = 0;
int x = 0;
int y = 0;
int ret = 0;
int (*pfArr[5])(int, int) = { 0, Add, Sub, Mul, Div }; //pfArr是一个函数指针的数组,也叫转移表
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
if (input == 0)
{
printf("退出计算器\n");
break;
}
else if (input <= 1 && input <= 4)
{
printf("输入2个操作数:>");
scanf("%d %d", &x, &y);
ret = pfArr[input](x, y);
printf("ret= %d\n", ret);
}
else
{
printf("选择错误\n");
}
} while (input);
return 0;
}
3. 指向函数指针数组的指针
指向函数指针数组的指针是一个 指针。
指针指向一个 数组 ,数组的元素都是 函数指针。
#include <stdio.h>
int Add(int x, int y)
{
return x + y;
}
int main()
{
int (*pa)(int, int) = Add; //函数指针
int(*pfA[4])(int, int); //函数指针的数组
int(* (*ppfA)[4])(int, int) = &pfA; //ppfA是一个指针,该指针指向了一个存放函数指针的数组
return 0;
}