指针函数与函数指针

2014-11-24 07:20:20 · 作者: · 浏览: 0

指针函数与函数指针


对于没有 系统的学习过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 
  
   

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


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

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

void func3(int a,char b)
{
    printf("%s  call a=%d,b=%c\n",__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;
}

  

输出结果是: