我试图理解一些声明变量的嵌入式 C 代码。
uint8_t *p=(uint8_t *)&NOCAN_REGS;
NOCAN_REGS 是在不同文件中定义的结构(见下面的链接)
我的理解是变量“p”是一个指向无符号 8 位整数的指针,但是等号之后的类型转换对我来说是个谜。
我会很感激一步一步的解释,或者一个可以帮助我掌握这种语法的学习资源的链接。
好的,这是
=
标志后的所有内容:
(uint8_t *)&NOCAN_REGS;
从右到左(因为这样更容易解释):
NOCAN_REGS;
...正如您提到的,这是全局结构对象的名称。
&
&
符号表示你想要一个指向它之后的任何东西的指针,所以
&NOCAN_REGS
... 表示“指向 NOCAN_REGS 结构的指针”。
(uint8_t *)
剧组来强行把表情类型从
nocan_registers_t *
改成uint8_t *
。也就是说,您是在告诉编译器您希望表达式的类型是指向无符号字节的指针,而不是指向 a-nocan_registers_t
. 的指针
通常,当程序员想将结构的内存视为原始字节缓冲区时,他会像这样进行强制转换。这是一件棘手的事情,因为当您像这样丢弃类型信息时,编译器通常会为您处理的问题(例如成员变量的字节序、它们与适当边界的对齐、填充字节等) 现在成为程序员必须考虑的事情......但它在你想要的情况下很有用,例如将原始内存转储到磁盘或类似的地方。