1. 函数指针的定义
顾名思义,函数指针就是函数的指针。它是一个指针,指向一个函数。
2.函数指针的使用
我们定义了一个函数指针,但如何来使用它呢?先看如下例:
#include <stdio.h>
#include <string.h>
char * fun(char * p1, char * p2)
{
int i = 0;
i = strcmp( p1, p2 );
if (0 == i)
{
return p1 ;
}
else
{
return p2 ;
}
}
int main()
{
char * (*pf)(char * p1, char * p2);
pf = &fun;
(*pf) ( "aa", "bb" );
return 0;
}
3.函数指针数组
现在我们清楚表达式 “char * (*pf)( char * p) ”定义的是一个函数指针pf 。既然pf
是个指针,那就可以储存在个数组。把上式修改下:
char * (*pf[3])(char * p);
这是定义一个函数指针数组。它是一个数组,数组名为pf ,数组内存储了3 个
指向函数的
指针。这些指针指向些返回值类型为指向字符的指针、参数为亿个指向字符
的指针的函数
数。这念起来似乎有点拗口。不过不要紧,关键是你明这是一个指针数组,
是数组。
函数指针数组怎么使用呢?也给出一个非常简单的例字,只要真正掌握了
使用方法,
再复杂的问题都可以应对。如下:
#include <stdio.h>
#include <string.h>
char * fun1(char * p)
{
printf( "%s\n", p);
return p;
}
char * fun2(char * p)
{
printf( "%s\n", p);
return p;
}
char * fun3(char * p)
{
printf( "%s\n", p);
return p;
}
int main()
{
char * (*pf[3])(char * p);
pf[0] = fun1; // 可以直接赋值函数名
pf[1] = &fun2; // 可以给函数名加上取地址符
pf[2] = &fun3;
pf[0]( "fun1");
pf[0]( "fun2");
pf[0]( "fun3");
return 0;
}
4.函数指针的数组的应用(简单计算器的实现):
#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;
}
使用函数指针数组的实现:
#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;
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;
}
本文出自 “pawnsir的IT之路” 博客,请务必保留此出处http://10743407.blog.51cto.com/10733407/1749358