Массив указателей на функции в C - PullRequest
7 голосов
/ 12 марта 2012

Мне очень трудно понять синтаксис указателей на функции. Я пытаюсь создать массив указателей на функции, который не принимает аргументов и возвращает пустой указатель. Кто-нибудь может помочь с этим?

Ответы [ 5 ]

17 голосов
/ 12 марта 2012
  1. Прежде всего, вы должны узнать о cdecl:

    cdecl> declare a as array 10 of pointer to function(void) returning pointer to void
    void *(*a[10])(void )
    
  2. Вы можете сделать это вручную - просто построитьэто изнутри:

    a

    - это массив:

    a[10]

    из указателей:

    *a[10]

    для функций:

    (*a[10])

    без аргументов:

    (*a[10])(void)

    возвращение void *:

    void *(*a[10])(void)

  3. Намного лучше, если вы используете typedef, чтобы сделать вашу жизнь проще:

    typedef void *(*func)(void);
    

    А затем сделать свой массив:

    func a[10];
    
7 голосов
/ 12 марта 2012

Всякий раз, когда составной синтаксис становится слишком сложным, typedef обычно проясняет ситуацию.

Например,

typedef void *(* funcPtr)(void);

funcPtr array[100];

Который без typedef, я думаю, будет выглядеть так:

void *(* array[100])(void);
3 голосов
/ 12 марта 2012

Начните с имени массива и продолжайте свой путь, помня, что [] и () bind before * (*a[] - массив указателей, (*a)[] - указатель на массив, *f() - это функция, возвращающая указатель, (*f)() - это указатель на функцию):

        farr               -- farr
        farr[N]            -- is an N-element array
       *farr[N]            -- of pointers
      (*farr[N])(    )     -- to functions
      (*farr[N])(void)     --   taking no arguments
     *(*farr[N])(void)     --   and returning pointers
void *(*farr[N])(void);    --   to void
2 голосов
/ 12 марта 2012

Использование typedef с

typedef void* func(void);
func *arr[37];
0 голосов
/ 12 марта 2012

Проверьте http://www.newty.de/fpt/fpt.html#arrays для примеров и объяснений массивов указателей на функции C и C ++.

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