开发者

pointers in C with a #define

开发者 https://www.devze.com 2023-02-01 10:41 出处:网络
The function: #define ASSOC(port) (*(volatile bit_field *) (&port)) The function call: #define SCLK ASSOC(PORTC).bit0

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.

  1. You pass in a value port (in this case, it's coming from the other macro SCLK)
  2. ASSOC takes the address of port with the & operator
  3. ASSOC casts port's address to a (volatile bit_field *)
  4. ASSOC dereferences (*s) the address of the bit_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.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号