主题:请教 关于函数指针的一些问题
nana_aoe
[专家分:60] 发布于 2010-11-17 10:19:00
我看了一篇关于函数指针的文档,他有这样一个例子。
我试着编译,没有过去,如何修改,
#include <stdio.h>
void func()
{
printf("sadasd");
}
void caller(void (*ptr)())
{
ptr();
}
void main()
{
typedef int (*p)();
p = func;
caller(p);
}
这个函数指针的声明是在什么时候用, 我直接写 int (*p)();不可以吗?
还有就是caller()函数的定义,在调用指针函数的时候不是应该 *ptr();这样调用不对吗?
欢迎大家说说自己的看法
回复列表 (共7个回复)
沙发
bruceteen [专家分:42660] 发布于 2010-11-17 11:11:00
#include <stdio.h>
void func()
{
printf("sadasd");
}
void caller(void (*ptr)())
{
ptr();
}
int main()
{
typedef void (*p)();
p a = &func;
caller(a);
return 0;
}
板凳
nana_aoe [专家分:60] 发布于 2010-11-17 12:52:00
楼上,你的函数取地址,应该不用&吧,func本身就是函数的地址啊,再取地址是什么意思啊?
还有就是caller函数定义的地方,调用了ptr(),为什么不是(*ptr)().
谢谢你的回复
3 楼
bruceteen [专家分:42660] 发布于 2010-11-17 14:43:00
func 作地址用时等同于 &func
ptr 作函数用时等同于 *ptr
但最好写成完整的 &func,*ptr,在C++中的非C继承部分就不需要这种简写
4 楼
nana_aoe [专家分:60] 发布于 2010-11-17 21:35:00
还有一个问题就是你在main()函数中对指针赋值的地方有些不解
如下:
p a = &func;
定义的是函数指针p 为什么 下面是p a?而不是p。
这样是 p为类型?a为指针?
下面的caller()的参数是a。
5 楼
bruceteen [专家分:42660] 发布于 2010-11-18 08:36:00
typedef void (*p)(); // 定义了一个类型p,p是void(*)()的别名
p a = &func; // 定义了一个p类型的对象,名字叫a
比如
typedef FLT float
FLT f = 12.3f;
能看懂吗?
p 相当于 FLT
void (*)() 相当于 float
a 相当于 f
6 楼
nana_aoe [专家分:60] 发布于 2010-11-18 09:40:00
最后再确定一下我的思路是否正确,
我之前的想法是p为指针变量,但现在是类型名,
通过bruceteen的解释,我的认识为,
如果定义
void (*p)();
这时p为指针变量,值为函数的入口地址
如果声明
typedef void (*p)();
这时的p为指针类型符,约等于“*”,不表示指向,只表示类型,
这里typedef 是声明类型符用的,看到了你的例子,我之前只理解typedef的普通应用,对于typedef void(*p)();我开始认识这是一个参数,原来这是两个参数,这下明白了。
我这样的理解是否正确,请指点。
7 楼
bruceteen [专家分:42660] 发布于 2010-11-18 11:05:00
对,typedef就是定义一个类型的别名
比如
typedef int p;
p a = 2;
就等同于
int a = 2;
我来回复