C++ 函数指针的声明与使用

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 = &num;
    // 打印结果
    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

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值