函数指针定义及其用法

1. 什么是函数指针?

如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。

2. 函数指针的定义方式

函数返回值类型(*指针变量名)(函数参数列表);

3. 判断一个指针变量是指向变量的指针变量还是指向函数的指针变量:

首先看变量名前面有没有“*”,如果有“*”说明是指针变量

其次看变量名的后面有没有带有形参类型的圆括号,如果有就是指向函数的指针变量,即函数指针,如果没有就是指向变量的指针变量。

注意!!指向函数的指针变量没有 ++ 和 -- 运算。 

4. 看一些奇奇怪怪的例子:

//代码1
(*(void(*)()0)();
//调用0地址处的函数
//该函数无参,返回值类型是void
//void(*)() - 函数指针类型
//(void(*)())0 - 对0进行强制类型转换,被解释为一个函数地址
//*(void(*)())0 - 对0地址进行解引用操作
//(*(void(*)())0)() - 调用0地址处的函数


//代码2
void(*signal(int,void(*)(int)))(int);
//signal和()先结合,说明signal是函数名
//signal函数的第一个参数的类型是int,第二个参数类型是函数指针,该函数指针,返回值类型是void,参数是int类型
//signal函数的返回值类型也是一个函数指针,该函数指针,指向一个参数为Int,返回值类型是void的函数
signal是一个函数声明

//代码2写法太复杂,可以简化:
typedef void (*pfunc)(int);
pfunc signal(int,pfunc);

5.如何用函数指针

首先看看函数指针的赋值

int func(int x);
int(*p)(int x);
p=func;   
//赋值时函数func不带括号,也不带参数。
//由于函数名func代表函数的首地址,因此经过赋值以后,指针变量p就指向函数func()代码的首地址了。
//或者写成p=&func

 接下来看看函数指针具体该怎么用

#include
 int Add(int x, int y)
{
return x+y;
}

int main()
{
int(*p)(int x,int y);
p=Add;
int a=0;
int b=0;
int ret=0;
printf("请输入两个数作加法运算:>\n");
scanf("%d,%d",&a,&b);
ret=p(a,b);
printf("两个数相加后的结果为:%d\n",ret);
return 0;
}

6.函数指针数组 

定义:指向函数指针数组的指针是一个指针,指针指向一个数组,数组的元素都是函数指针

表达式如下:

函数返回值类型(*指针变量名[数组大小])(函数参数列表);

例如:

int ( * p [5] ) ( int , int )

7.函数指针数组的运用 

#include 
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 menu()
{
printf("**********************************\n");
printf("**********请选择:>****************\n");
printf("**********1.加法运算***************\n");
printf("**********2.减法运算***************\n");
printf("**********3.乘法运算***************\n");
printf("**********4.除法运算***************\n");
printf("**********0.退出程序***************\n");
return 0;
}

int main()
{
int input=0;
menu();

do {
//pArr就是函数指针数组
int (*pArr[5])(int ,int)={NULL,Add,Sub,Mul,Div};

int x=0;
int y=0;
int ret=0;

printf("请选择:>");
scanf("%d",&input);

if(input>=1 && input<=4)
{
printf("请输入2个操作数:>");
scanf("%d,%d",&x,&y);
ret=(pArr[input])(x,y);
printf("ret=%d\n",ret);
}
else if(input==0)
{
printf("退出程序\n");
break;
}
}while(input);

return 0;
}

你可能感兴趣的:(c++,开发语言)