嵌入式技术
不少朋友会混淆“函数指针”和“指针函数”这两个概念,本文详细介绍一下:
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)
全部0条评论
快来发表一下你的评论吧 !