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位整数的指针,但是等号之后的类型转换对我来说是一个谜。
我希望得到逐步的解释,或者可以帮助我掌握此语法的学习资源的链接。
好的,这是=标志后面的所有内容:
(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。
通常,当程序员想要将结构体的内存视为原始字节缓冲区时,他会执行这样的强制转换。这是一件棘手的事情,因为当您丢弃这样的类型信息时,编译器通常会为您处理问题(例如成员变量的字节序、它们与适当边界的对齐、填充字节等) )现在成为程序员必须考虑的事情......但在您想要将原始内存转储到磁盘或类似的情况下它可能很有用。