一、函数指针:
void test()
{
printf("c语言\n");
}
int main()
{
printf("%p\n",test);
printf("%p\n",&test);
return 0;
}
函数指针:函数也是与地址的,函数名(或者&函数名)就是函数的地址
int my_test(const char* s)
{
return 0;
}
int main()
{
int (*pf)(const char*s)=my_test;
//第二个括号表示:函数;括号内是函数数据的类型
//前面int表示返回类型
//而pf的类型就是int(*)(const char*s)
return 0;
}
二、函数指针数组:
是一个存放函数指针的数组——是一种指针数组
int Add(int x,int y)
{
return x+y;
}
int main()
{
int (*pa)(int,int)=Add;//函数指针
int (*pfA[4])(int x,int y)=Add;//函数指针数组
//pfA会先和[4]线结合,形成数组
return 0;
}
例子:【转移表】
三、指向函数指针数组的指针:
int Add(int x,int y)
{
return x+y;
}
int main()
{
int (*pa)(int,int)=Add;
int (*pfA[4])(int x,int y)=Add;
int (*(*ppfA)[4])(int x,int y)=&pfA;
//ppfA是一个指针,指向了一个存放函数指针的数组
//ppfA会先和*结合表示指针—>再和[4]结合表示数组
return 0;
}
函数指针的例子:
void menu()
{
printf("*************************************\n");
printf("*********1.Add 2.Sub*********\n");
printf("*********3.Mul 4.Div*********\n");
printf("********* 0.exit *********\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(*pf)(int,int))
//calc接收到的是函数的地址:因此需要函数指针接收
//第一个int表示返回的类型,*pf表示函数指针,后面两个int表示指向的参数是int
{
int x = 0;
int y = 0;
int ret = 0;
printf("请输入需要计算的数字:\n");
scanf("%d %d", &x, &y);
ret = pf(x, y);
printf("计算结果是:%d\n", ret);
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择:->\n");
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;
}