Сложное правило справа налево при определении переменной - PullRequest
2 голосов
/ 06 декабря 2011

Это вопрос:
Используя правило Right-Left, напишите определение C для переменной с именем fubar, которая является указателем на функцию, которая берет указатель на символ и возвращает указательна массив из 7 элементов, где каждый элемент является указателем на структуру Sporcle.

Мой ответ:

*( (Sporcle*)[7] ) ( *fubar )( char* );

Может кто-нибудь проверить мой ответ и / или датьмне несколько указателей (без каламбура)?

Отредактированный ответ:

( (struct Sporcle*)[7] ) *( *fubar )( char* );

Окончательный ответ

struct Sporcle *(*(*fubar)(char *))[7];

Ответы [ 3 ]

15 голосов
/ 06 декабря 2011

Создайте фрагмент за раз:

Переменная с именем fubar ...

fubar

... это указатель ...

*fubar

... для функции ...

(*fubar)()

..., которая получает указатель на символ ...

(*fubar)(char *)

... и возвращаетуказатель ...

*(*fubar)(char *)

... на массив из 7 элементов ...

(*(*fubar)(char *))[7]

... где каждый элемент является указателем ...

*(*(*fubar)(char *))[7]

... до struct Sporcle.

struct Sporcle *(*(*fubar)(char *))[7]

Ваш ответ неверен - вещь слева (называемая описатель объявления ) может указывать только напрямуютип (базовый тип, например int, struct, union, enum или имя типа, определенное с помощью typedef, опционально измененное с помощью спецификатора класса хранения, например static, и / или спецификатор типа, напримерconst).Типы указателей, массивов и функций создаются путем изменения правой части объявления (называемого Объявление ), путем добавления к нему *, [] или ().

В этом случае спецификатор объявления равен struct Sporcle, а остаток - декларатор.

3 голосов
/ 06 декабря 2011

Я не буду комментировать действительность, но я предложу указатель: не делайте этого. Если это не чисто интеллектуальное упражнение, измените формулировку декларации, чтобы она не стала загадкой:

typedef Sporcle SevenSporcles[7];
SevenSporcles* (*fubar)(char*);
3 голосов
/ 06 декабря 2011

cdecl(1) ваш друг:

cdecl> declare fubar as pointer to function(pointer to char) returning pointer to array 7 of pointer to struct Sporcle
struct Sporcle *(*(*fubar)(char *))[7]
...