C/C++函数指针总结之一:C函数指针

!!!!!!!欢迎转载,请注明本文链接: http://blog.csdn.net/mosaic/article/details/7199777 !!!!!! 

 

一.函数指针的定义,赋值,(函数)调用

看一行C代码:

int *func1(int, int);

该代码含义很清楚:定义了一个func1函数,有两个整型形参,返回值为int *,即int型指针。

再看行C代码:

int (*func2)(int, int);

和前面一行相比,多了一对括号。就是这对括号,改变了操作符的结合顺序,从而完全改变了代码的含义。这个代码实际上是定义了一个指向某一类函数的指针(注意是一个实实在在的指针变量),即函数指针。它可以指向诸如:

int func3(int, int);

这样的函数。

在实际使用中,一般都用typedef来定义函数指针的类型。如:

typedef int (*FuncPtr)(int, int);

定义了一个函数指针的类型。既然是类型,就可以用它来定义变量:

FuncPtr func4;

这样,func4和func2是两个属于同样类型的指针变量。这种typedef的方式可以使函数指针的定义看起来更简单,也更直观。

现在让func4和func2都可以指向func3:

func2 = func4 = &func3;

上面的&为取地址操作符,可有可无。据说有&的形式符合标准,在不同的编译器之间具有更好的移植性。

因为func2和func4是函数的指针,那么解引用操做应该得到对应的函数,因此解引用之后就可以和func3一样来用:

int x = (*func2)(1 , 2);
int y = (*func4)(1, 1);

大部分编译器也支持另一种语法:

int x = func2(1 , 2);
int y = func4(1, 1);

但是麻烦一点的通用性更好。

二.函数指针的大小(sizeof)

在C里面,函数指针的大小和其他指针是一样的,即一般32位情况下为4字节,64位为8字节。

三.函数指针的比较

和普通指针类似,函数指针也可以做比较。不过比大小可能没有太大的意义,比较相等或不等有一些用途(比如和0比以检查是否为空指针)。

 

下面是完整的例子:

#include <iostream>
#include <iomanip>
using namespace std;

bool func3(int a, int b){
    return a<b;
}

int main()
{
    bool (*func2)(int, int) = &func3; //or  = func3
    bool x = (*func2)(1, 2);
    cout << "x=" << std::boolalpha << x << endl;

    typedef bool (*FuncPtr)(int, int);
    FuncPtr func4 = NULL;
    func4 = &func3;  //or func4 = func3;
    bool y = (*func4)(2,1);
    cout << "y=" << std::boolalpha << y << endl;

    cout << "sizeof func2=" << sizeof func2 << endl;
    cout << "sizeof func3=" << sizeof &func3 << endl;
    cout << "sizeof func4=" << sizeof func4 << endl;
    cout << "sizeof FuncPtr=" << sizeof(FuncPtr) << endl;

    if(func2 != func4){
        cout<<"func2 != func4" <<endl;
    }
    else{
        cout<<"func2 == func4" <<endl;
    }

    cin.get();
    return 0;
}


讲了这些,那么函数指针都用在哪儿呢?最多的用途就是作为回调函数使用。C里面很出名的,也是我仅用过函数指针的地方,就是qsort,bsearch和pthread_create里面的线程函数。关于函数指针作为函数参数的下篇再总结。睡觉。

 参考资料:

C++ Primer第4版

C和C++代码精粹


!!!!!!!欢迎转载,请注明本文链接:http://blog.csdn.net/mosaic/article/details/7199777 !!!!!! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值