【问题标题】:Confusion in understanding Casting of a RAM address as a Pointer to structure混淆将 RAM 地址转换为结构指针
【发布时间】:2017-02-20 10:53:19
【问题描述】:

我无法理解头文件中的某些代码部分及其用法。 我有一个名为 xxx.h 的头文件,其中包含一个类型定义的结构和一些成员变量,如下所示:

typedef Struct{ 
int x,y,z;      //members inside structure
}myStruct;

#define base 0x02300  // must be a RAM address

#define access ((myStruct *) base)

我无法找出定义 #define access ((myStruct *) base) 在我的代码中的实际作用。 同样在我的源文件 yyy.c 中,我可以使用这一行访问结构变量:

#include "xxx.h"    
void main()
  {
    access->x = 23;
  }

在引用 C 语言中的“指向结构的指针”部分后,我真正理解的是,我可以创建一个 myStruct 类型的新指针变量,并使用“->”运算符使用该变量访问结构内的变量。 请帮助我理解这段代码。 谢谢

【问题讨论】:

  • 这只是以通常的方式将一个结构映射到一个硬编码的内存地址(对于小型嵌入式应用程序来说很常见) - 您难以理解哪一部分?你有a good book on C 吗?
  • typedef Struct 在 C 语言中无效。您的编译器应该报错。
  • 对于一个非常基本的理解,这将在地址 0x02300 处创建一个 myStruct 类型的 structaccess 是指向该结构的指针。
  • @Paul R 你好 Paul,“base”是特定 GPIO 端口的地址,结构内的成员是寄存器名称。我发现很难理解 Typecasting 是如何工作的。这行 ((myStruct *) base)->x = 23 ; 是在“base”地址处隐式声明 myStruct 类型的新指针变量吗?

标签: c pointers casting structure


【解决方案1】:

C 预处理器只是在实际编译过程发生之前进行文本替换:

有了这些定义:

#define base 0x02300  // must be a RAM address
#define access ((myStruct *) base)

这段代码:

access->x = 23;

实际上会被预处理器转换成这个:

((myStruct *) base)->x = 23 ;

最终会出现在这段代码中(因为#define base 0x02300

((myStruct *) 0x02300)->x = 23 ;

我建议你阅读 C 教科书中处理预处理器的章节。

【讨论】:

  • 感谢 Michael 的回复,首先,这不是我不理解的预处理器指令,我无法理解将内存地址“强制转换”为结构指针。
  • @RakeshMenon 这里其实没什么好理解的。在地址0x02300 你有一个myStruct 结构,这似乎是由你的底层硬件/软件/控制器或其他什么决定的。因此,将该内存地址“转换”为指向myStruct 的指针实际上只是告诉C 编译器您想要访问位于地址0x02300mystruct 结构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2021-10-31
  • 1970-01-01
相关资源
最近更新 更多