解释下面的代码?

时间:2014-04-11 21:46:37

标签: c function assign

关于以下代码片段(用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;

4 个答案:

答案 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()

顺便说一句,我可以认真推荐Peter van der Linden的书“Deep C Secrets” - 非常易读,现已发布为pdf。

答案 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是一个函数。