函数指针:
函数指针,是一个指针,一个指向函数的指针。
我们来看一段代码:
#include<stdio.h>
#include<stdlib.h>
void test()
{
printf("hehe\n");
}
int main()
{
printf("%p\n", test);//函数的地址
printf("%p\n", &test);//函数名的地址
system("pause");
return 0;
}
来看它的运行结果:
我们发现这两个地址相同,那说明函数名的地址和函数的地址是相同的。
那我们想把test函数的地址保存起来,应该怎么存呢?
首先,能够存地址,那肯定是个指针类型,然后该指针指向函数,而且test函数的返回类型是void。所以这个变量可以存该函数的地址:
void (p*)();//这个变量p就是函数指针
我们来看个有趣的代码:
(*(void(*)0))();//其实就是实现函数调用
我们来分析一下这个代码:
1.void(*)()为函数指针类型,这个函数没有类型,没有返回值
2.(void(*)())0将0强转为函数指针类型
3.(*(void(*)())0)对0这个函数指针解引用得到函数
4.(*(void(*)())0)()这是函数调用。
void (*signal(int,void(*)(int)))(int);
分析这句代码:
1.signal为函数
2.函数的参数有两个,第一个是i整型,第二个是函数指针,该函数指针指向的函数有一个整型参数,返回类型为void
3.signal函数的返回类型为一个函数指针,该指针指向的函数有一个整型参数,返回值为void
函数指针数组:
函数指针数组就是存放指针的数组。
那函数指针数组该怎么书写呢?
我来定义一个函数指针数组:
int (*parr[10])();
parr先和[ ]结合,说明parr是数组,那数组的内容是什么呢?是int (*)(),也就是说该数组里有10个元素,每个元素都是函数指针类型。
函数指针怎么使用呢?我们来看个简单的例子:
#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 calc(int (*pfun)(int,int))
{
int x = 0;
int y = 0;
int ret = 0;
printf("请输入两个操作数:");
scanf("%d%d",&x,&y);
ret = pfun(x,y);//传过来的是函数指针,所以传过来直接用就行了
printf("ret=%d\n",ret);
}
void menu()
{
printf("****************************\n");
printf("***** 1.Add 2.Sub *****\n");
printf("***** 3.Mul 4.Div *****\n");
printf("***** 0.exit *****\n");
printf("****************************\n");
}
int main()
{
int (*pfun[5])(int,int) = {0,Add,Sub,Mul,Div};
// int (*pfun[5])(int,int)就是一个函数指针数组,该数组有5个元素,该数组存的是上面4个计算函数的地址,(第一个元素是0,是为了方便使用),
//每个元素时函数指针类型,这个函数指针所指的函数有个整型参数,返回值是整型。
int input = 0;
do
{
menu();
printf("请选择:");
scanf("%d",&input);
if(input>=1 && input<=4)
{
calc(pfun[input]);//传的就是函数指针
}
else if(input == 0)
printf("退出\n");
else
printf("选择错误\n");
}while(input);
return 0;
}
函数指针数组的指针:
这标题看着就有点发狂啊!
函数指针数组的指针,就是一个指针,该指针指向函数指针数组,这个数组里的元素是函数指针。
下面我来定义一个函数指针数组的指针:
int (*(*p)[10])();
1.(*p)说明p是指针
2.(*p)[10]说明该指针指向含有10个元素的数组
3.int (*)( )说明这个数组里的元素是函数指针类型
最后我们通过一个例子,把函数指针、 函数指针数组、 指向函数指针数组的指针放一块来看:
#include<stdio.h>
#include<stdlib.h>
void fun()
{
printf("hehe\n");
}
int main()
{
//定义一个函数指针pfun,该函数的返回值类型为void,没有参数
void(*pfun)() = fun;
//定义一个函数指针数组,存放函数指针,该数组有5个元素,每个元素都是函数指针类型
void(*pfunArr[5])();
//将函数的地址放在函数指针数组首元素内
pfunArr[0] = fun;
//将函数指针数组的地址存放在指向函数指针数组的指针内
void(*(*pptestArr)[10])() = &ptestArr;
return 0;
}