了解嵌入式 C 语言变量声明

Dav*_*use -1 c embedded variables declaration

我试图理解一些声明变量的嵌入式 C 代码。

uint8_t *p=(uint8_t *)&NOCAN_REGS;
Run Code Online (Sandbox Code Playgroud)

NOCAN_REGS 是在不同文件中定义的结构(请参阅下面的链接)

我的理解是变量“p”是一个指向无符号8位整数的指针,但是等号之后的类型转换对我来说是一个谜。

我希望得到逐步的解释,或者可以帮助我掌握此语法的学习资源的链接。

Jer*_*ner 7

好的,这是=标志后面的所有内容:

(uint8_t *)&NOCAN_REGS;
Run Code Online (Sandbox Code Playgroud)

从右到左(因为按顺序更容易解释):

NOCAN_REGS;
Run Code Online (Sandbox Code Playgroud)

...正如您所提到的,这是全局结构对象的名称。

&
Run Code Online (Sandbox Code Playgroud)

&符号表示您想要一个指向它后面的任何内容的指针,因此

&NOCAN_REGS
Run Code Online (Sandbox Code Playgroud)

...表示“指向 NOCAN_REGS 结构的指针”。

(uint8_t *)
Run Code Online (Sandbox Code Playgroud)

这里的强制转换是为了将表达式的类型从nocan_registers_t *to强制更改uint8_t *。也就是说,您告诉编译器您希望表达式的类型是指向无符号字节的指针,而不是指向 a- 的指针nocan_registers_t

通常,当程序员想要将结构体的内存视为原始字节缓冲区时,他会执行这样的强制转换。这是一件棘手的事情,因为当您丢弃这样的类型信息时,编译器通常会为您处理问题(例如成员变量的字节序、它们与适当边界的对齐、填充字节等) )现在成为程序员必须考虑的事情......但在您想要将原始内存转储到磁盘或类似的情况下它可能很有用。