函数指针和指针函数的概念

嵌入式技术

1330人已加入

描述

不少朋友会混淆“函数指针”和“指针函数”这两个概念,本文详细介绍一下:

1、函数指针

在这里“函数”两个字是修饰“指针”的,也就是说重点在“指针”两个字上,函数指针,本质上就是一个指针变量,只不过它的指向有些特殊,它指向函数。 换句话说,是指向函数的首地址。

定义一个函数指针时,需按照以下格式:

类型(*函数名)(参数表)

注意函数名一定要用括号括起来,否则意义就变了,这个括号就是告诉编译器这个是个函数指针,不是一个返回值类型为指针的函数。 这里的函数名不应该叫函数名,应该叫做函数指针变量名才合适。 以下举个简单的例子介绍一下函数指针定义以及使用方法。

//定义一个函数指针
int (*Func)(int a, int b);


//定义一个加法函数
int Add(int a, int b)
{
    return a + b;
}
int main()
{
    int c;

    //幅值函数指针
    Func = Add;
    //执行
    c = Func(0x01,0x02);
}

再如,以下结构中定义了多个函数指针。 这个结构体中定义了四个指针,都是指向函数的指针。 使用时首先定义结构体,然后初始化结构体内部的四个函数指针,然后使用。

注意,使用之前必须确定指向,否则操作野指针可不是闹着玩的。

typedef struct gAdcFunctionGroup
{
    //定义一个函数指针变量gAdcInit,它指向的函数有两个参数即,pDev和pCfg
    //并且指向的这个函数的返回值是BYTE类型。
    BYTE (*gAdcInit)     (gDeviceBase *pDev, const gAdcCfg *pCfg);
    BYTE (*gAdcEnable)   (gDeviceBase *pDev, BYTE bChannel);
    BYTE (*gAdcDisable)  (gDeviceBase *pDev, BYTE bChannel);
    BYTE (*gAdcRead)     (gDeviceBase *pDev, BYTE bChannel, DWORD *pdwAdcValue);
}gAdcFuncGrp;

2、指针函数

这里的的“指针”是修饰“函数”的,也就是说重点在“函数”两个字上,所以本质上是一个函数,这个函数的返回值是一个指针。 这个就比较常见了,定义时可采用以下格式。

类型 *函数名(参数表)

和函数指针相比少了一个括号,一个括号之差,天壤之别。 如下定义了一个指针函数,它的返回值是一个结构体指针。

gFifo *gFifoCreate(const char *pName, DWORD dwSize)
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分