指针函数与函数指针
对于没有系统的学习过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; }
输出结果是: