Поделиться через


Интерпретация более сложные деклараторы

Можно заключить любой декларатор в круглые скобки, чтобы задать определенное интерпретация "сложного декларатора". Сложный декларатор идентификатор уточненный несколькими массивом, указателем или модификатором функции.Можно применить другой массив сочетание указатель, а модификаторы функции в один идентификатор.Обычно typedef может использоваться для упрощения объявления.См. Объявлении Typedef.

В интерпретации сложные деклараторы, брекеты и скобки (то есть, модификаторы справа от идентификатора), имеют приоритет над звездочками (то есть модификаторами слева от идентификатора).Брекеты и круглые скобки, имеют один и тот же приоритет и связывают слева направо.После того, как был полностью декларатор интерпретируется как описатель типа применяется последним шагом.С помощью скобок можно переопределить порядок по умолчанию ассоциации и принудительно указанный интерпретация.Никогда не используйте скобки, однако сама вокруг имени идентификатора.Это может быть неправильно истолковано как список параметров.

Простой способ интерпретации сложные деклараторы чтения "из их внутри - out" с помощью следующих шагов: 4

  1. Начните с идентификатором и выглядит непосредственно вправо для брекетов или скобок (если есть).

  2. Интерпретировать эти брекеты или круглые скобки, а затем найдите на левой стороне для звездочек.

  3. При возникновении правая круглая скобка на любом этапе, то вернуться и применяют правила 1 и 2 ко всему в скобки.

  4. Примените настраиваемый описатель типа.

    char *( *(*var)() )[10];
     ^   ^  ^ ^ ^   ^    ^
     7   6  4 2 1   3    5
    

В этом примере шаги нумеруются в порядке и могут быть интерпретируются следующим образом:

  1. Идентификатор var объявляется как

  2. указатель на

  3. возвращение функции

  4. указатель на

  5. массив 10 элементов,

  6. указатели

  7. char значения.

Примеры

В следующих примерах демонстрируются другие сложные объявления и показывают, как скобки могут повлиять на значение объявления.

int *var[5]; /* Array of pointers to int values */

Модификатор массива имеет более высокий приоритет, чем модификатор указателя таким образом var объявляет, что быть массивом.Модификатор указателя применяется к типу элементов массива; следовательно, элементы массива указателей на int значения.

int (*var)[5]; /* Pointer to array of int values */

В этом объявлении varскобки, имеет более высокий приоритет, чем модификатора указателя модификатор массива и var объявляет, что быть указателем на массив 5 int значения.

long *var( long, long ); /* Function returning pointer to long */

Модификаторы функции также имеют более высокий приоритет по сравнению с модификаторами указателя, чтобы это объявление var объявляет var быть функцией возвращение указателя к a long значения.Объявленные, что функция принимает 2 long значения в виде аргументов.

long (*var)( long, long ); /* Pointer to function returning long */

Этот пример похож на предыдущий пример.Скобки имеет более высокий приоритет, чем модификатора указателя функции, а модификатор var объявляет, что быть указателем на функцию, возвращающую a long значения.Кроме того, функция принимает 2 long аргументы.

struct both       /* Array of pointers to functions */
{                 /*   returning structures         */
    int a;
    char b;
} ( *var[5] )( struct both, struct both );

Элементы массива не могут быть функциями, но это объявление показано, как объявить массив указателей на функции.В этом примере var объявляет, что быть массивом 5 указателей на функции, возвращающие структуры с 2 элементами.Объявленные, что аргументы к функциям 2 структуры с тем же типом структуры both.Обратите внимание, что окружать скобок *var[5] потребуйте.Без их объявление недопустимая попытка объявить массив функций, как показано ниже:

/* ILLEGAL */
struct both *var[5]( struct both, struct both );

Следующий оператор объявить массив указателей.

unsigned int *(* const *name[5][10] ) ( void );

name массив имеет значение 50, упорядоченных по элементов в многомерной таблице.Элементы указатели на указатель, который является константой.Пункты этого постоянный указатель на функцию, которая не имеет никаких параметров и возвращает указатель к типу без знака.

Этот в следующем примере функция возвращает указатель на массив 3 Двойное с плавающей запятой значения.

double ( *var( double (*)[3] ) )[3];

В этом объявлении, функция возвращает указатель на массив, поскольку недопустимые функции, возвращающие массивы.Здесь var объявляет, что быть функцией возвращение указатель на массив 3 Двойное с плавающей запятой значения.Функция var принимает один аргумент.Аргумент, как возвращаемое значение, указатель на массив 3 Двойное с плавающей запятой значения.Тип аргумента, комплексом аннотация-декларатор.Требуются круглые скобки вокруг " звездочка " в типе аргумента. без них, тип аргумента является массивом 3 указателей на Двойное с плавающей запятой значения.Обсуждение и примеры абстрактных деклараторов см. в разделе абстрактные деклараторы.

union sign         /* Array of arrays of pointers */
{                  /* to pointers to unions       */
     int x;
     unsigned y;
} **var[5][5];

По мере того, как в приведенном выше примере показано, указатель может указывать на другой указателю, а также массив может содержать массивы как элементы.Здесь var массив 5 элементов.Каждый элемент массива указателей на 5 элемента указателям для соединений с 2 элементами.

union sign *(*var[5])[5]; /* Array of pointers to arrays
                             of pointers to unions        */

В этом примере демонстрируется размещение скобок изменяет значение объявления.В этом примере var массив указателей на массивы 5 5 элементов элемента указателей к соединениям.Примеры использования typedef чтобы избежать сложные объявления см. в разделе Объявлении Typedef.

См. также

Основные понятия

Объявления и типы