回 帖 发 新 帖 刷新版面

主题:请教 关于函数指针的一些问题

我看了一篇关于函数指针的文档,他有这样一个例子。

我试着编译,没有过去,如何修改,

#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个回复)

沙发

#include <stdio.h>

void func()
{
    printf("sadasd");
}

void caller(void (*ptr)())
{
    ptr();
}

int main()
{
    typedef void (*p)();
    p a = &func;
    caller(a);

    return 0;
}

板凳

楼上,你的函数取地址,应该不用&吧,func本身就是函数的地址啊,再取地址是什么意思啊?
还有就是caller函数定义的地方,调用了ptr(),为什么不是(*ptr)().
谢谢你的回复

3 楼

func 作地址用时等同于 &func
ptr 作函数用时等同于 *ptr

但最好写成完整的 &func,*ptr,在C++中的非C继承部分就不需要这种简写

4 楼

还有一个问题就是你在main()函数中对指针赋值的地方有些不解
如下:
 p a = &func;
定义的是函数指针p  为什么 下面是p a?而不是p。
这样是 p为类型?a为指针?
下面的caller()的参数是a。

5 楼

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 楼

最后再确定一下我的思路是否正确,
我之前的想法是p为指针变量,但现在是类型名,

通过bruceteen的解释,我的认识为,
如果定义
void (*p)();
这时p为指针变量,值为函数的入口地址
如果声明
typedef void (*p)();
这时的p为指针类型符,约等于“*”,不表示指向,只表示类型,

这里typedef 是声明类型符用的,看到了你的例子,我之前只理解typedef的普通应用,对于typedef void(*p)();我开始认识这是一个参数,原来这是两个参数,这下明白了。
我这样的理解是否正确,请指点。

7 楼

对,typedef就是定义一个类型的别名

比如
typedef int p;
p a = 2;
就等同于
int a = 2;

我来回复

您尚未登录,请登录后再回复。点此登录或注册