指针函数与函数指针

 

 指针函数与函数指针


  对于没有系统的学习过C++的同学来说,指针仿佛是一个难以逾越的鸿沟,但是其实指针没那么复杂,或者可以这么说,
 我们选择性的忽略指针,比如说就把指针当做一个实例对象
 
 例如 类Person
 有两种实例化方法
 1. Person p; //在栈里分配内存,作用域内有效,自动释放
 2. Person *p = new Person(); //在堆内分配内存,需要手动调用 delete p; 来释放
 
 其实在这里,完全可以抛弃指针的概念,就认为两个都是对象,只是调用成员函数成员变量的方法不同,还有作用域不同就可以了。
 之所以提到这些,就是引出今天要谈的一个概念,那就是指针函数和函数指针的概念,这两个概念,相信很多人都不明白。
 今天我们就简单探讨一下。
 
 1.指针函数
 
 在C语言这种面向过程的语言中,整个程序都是通过函数调用来一步一步实现的,对于函数,相信大家都再熟悉不过了。
 例如:
 
 void func();
 int func();
 float func();
 char func();
 
 char* func();
 int * func();
 float *func();
 
 我们看到前四个函数的返回类型,是标准的系统类型,void ,int ,float,char。这个毫无疑问,后三个则返回值都是指针类型,
 C语言函数的返回类型,可以是指针类型。这就称之为指针函数,概念很简单。再简单地说就是返回一个地址指针。
 
 类型:
 类型名 *函数名(函数参数列表);
 
 
 2.函数指针
 
 函数指针是本文介绍的重点,什么是函数指针,说白了就是一个指向函数的指针。首先它是一个指针,它指向的是一个函数的入口地址,
 函数的入口地址在哪里呢,函数就是内存中的一片区域,函数有一个入口地址,函数指针就是指向的这个入口地址。
 
 
 例如:
 
 void func();
 void func(int a);
 void func(int a,char b);
 
 函数指针的作用是什么呢,有两方面,一个是为了调用函数提供另一种途径,二是可以把函数当做一个变量来传递,起到回调的作用。
 个人认为后一点很重要,在实际的编码中用到很多,可节省不少工作量。
 
 上述三个函数,我们可以写成如下形式:
 
 void (*Func1)();
 void (*Func2)(int a);
 void (*Func3)(int a,char b);
 

 这样在调用的时候就可以用如下方法:
 
 (*Func1)();
 (*Func2)(1);
 (*Func3)(1,'a');
 
 下面进行下一步操作,我们把它们声明成一种类型:
 
 typedef void (*Func1)();
 typedef void (*Func2)(int a);
 typedef void (*Func3)(int a,char b);
 
 这是就可以定义 Func1,Func2,Func3类型的变量了,我们就可以把函数当做参数传递了。



下面附上代码

//
//  main.cpp
//  Test
//
//  Created by 王猛 on 13-11-15.
//  Copyright (c) 2013年 wangmeng. All rights reserved.
//

#include <iostream>

typedef void (*Func1)();
typedef void (*Func2)(int a);
typedef void (*Func3)(int a,char b);


void func1()
{
    printf("%s  call
",__FUNCTION__);
}

void func2(int a)
{
    printf("%s  call a=%d
",__FUNCTION__,a);
}

void func3(int a,char b)
{
    printf("%s  call a=%d,b=%c
",__FUNCTION__,a,b);
}


void callBack1(Func1 f)
{
    (*f)();
}

void callBack2(Func2 f, int a)
{
    (*f)(a);
}

void callBack3(Func3 f, int a, char b)
{
    (*f)(a,b);
}

int main(int argc, const char * argv[])
{

    callBack1(func1);
    callBack2(func2, 1);
    callBack3(func3, 1, 'b');
    
    func1();
    func2(1);
    func3(1, 'b');

    
    return 0;
}


输出结果是:


原文地址:https://www.cnblogs.com/fuhaots2009/p/3503336.html