((PtrToStruct)*(unsigned int *)地址)

时间:2018-10-18 08:36:37

标签: c ram

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

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

sub_id(fk to substance)

这是原始代码格式:

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

然后代码中的某个地方可以使用它来获取struct中的成员数据

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

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

2 个答案:

答案 0 :(得分:1)

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

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


更具体地说,在ADDRESS0x2000)的位置上似乎存储着一个指向VEC类型的结构的指针。

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

答案 1 :(得分:0)

此代码是面向硬件的非常具体的代码。

实际上假设类型VEC的数据结构的地址存储在ADDRESS中,并且地址/指针的大小为sizeof(unsigned int)

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

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

==> *(unsigned int*)ADDRESS-取消引用从地址sizeof(unsigned int)读取 ADDRESS个字节)。

==> (PVEC)*(unsigned int*)ADDRESS-使用/处理此取消引用的值作为指向结构VEC的指针(地址)