C++函数指针
一 函数指针是什么
1.函数指针是指针
- 函数指针也是指针的一种,是指针的子集,所以它应该有指针的一些特性;
- 函数指针,名字里有函数,估计也附带了函数的一些特性(参数列表)。
2.函数指针该如何声明?
我们可以和int类型的指针的声明进行比对一下:
声明一个int型指针:
int *p ;
声明一个函数型(假如是一个有两个int类型的参数以及一个 int类型的返回值)的指针:
int (*pFunc)(int, int);
我们把指针名称提出来看一下,
整形指针 | 函数指针 |
---|---|
int * | int (*)(int, int) |
二者不同的只是 函数指针多了一个参数列表
3.函数指针的使用
既然是指针,那就要指向一个地址,变量有地址, 函数同样有地址。
我们再来比对一下;
1.int型指针的使用:
#include<iostream>
int main()
{
int num = 20;
// int指针声明, 这里没有直接指向NULL
int *p;
// 指针指向num的地址, 整形变量取得地址要用 &
p = #
// 打印结果
std::cout << *p <<std::endl;
return 0;
}
2.函数型指针的使用:
#include<iostream>
// 函数声明, 比对1中的 int num = 20;
int add(int a, int b);
int main()
{
// 函数指针的声明, 比对 1 中的 int * p;
int (*pFunc)(int, int);
// 指向函数的地址,(函数的名字就是函数的地址)
pFunc = add;
// 打印结果, 比对 1 中的打印, 仅仅是多了一个参数列表
std::cout << (*pFunc)(2, 3) << std::endl;
return 0;
}
int add(int a, int b)
{
return a + b;
}
由此可以看出, 函数指针和指针的使用是有异曲同工之妙的,无非是多了一个参数列表。
二 typedef函数指针的用法
1.typedef介绍
首先来看看typedef和define的比较:
- 相同点:typedef 的行为有点像#define宏, 用其实际类型替代同义字
- 不同点:typedef在编译时被解释, 因此让编译器来应付超越预处理器能力的文本替换
2.typedef 的用法
1.typedef ”起别名“ 的方式是这样的:
typedef struct{
int id;
int name;
}Student;
// 此时, 我们就可以使用MY_TYPE来定义该结构体的实例了。
Student student_one;
可以总结为:typedef 原变量类型 别名
那我们用来为函数指针起别名:
typedef int (*PFUN)(int, int);
没看懂? 换个展示方式:
typedef int(*)(int, int) PFUN; // 你好像不能这么去写, 不过可以这么去看。所以还是要按照上面的方式去写
这样看就对应了typedef 原变量类型 别名 的使用方式。
我们可以解释为:这个声明引入了 PFUN 类型作为 函数指针(参数:两个int类型, 返回值:int)的别名。
2.typedef为函数指针起别名
第一大节的main函数中,我们使用 int(*pFun)(int, int)的方式声明了一个 pFun函数指针,这次我们用typedef来为函数起个别名。
#include <iostream>
// 用typedef 为函数指针起别名。 相当于 typedef int(*)(int, int) PFUN
typedef int(*FPUN)(int, int);
int add(int a, int b);
int main()
{
// 函数指针的声明 int(*PFUN)(int, int) ==> int(*pFunc)(int, int)
PFUN pFunc;
pFunc = add;
std::cout<< (*pFUnc)(2, 3) << std::endl;
return 0;
}
int add(int a, int b)
{
return a + b;
}
三 实践
1.实现 根据输入不同的运算符,调用不同的函数进行加减乘除的运算, 并输出结果
先说明几点~
- 函数指针是可以做返回值的 (记得之前提到的嘛,函数指针也是指针, 指针能做返回值,函数指针当然也可以)
直接上代码
#include <stdio.h>
// 为函数指针起一个别名PFUN 函数指针指向返回类型为int, 参数为两个int 的函数
typedef int (*PFUN)(int, int);
int add(int a, int b);
int sub(int a, int b);
int mul(int a, int b);
int div(int a, int b);
// 声明一个函数, 用函数指针PFUN做返回值, 所以该函数可以说是指针函数
PFUN calc_func(char op);
int calculate(int a, int b, char op);
int main()
{
int a = 100, b = 5;
printf("calculate(%d, %d, %c) = %d\n", a, b, '+', calculate(a, b, '+'));
printf("calculate(%d, %d, %c) = %d\n", a, b, '-', calculate(a, b, '-'));
printf("calculate(%d, %d, %c) = %d\n", a, b, '*', calculate(a, b, '*'));
printf("calculate(%d, %d, %c) = %d\n", a, b, '/', calculate(a, b, '/'));
return 0;
}
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;
}
// 判断输入的字符op, 返回不同的函数地址 (函数的地址就是函数名字)
PFUN calc_func(char op)
{
switch (op)
{
case '+': return add;
case '-': return sub;
case '*': return mul;
case '/': return div;
default:
return NULL;
}
// 指针可以指向空啊, 所以函数指针也可以
return NULL;
}
int calculate(int a, int b, char op)
{
// 既然calc_func这个函数的返回类型是函数指针类型, 那我们就用一个函数指针来接返回值
PFUN pFunc = calc_func(op);
if (pFunc)
{
return pFunc(a, b);
}
return -1;
}
以上就是我个人对函数指针的一点见解与实操,如果有错误欢迎大家指出,我会及时改正,以免传播错误信息~
文章参考:http://blog.sina.com.cn/s/blog_5e71ee700100fo13.html