易截截图软件、单文件、免安装、纯绿色、仅160KB

C函数指针的用法

   
2008-06-05 12:38------------------------------------------------------------------------------------------------
函数指针通常用来实现回调,其基本用法如下:
1、定义函数指针类型
// 定义一个原型为int Fun( int a );的函数指针
typedef int (*PTRFUN) ( int aPara );
2、函数指针变量的定义
PTRFUN pFun;    // pFun 为函数指针变量名
int (*pFun2) ( int a );   // pFun2也是函数指针变量名
3、函数指针作为函数的参数传递
// 定义回调函数
int CallBack( int a ){
    return ++a;
}
// 定义回调者函数
void Caller( PTRFUN cb )
// void Caller( int (*cb) ( int ) ) // 也可这样申明
{
    int nPara = 1;
    int nRet = cb( nPara );
}
// 使用回调
void Test(){
    Caller( CallBack ); // 直接使用回调函数
    PTRFUN cb = CallBack; // int (*cb) ( int ); cb = CallBack;
    int nRet1 = cb( 99 ); // nRet1 = 100;
}
4、函数指针的指针使用
// 定义函数指针的指针
typedef int (**PTRPTRFUN) ( int aPara );
// 函数指针的指针作为参数
void PtrCaller( PTRPTRFUN cb )
// void PtrCaller( PTRFUN* cb )           // 指针申明
// void PtrCaller( int (**cb) ( int ) ) // 原型申明
{
    int nRet = (*cb)(999); // nRet = 1000;
}
// 使用函数指针的指针
void Test(){
    PTRFUN cb = CallBack;
    PtrCaller( &cb );
}
5、函数指针数组的使用
// 函数指针数组的定义
PTRFUN fArray[10];
// int (*fArray[10]) ( int );   // 原型定义
for ( int i = 0; i < 10; i++ ){
    fArray[i] = CallBack;
    int nRet = fArray[i](i);    // nRet = i+1;
}
6、函数指针的大小
// 既然叫指针,所以跟普通的指针一样在32位系统下大小都为4
int nSz1 = sizeof(PTRFUN);      // nSz1 = 4;
int nSz2 = sizeof(PTRPTRFUN);   // nSz2 = 4;
注意:
        编译器存在多种种调用规范,


相关文档:

浅谈C/C++内存泄漏及其检测工具

对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问题。已经有许多技术被研究出来以应对这个问题,比如Smart Pointer,Garbage Collection等。Smart Pointer技术比较成熟,STL中已经包含支持Smart Pointer的class,但是它的使用似乎并不广泛,而且它也不能解决所有的问题;Garbage Collection技术在Java中已经 ......

优化C代码常用的几招

优化C代码常用的几招
在性能优化方面永远注意80-20原则,即20%的程序消耗了80%的运行时间,因而我们要改进效率,最主要是考虑改进那20%的代码。不要优化程序中开销不大的那80%,这是劳而无功的。
第一招:以空间换时间
计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我 ......

C语言连接MySQL数据库

前几天公司让我做C语言和MySQL数据库的交互操作,费了九牛二虎之力之后总算做出来了,今天特地把源代码贴出来供大家学习;如有人想要打包项目可以加我QQ260990509,注明技术交流,即可获得打包之后的项目!
#if defined(_WIN32) || defined(_WIN64)  //为了支持windows平台上的编译
#include <windows.h>
#end ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号