复杂指针和结构关系

时间:2018-11-26 08:22:32

标签: c pointers

这是我在努力的代码。它基本上是在现有代码中提供的。 有人可以解释一下吗?

typedef struct a* (*b)(struct c* d);

5 个答案:

答案 0 :(得分:3)

有一个著名的左右评估:从标识符开始,一直向左移动直到第一个括号,然后再向右移动,等等。

这给了我们

b开始:b是… 向左走,找到指针:…指向…的指针 向右走,找到函数定义:…一个带有struct c* d的函数… 向左走,找到函数定义的其余部分:…返回struct a*

因此b是指向一个函数的指针,该函数采用struct c* d并返回struct a*

答案 1 :(得分:1)

这行代码:

  • 定义新的函数类型:typedef
  • 命名为“ b”:(*b)
  • 返回a结构上的指针:struct a*(* b)
  • c结构上的指针作为参数:(struct c* d)

该参数名为d,但是我认为可以从声明中删除此信息。

答案 2 :(得分:1)

typedef是函数指针类型(b)。

诸如...的功能。

struct a *  MyFunction( struct c* d );

具有与typedef相同的类型。

例如

  b myPointer = MyFunction;

  struct c d;
  myPointer( &d ); 

答案 3 :(得分:1)

typedef为接受struct c*并返回struct a*的函数类型定义别名,该别名名为b。以前是:

typedef struct a* (*b)(struct c* d);
           ^ 
           return type, pointer to struct a
                    ^
                    name of the function type alias
                        ^
                        arguments to the function, a pointer to a struct c

答案 4 :(得分:1)

如果您没有将指针隐藏在typedef后面,就会更加清楚:

typedef struct a* b (struct c* d);

其中struct a* b (struct c* d);是普通的旧函数声明。使用typedef时,b不会成为函数的名称,而是类型的名称。对于(*b)b成为函数指针类型的名称。

如果我们使用上面发布的typedef的版本,并且需要该类型的函数指针,则可以将其声明为b* ptr;。而在您的代码中,您将编写b ptr;却没有意识到该变量实际上是一个指针。

通常,将指针隐藏在typedef后面是不好的做法,因为如果我们不这样做,则会得到更具可读性的代码。