Рубрики

Сложные объявления в C

В большинстве случаев объявления просты для чтения, но трудно прочитать некоторые объявления, которые включают указатель на функции. Например, рассмотрим следующую декларацию из «signal.h».

void (*bsd_signal(int, void (*)(int)))(int);

Давайте посмотрим шаги для чтения сложных объявлений.

1) Преобразуйте объявление C в постфиксный формат и читайте справа налево.
2) Чтобы преобразовать выражение в постфикс, начните с самой внутренней круглой скобки. Если самая внутренняя круглая скобка отсутствует, тогда начните с имени объявления и сначала идите вправо Когда встречается первая заканчивающаяся скобка, идите налево. Как только вся скобка будет проанализирована, выйдите из скобки.
3) Продолжайте до тех пор, пока полная декларация не будет проанализирована.

Давайте начнем с простого примера. Ниже приведены примеры из книги «K & R».

1)  int (*fp) ();

Давайте преобразуем вышеприведенное выражение в постфиксный формат. В приведенном выше примере нет внутренних скобок, поэтому мы напечатаем имя объявления, т.е. «fp». Следующий шаг — перейти к правой части выражения, но с правой стороны от «fp» нет ничего для анализа, поэтому перейдите к левой стороне. С левой стороны мы нашли «*», теперь выведите «*» и вышли из скобок. Мы получим постфиксное выражение, как показано ниже.

  fp  *  ()  int

Теперь прочитайте постфиксное выражение слева направо. например, fp — указатель на функцию, возвращающую int

Давайте посмотрим еще несколько примеров.

2) int (*daytab)[13]

Постфикс: daytab * [13] int
Значение: daytab — указатель на массив из 13 целых чисел.

3) void (*f[10]) (int, int)

Постфикс: f [10] * (int, int) void
Значение: f это массив из 10 указателей на функцию (которая принимает 2 аргумента типа int), возвращая void

4) char (*(*x())[]) ()

Постфикс: x () * [] * () char
Значение: x — функция, возвращающая указатель на массив указателей на функцию, возвращающую char

5) char (*(*x[3])())[5]

Постфикс: x [3] * () * [5] char
Значение: x это массив из 3 указателей на функцию, возвращающий указатель на массив из 5 символов

6) int *(*(*arr[5])()) ()

Постфикс: arr [5] * () * () * int
Значение: arr — массив из 5 указателей на функции, возвращающий указатель на функцию, возвращающий указатель на целое число

7) void (*bsd_signal(int sig, void (*func)(int)))(int);

Постфикс: bsd_signal (int sig, void (* func) (int)) * (int) void
Значение: bsd_signal — это функция, которая принимает целое число и указатель на функцию (которая принимает целое число в качестве аргумента и возвращает void) и возвращает указатель на функцию (которая принимает целое число в качестве аргумента и возвращает void)

Эта статья составлена Narendra Kangralkar и рецензирована командой GeeksforGeeks. Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Сложные объявления в C

0.00 (0%) 0 votes