带有#define的C指针

时间:2010-12-26 17:52:48

标签: c microcontroller avr winavr

功能:

#define ASSOC(port) (*(volatile bit_field *) (&port))

函数调用:

#define SCLK ASSOC(PORTC).bit0

bit_field被定义为这样的结构:

typedef struct {
 unsigned char bit0 :1, bit1 :1, bit2 :1, bit3 :1, bit4 :1, bit5 :1,
   bit6 :1, bit7 :1;
} bit_field;

我不知道在哪里定义了&端口。

有人可以解释一下如何阅读这个功能以及它是如何工作的吗?我对指针不是很好,特别是这个例子在前面和后面都是“*”和“&”非常混乱。与港口。

谢谢

3 个答案:

答案 0 :(得分:4)

port未定义。这是ASSOC的论据,你可以在这里看到:

#define ASSOC(port) /* etc. */

另外,我假设它应该是char,因为bit_field有8位。 &中的&port只是用于在内存中获取其地址。

ASSOC依次将&port转换为volatile bit_field *,然后在开头有额外的*直接指向结果指针的内容。

因此,一旦调用ASSOC(端口),就可以将其用作bit_field类型结构。例如,SCLK宏将给出PORTC的第一位。

答案 1 :(得分:2)

您定义的ASSOC宏是就地演员。

  1. 传入值port(在这种情况下,它来自另一个宏SCLK
  2. ASSOC使用port运算符
  3. 获取&的地址
  4. ASSOCport的地址转换为(volatile bit_field *)
  5. ASSOC dereferences* s)bit_field
  6. 的地址

    结果与您开始时的位相同,但可用作bit_field结构。

答案 2 :(得分:1)

ASSOC采用我假设的名为char的{​​{1}}并返回PORTC,其值与bit_field中的每个位相同

PORTC返回位字段中的一个位。

您正在使用SCLK并将其作为参数传递给PORTC