pointers in C with a #define
The function:
#define ASSOC(port) (*(volatile bit_field *) (&port))
The function call:
#define SCLK ASSOC(PORTC).bit0
bit_field defined as a struct like this:
typedef struct {
unsigned char bit0 :1, bit1 :1, bit2 开发者_StackOverflow中文版:1, bit3 :1, bit4 :1, bit5 :1,
bit6 :1, bit7 :1;
} bit_field;
I don't know where &port is defined.
Can someone please explain how the function is read and how it works please? I am not very good with pointers and this example in particular is very confusing with "*" in the front and at the end and the "&" with the port.
Thank you
port
is not defined. It is the argument to ASSOC as you can see here:
#define ASSOC(port) /* etc. */
Also, I assume it is supposed to be a char
, because the bit_field
has 8 bits. The &
in &port
simply serves to get its address in memory.
ASSOC in turn casts &port
to a volatile bit_field *
and then there is the extra *
at the beginning to point directly to the contents of the resulting pointer.
Therefore, once you call ASSOC(port), you can use it as a bit_field type structure. For example, the SCLK
macro will give the first bit of PORTC
.
The ASSOC
macro you define is an in-place cast.
- You pass in a value
port
(in this case, it's coming from the other macroSCLK
) ASSOC
takes the address ofport
with the&
operatorASSOC
castsport
's address to a(volatile bit_field *)
ASSOC
dereferences (*
s) the address of thebit_field
The result is the same bits as you started with, but usable as a bit_field
struct.
ASSOC
takes what I'm assuming is a char
named PORTC
and gives back a bit_field
with the same values as each individual bit in PORTC
.
SCLK
returns one of the bits in the bit field.
You're taking PORTC
and passing it to ASSOC
as the parameter.
精彩评论