C语言函数指针使用简介

       函数指针是指向函数的指针变量。 因此“函数指针”本身首先应该是一个指针变量,只不过该指针变量指向的是函数。
有了指向函数的指针变量后,就可以用该指针变量来调用函数,就如同用指针变量可引用其他类型变量一样,函数指针有两个用途:调用函数和做函数的参数。

1. 函数指针的声明:

返回值类型 ( * 指针变量名) ([形参列表]);

如: int(* func) (int a, int b);

声明了一个函数指针func, func指向的函数必须满足两个整形的参数,返回值为int, 其中指针名称的()不能省略,否则将变成普通函数的声明。

2. 函数的调用

(1)直接定义函数指针

#include "stdafx.h"
#include <iostream>
using namespace std;

int sum(int a, int b)
{
    return (a + b);
}

int subtract(int a, int b)
{
    return (a - b);
}

int _tmain(int argc, _TCHAR* argv[])
{
    std::cout << sum << endl;
    std::cout << *sum << endl;
    std::cout << &sum << endl;
    int(*func)(int, int);
    func = sum;
    int c = (*func)(1, 2);
    std::cout << c << endl;
    std::cout << func << endl;
    std::cout << *func << endl;
    std::cout << *&func << endl;

    int d = sum(1, 2);
    std::cout << d << endl;


    std::cout << subtract << endl;
    std::cout << *subtract << endl;
    std::cout << &subtract << endl;
    func = subtract;
    c = (*func)(1, 2);
    std::cout << c << endl;
    std::cout << func << endl;
    std::cout << *func << endl;
    std::cout << *&func << endl;

    d = subtract(1, 2);
    std::cout << d << endl;

    return 0;
}

运行结果如下:

通过上面的运行结果可以发现:

      函数的名称其实就是该函数的入口地址,可以取地址或者直接赋值给函数指针。函数指针func只是声明了指向的函数的类型(即函数返回值和参数类型),只要是符合该类型的函数都可以赋值给该函数指针func。

(2) 先定义函数指针类型,再声明变量并赋值

 先定义函数指针类型:
          typedef int (*fun_ptr)(int,int);
 再声明变量,赋值:
           fun_ptr fp = sum;
     赋给函数指针的函数必须和函数指针所指的函数原型是一致的。

#include "stdafx.h"
#include <iostream>
using namespace std;

int sum(int a, int b)
{
    return (a + b);
}

int subtract(int a, int b)
{
    return (a - b);
}

int _tmain(int argc, _TCHAR* argv[])
{
    typedef int(*fun_ptr)(int, int);
    fun_ptr fp = sum;
    int c = fp(1, 2);
    std::cout << c << endl;
    return 0;
}

3.  函数指针做函数的参数

    函数指针我所使用到的最常用的就是用作回调函数。

比如信号处理函数,函数指针的定义和使用如下:
typedef void (*__sighandler_t) (int);
__sighandler_t   signal (int __sig, __sighandler_t __handler);

#include <iostream>
#include <signal.h>
#include <unistd.h>
using namespace std;

void  handler(int signo)
{
    std::cout << "catch a signal:" << signo << endl;
}

void handler1(int sig)
{
    std::cout << "catch a signal:" << sig << endl;
}

int main()
{
    cout << "Hello World!" << endl;
    signal(SIGINT, handler);
    signal(SIGTSTP, SIG_DFL);
    while(true)
    {
        std::cout << "test111" << std::endl;
        sleep(1);
    }
}

运行结果如下:

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值