В чем смысл char (*) [...]?
Недавно нашел такой код:
struct dlist {
struct dlist *next;
struct dlist *prev;
};
#define DECLARE_DLIST(head_type, type, field)\
union head_type {\
struct dlist list;\
union {\
char (*offset)[offsetof(type, field)];\
type *t;\
} *data;\
}
Не пойму, что значит char (*offset)[offsetof(type, field)], точнее, как это работает.
Если у нас есть структура:
struct Some
{
int int_data;
struct dlist list_data;
};
и мы создаем новый dlist:
DECLARE_DLIST(head_type, struct Some, list_data) new_list;
Тогда в объединении будет char (*offset)[4];.
Ответы (1 шт):
Автор решения: eanmos
→ Ссылка
Таков синтаксис определения указателя на массив:
char (*offset)[offsetof(type, field)];
Здесь offset — это указатель на char [offsetof(type, field)], т. е. char (*)[offsetof(type, field)].
Если бы мы убрали круглые скобки вокруг *:
char *offset[offsetof(type, field)];
то член offset структуры имел бы тип массива указателей, т. е. char * [offsetof(type, field)].
1. К слову, для расшифровки объявлений в языке C существует интересный инструмент — cdecl.
2. Стоит подробнее почитать про т. н. правило чтения по спирали.