You cannot actually have the address of a bit field because the smallest addressable unit in C is a byte (remembering that bytes in C are not necessarily 8 bits wide).
The best you could hope for is the address of the containing set of bytes.
The relevant part of the standard (C11 in this case) is section 6.5.3.2 Address and indirection operators
(my emphasis):
The operand of the unary &
operator shall be either a function designator, the result of a []
or unary *
operator, or an lvalue
that designates an object that is not a bit-field and is not declared with the register storage-class specifier.
Given that the unit of addressing is a byte, you may find your bit fields stored as (for example):
Bit 7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
Address: 1234 | a | b | c | d | ? | ? | ? | ? |
+---+---+---+---+---+---+---+---+
1235 | | | | | | | | |
+---+---+---+---+---+---+---+---+
You can see that the address of all those bit fields is actually the same (1234), so it's not really that useful for distinguishing them..
For manipulating bit fields, you really should just access them directly and let the compiler sort it out.
Even using bit-wise operators isn't guaranteed to work unless you know how the compiler is laying them out in memory.