Ответ 1
Нет, вы не можете. Бит-поле может использоваться только с интегральными переменными типа.
C11-§6.7.2.1/5
Поле бит должно иметь тип, который является квалифицированной или неквалифицированной версией
_Bool
,signed int
,unsigned int
или другого типа, определенного для реализации.
В качестве альтернативы вы можете сделать это
struct st
{
unsigned int i: 4;
} arr_st[5];
но его размер будет в 5 раз больше размера struct
(как указано в comment @Jonathan Leffler) с 5 членами с полем бит 4
. Таким образом, здесь это не имеет особого смысла.
Более внимательно вы можете это сделать
struct st
{
uint8_t i: 4; // Will take only a byte
} arr_st[5];