Если вы знаете, как читать выражений в C, то вы в одном шаге от чтения сложных объявлений.
Что значит
char *p;
действительно значит? Это означает, что *p
это символ. Что значит
int (*data[2])[5];
означает? Это означает, что (*data[x])[y]
является целым числом (при условии 0 <= x <2 и 0 <= y <5). Теперь просто подумайте о том, каковы последствия этого. <code>data должен быть ... массивом из 2 ... указателей ... на массивы из 5 ... целых чисел.
Тебе не кажется, что это довольно элегантно? Все, что вы делаете, это указывает тип выражения. Как только вы это поймете, декларации больше никогда не будут вас пугать!
«Быстрое правило» состоит в том, чтобы начать с имени переменной, сканировать вправо, пока не нажмете a), вернуться к имени переменной и выполнить сканирование влево, пока не нажмете (. Затем «выйти» из пару скобок и повторите процесс.
Давайте применим это к чему-то нелепому:
void **(*(*weird)[6])(char, int);
weird
- указатель на массив из 6 указателей на функции, каждая из которых принимает аргумент char и int в качестве аргумента, а каждая возвращает указатель на указатель void.
Теперь, когда вы знаете, что это такое и как это делается ... не делайте это. Используйте typedefs, чтобы разбить ваши объявления на более управляемые куски. Э.Г.
typedef void **(*sillyFunction)(char, int);
sillyFunction (*weird)[6];