Комплексная связь указателей и структур - PullRequest
0 голосов
/ 26 ноября 2018

Вот фрагмент кода, с которым я борюсь.Это в основном предусмотрено в существующем коде.Может кто-нибудь, пожалуйста, объясните это:

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

Ответы [ 5 ]

0 голосов
/ 26 ноября 2018

Это становится понятнее, если вы не скрываете указатель за typedef:

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

, где struct a* b (struct c* d); - это простое объявление старой функции.При использовании typedef b становится не именем функции, а именем типа.В вашем случае с (*b), b становится именем типа указателя на функцию.

Если мы используем версию typedef, опубликованную выше, и нам нужен указатель на функцию этого типа, мы объявимэто как b* ptr;.В то время как в вашем коде вы пишете b ptr; и не понимаете, что переменная на самом деле является указателем.

Как правило, прятать указатели за typedef - плохая практика, так как мы получаем более читаемый код, если мы«т.

0 голосов
/ 26 ноября 2018

Это известная оценка слева направо: начните с идентификатора, идите влево до первой скобки, затем вправо и т. Д.

Это дает нам следующее:

startв b: b - это… перейти влево, найти указатель:… указатель на… перейти вправо, найти определение функции:… функция, принимающая struct c* d… перейти влево, найти остаток определения функции:…возвращение struct a*.

Итак, b - указатель на функцию, принимающую struct c* d и возвращающую struct a*.

0 голосов
/ 26 ноября 2018

Это typedef тип указателя на функцию (b).

Функция, такая как ....

struct a *  MyFunction( struct c* d );

Имеет тот же тип, что и typedef.

например

  b myPointer = MyFunction;

  struct c d;
  myPointer( &d ); 
0 голосов
/ 26 ноября 2018

Этот 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
0 голосов
/ 26 ноября 2018

Эта строка кода:

  • определяет новый тип функции: typedef
  • с именем "b": (*b)
  • возвращениеуказатель на структуру a: struct a* (* b)
  • , принимающий указатель на структуру c в качестве параметра: (struct c* d)

Параметр имеет имяd, но я думаю, что эта информация может быть удалена из декларации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...