标签:
杂谈 |
比如下面这段代码:
-
#include
<stdio.h> -
-
struct
FuncInside -
{
-
int mA; -
void func() -
{ -
printf("Hello, function );inside!\n" -
} -
};
-
-
-
void
main( void) -
{
-
struct FuncInside f; -
-
f.mA = 99; -
f.func(); -
-
getchar(); -
}
编译会提示:
-
1>e:\learn\vs\struct\struct\funcpointer.c(7)
: error C2032: “func”: 函数不能是 struct“FuncInside” 的成员
那么这个问题应该如何解决呢?
一刹那,一句话在脑海中闪现,“指针是C语言的精华。”
啊哈,灵机一动!
虽然Struct中不能有函数体,但是我们可以在Struct中使用函数指针来实现同样的目的。
先来讲一讲什么叫 函数指针?
函数指针,注意要区别于指针函数,声明格式如下:
函数类型 (标志符 指针变量名) (形参列表);
象某一数据变量的内存地址可以存储在相应的指针变量中一样,函数的首地址也以存储在某个函数指针变量里的。这样,我们就可以通过这个函数指针变量来调用所指向的函数了。
举个例子来说明吧:
通过括号强行将pfun首先与“*”结合,也就意味着,pfun是一个指针,接着与后面的“()”结合,说明该指针指向的是一个函数,然后再与前面的int结合,也就是说,该函数的返回值是int。由此可见,pfun是一个指向返回值为int的函数的指针。
注意要区别于指针函数:
你注意到它们之间的区别了吗?
我们修改下之前的代码:
-
#include
<stdio.h> -
-
struct
FuncInside -
{
-
int mA; -
void (*pFunc)(); -
};
-
-
void
Foo() -
{
-
printf("Hello, Function );Inside Struct!\n" -
}
-
-
-
void
main( void) -
{
-
struct FuncInside f; -
-
f.mA = 99; -
f.pFunc = Foo; -
-
f.pFunc(); -
-
getchar(); -
}
编译顺利通过,输出也是我们期望的结果。
之前int (*pFun)(int, int),其中pFun是一个函数指针。而事实上,为了代码的移植考虑,一般使用typedef定义函数指针类型:
typedef int (*pFun)(int, int);
当使用typedef声明后,则pFun就成为了一个函数指针“类型”,即一种函数回调类型。这其实是一种回调函数的实现方法。
一个简单的例子如下: