【发布时间】:2016-01-21 19:58:40
【问题描述】:
如果我想定义一个指针变量p指向下面定义的函数foo(),那么p的确切类型应该是什么?
int *foo(void *arg)
{
...
}
【问题讨论】:
标签: c pointers function-pointers
如果我想定义一个指针变量p指向下面定义的函数foo(),那么p的确切类型应该是什么?
int *foo(void *arg)
{
...
}
【问题讨论】:
标签: c pointers function-pointers
应该是
typedef int *(*funtion_foo_type)(void *);
【讨论】:
typedef,就像函数一样,但之前有typedef,例如typedef int*foo_type(void*); 然后使用指向该类型的指针,即foo_type* funptr; 更具可读性
typedef 不是操作员。从语法上讲,它是一个存储类说明符。 typedefed 名称是实际类型的别名。
typedef,我指的是整个字符串。试图避免混淆,制造更多的混淆(:
您需要将指针作为指向函数的指针,返回 int *,接受 void* 参数。你可以让它像
int * (*p) (void *);
然后,你可以使用
p = foo;
【讨论】:
记住Kyrylo Polezhaiev的评论,p的类型是
int*(*)(void*)
要声明p,您需要在类型中的正确位置插入名称:
int*(*p)(void*);
但使用别名通常更易读:
typedef int*(func_t)(void*);
func_t* p;
【讨论】:
为了让函数声明更容易
int *foo(void *arg);
定义一个别名,例如Tfoo,它看起来与函数声明本身的方式相同
typedef int *Tfoo(void *);
之后声明一个指向函数的函数指针就很容易了。随便写
Tfoo *foo_ptr = foo;
否则你可以写
typedef int * (* TFoo_ptr )(void *);
Tfoo_ptr foo_ptr = foo;
或者你可以直接编写函数指针的声明而不使用 typedef/
int * (* foo_ptr )(void *) = foo;
【讨论】:
你说的是指向函数的指针吗?
首先定义一个指向函数的指针,该函数接受void 参数并返回int
typedef int (*Ptrtofun)(void);
现在可以安全地将其指向您的函数。
Ptrtofun p;
p = &foo(void);
现在你有一个 ptr p 可以运行并且可以轻松使用它..
【讨论】: