address =数据通过宏定义

时间:2011-09-26 08:41:07

标签: c pointers syntax casting embedded

#define PORTC *(unsigned char volatile *)(0x1003)

#define DDRC *(unsigned char volatile *)(0x1007)

所以我一直在尝试阅读有关嵌入式C的一些内容。最初我认为这个宏是一个指向指针的类型,但后来我很快就认为最后一个星实际上是一个取消引用而不是一个类型转换,我我纠正?取消引用位置0x1003 / 0x1007。

使用方式如下:PORTC = <some hex value>

问题是什么使它与指针类型转换不同? C规范中是否存在某种“规定”?或者我只是一个白痴......

此外,我不太清楚如何用这句话来表达,因此我无法先进行快速搜索......

4 个答案:

答案 0 :(得分:0)

不,这是一个演员。

首先,将内存位置(作为整数)强制转换为适当的指针,然后将其解除引用。

答案 1 :(得分:0)

这就是C语法定义的方式。

要成为强制转换,表达式需要括号:(type)sub-expression强制转换sub-expression以输入type

您的示例*(unsigned char volatile *)(0x1003)由2个子表达式组成:

  • 一个“孤独的”明星:*
  • 演员:(unsigned char volatile *)(0x1003)

演员表由()内的类型和值组成。

因此,整个表达式被解释为一个指针,然后取消引用以设置指向的内存区域。

答案 2 :(得分:0)

该代码基本上等同于:将<some hex value>放在内存中的地址(0x1003)(或者无论值是什么)。在某些嵌入式设备中(而不仅仅是)端口映射到内存位置。

答案 3 :(得分:0)

转换器指示编译器将内存地址0x10030x1007视为unsigned char volatile *指针,*解除引用操作符作用于该指针以获取指向的值,在这种情况下是1个字节。

应用一元*使这个表达式成为一个有效的左值(没有它就不会这样),这意味着它可以分配给它。