((PtrToStruct)*(unsigned int*)ADDRESS)

((PtrToStruct)*(unsigned int*)ADDRESS)

在我问之前我研究过类似的问题。最壁橱是这样的: https://www.careercup.com/forumpost?id=5752438032171008

但是我还是不明白,这段代码是什么意思?

((PtrToStruct)*(unsigned int*)ADDRESS)

原始代码格式如下:

typedef struct __st_vec{
    member 1
    ...
    ...
    ...
    member n
}VEC, *PVEC;

#define ADDRESS 0x2000
#define VEC_PLACE() ((PVEC)*(unsigned int*)ADDRESS)

然后在代码的某处可以使用它来获取结构中的成员数据

variable = VEC_PLACE()->member 1;

许多硬件系统都有内存映射寄存器,它们存储或读取数据的地方。在小型嵌入式直接硬件系统上,这些寄存器通常放置在固定位置,即地址。

宏所做的基本上是允许以更好的方式访问这样的位置,而不必每次都编写所有的强制转换和取消引用。


更具体地说,在 ADDRESS (0x2000) 的位置似乎存储了一个指向 VEC.

类型结构的指针

(unsigned int*)ADDRESS 宏假装 ADDRESS 的值实际上是指向 unsigned int 的指针。然后宏取消引用该指针,以获取存储在内存中 ADDRESS 处的值。最后,这个值被转换为指向 VEC.

的指针

此代码非常面向硬件。

实际上假设VEC类型的数据结构的地址存储在arADDRESS中,address/pointer的大小为sizeof(unsigned int).

((PVEC)*(unsigned int*)ADDRESS)

==> (unsigned int*)ADDRESS -- 使用值 ADDRESS 作为指向 unsigned int

的指针

==> *(unsigned int*)ADDRESS -- 取消引用它从地址[=]读取 sizeof(unsigned int)字节12=]).

==> (PVEC)*(unsigned int*)ADDRESS -- use/treat 这个取消引用的值作为指向结构的指针(地址) VEC