关于以下代码片段(用C语言编写),我有几件事我不明白:
struct T {
int a;
int *b;
struct T *next;
} ;
struct T *p1;
struct T* (*f)(int, int, struct T*);
struct T* g(int a, int b, struct T* c)
{
return (a > b ? c : NULL);
}
f = &g;
p1 = (*f)(4,3,p1);
特别是,这条线是什么意思?
struct T* (*f)(int, int, struct T*);
这是一个功能吗?如果是这样,为什么它没有正文,为什么有正式的参数名称似乎缺失?如果缺少一个身体,这个函数会返回什么?
此外,下面的作业是怎么回事?
f = &g;
答案 0 :(得分:5)
行struct T* (*f)(int, int, struct T*);
,是函数指针,
您定义指向函数的指针,其中有三个参数(int, int, struct T*)
。
代码f = &g;
表示您正在使用函数f
分配函数指针g
。
答案 1 :(得分:3)
特别是,这条线是什么意思?
struct T *( f)(int,int,struct T );
将f声明为指向函数的指针,该函数接受参数(int,int,struct T *)并返回指向struct T的指针。
这是一个功能吗?
没有。但是,f可以指向一个函数。
为什么它没有身体?
作为指向函数的指针,它只需要足够的定义让编译器知道它将指向的函数的原型。在这种情况下,它最终指向函数g;所以它的原型应该符合g的定义(或者会产生警告)。
为什么有正式参数名称似乎缺失
参数的名称对于函数指针是可选的。只需要参数类型。
此外,下面的作业是怎么回事?
f = &g;
(函数)指针f被赋予(函数)g。
的地址最后......
p1 = (*f)(4,3,p1);
f(即:g)指向的函数用值(4,3,p1)调用。返回的值放入p1。
答案 2 :(得分:2)
所以f
是一个指向函数的指针,它接受int, int, struc T *
并返回struct T *
。 f
被分配到g
的地址,这是一个普通或花园功能。然后p1
的那一行正在调用f()
,实际调用g()
。
答案 3 :(得分:1)
您正在查看函数指针变量。这是how to parse them:
struct T *( * f )(int,int,struct T *);
f
是一个指针
struct T *(* f)(int,int,struct T *);
..到一个带有两个int
参数和一个指向struct T
struct T * (* f)(int,int,struct T *);
..并返回指向struct T
现在您知道f
是一个函数指针变量,f = &g;
的含义应该是显而易见的。
提示:g
是一个函数。