·函数指针
首先让我们看一段代码:
int Add(int x,int y)
{
return x+y;
}
int main()
{
printf("%p\n",Add);
printf("%p\n",&Add);
return 0;
}
·这是结果:
·这是我们Add函数的地址,我们给出函数的指针变量用来存放某一函数的地址。
int (*p)(int ,int)
·定义p为一个指向函数的指针变量,它可以指向函数的类型为整型且有两个整型参数的函数。注:如果写成*p(int,int),那么*则是对函数的返回值进行解引用。
·函数指针数组
·数组是⼀个存放相同类型数据的存储空间,那要把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?
int (*parr1[10]])();
·parr1先和[ ]结合,说明parr1这是一个数组,数组的内容为int(*)( )类型的函数指针。
·那么函数指针数组有什么用呢?我们那下面的转移表进行举例。
·代码如下图所示:
#include <stdio.h>
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a*b;
}
int div(int a, int b)
{
return a / b;
}
int main()
{
int x, y;
int input = 1;
int ret = 0;
while (input)
{
printf( "*************************\n" );
printf( " 1:add 2:sub \n" );
printf( " 3:mul 4:div \n" );
printf( "*************************\n" );
printf( "请选择:" );
scanf( "%d", &input);
switch (input)
{
case 1:
printf( "输⼊操作数:" );
scanf( "%d %d", &x, &y);
ret = add(x, y);
break;
case 2:
printf( "输⼊操作数:" );
scanf( "%d %d", &x, &y);
ret = sub(x, y);
break;
case 3:
printf( "输⼊操作数:" );
scanf( "%d %d", &x, &y);
ret = mul(x, y);
break;
case 4:
printf( "输⼊操作数:" );
scanf( "%d %d", &x, &y);
ret = div(x, y);
break;
default:
printf( "选择错误\n" );
break;
}
printf( "ret = %d\n", ret);
}
return 0;
}
·这是我用switch调用函数实现的一个计算器,那么如果用函数指针数组应该如何实现呢?
int main()
{
int x, y;
int input = 1;
int ret = 0;
int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //转移表
while (input)
{
printf( "*************************\n" );
printf( " 1:add 2:sub \n" );
printf( " 3:mul 4:div \n" );
printf( "*************************\n" );
printf( "请选择:" );
scanf( "%d", &input);
if ((input < 4 && input > 1))
{
printf( "输⼊操作数:" );
scanf( "%d %d", &x, &y);
ret = (*p[input])(x, y);
}
else
printf( "输⼊有误\n" );
printf( "ret = %d\n", ret);
}
return 0;
}
·我们给出了main函数的写法,我们将每个函数存放在这个数组当中,定义一个函数指针数组,通过输入input来选择所需要的函数,这样的写法是否比上面的更加优化而且简单了呢?
·函数指针的数组的指针
·指向函数指针数组的指针是⼀个指针。
·指针指向⼀个数组 ,数组的元素都是函数指针。
void test(const char* str)
{
printf("%s\n", str);
}
int main()
{
//函数指针pfun
void (*pfun)(const char*) = test;
//函数指针的数组pfunArr
void (*pfunArr[5])(const char* str);
pfunArr[0] = test;
//指向函数指针数组pfunArr的指针ppfunArr
void (*(*ppfunArr)[10])(const char*) = &pfunArr;
return 0;
}
·如上图所示,这就是函数指针的数组的指针的定义。