C++ Wire库Wire.write的(byte*)&data参数作用疑问
Wire.write传参语法说明 代码片段核心拆解
你遇到的代码行:
Wire.write((byte *) &data, sizeof data);
其中(byte *) &data的作用分两步理解:
&data是C/C++的取地址操作,获取自定义结构体变量data在内存中的首地址,此时这个指针的原生类型是with*(指向你定义的with结构体的指针)。(byte *)是C风格强制类型转换,把上面拿到的结构体指针,转换为指向byte类型(Teensy/Arduino环境中定义的单字节无符号类型,等价于uint8_t)的指针。
为什么不能直接写Wire.write(data, sizeof data)
Teensy Wire库的多参数write方法,函数签名要求第一个参数必须是指向字节类型缓冲区的指针,函数逻辑是从传入的首地址开始,逐字节读取连续内存块的数据发送,长度由第二个参数指定。
如果你直接传入data,相当于把整个结构体的值作为参数传递,不是内存地址,类型和函数要求的byte*完全不匹配,编译阶段就会报类型错误,根本无法运行。
该写法的实际逻辑
你定义的with结构体内存在存储上是一段连续的空间:
struct with{ int id; int data; }
在32位Teensy环境下,这个结构体的sizeof(data)通常为8字节(两个int各占4字节)。把结构体首地址转换为字节指针后,Wire库就可以顺着这个地址,逐字节读取完整的结构体原始内存数据,通过I2C总线发送出去。
注意:这种直接发送结构体原始内存的写法,需要保证通信两端的设备结构体对齐规则、int类型长度、字节序(大小端)完全一致,否则对端收到的数据会出现解析错误。
内容的提问来源于stack exchange,提问作者Sorin Jayaweera
相关产品推荐
相关产品推荐

