·函数指针
首先让我们看一段代码:
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; }·如上图所示,这就是函数指针的数组的指针的定义。