В чем смысл 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. Стоит подробнее почитать про т. н. правило чтения по спирали.

→ Ссылка