Arduino中如何直接传递变量指针地址给函数?
解决直接传递变量地址到函数的问题
问题根源
你的代码能“侥幸”运行是因为Arduino的AVR编译器对类型不匹配做了隐式转换,但这是未定义行为,随时可能出问题。核心问题是函数的参数类型和你传递的指针类型完全不匹配:
&f是float*类型,但函数要求的是int*&buffer是byte(*)[8](指向8个byte数组的指针),但函数要求的是int*- 你写的
int z = &f;本质是把指针强制转成int,这在32位平台会直接报错,完全是错误写法
正确的实现方式
我们需要修改函数,让它能接收任意类型的变量指针,并且直接操作字节:
- 用
void*接收任意变量的地址(void*可以兼容所有指针类型) - 用
byte*接收buffer的地址(因为我们要操作字节数组) - 用标准库的
memcpy完成字节复制,比手动循环更高效可靠
修正后的完整代码
float f = 133.2342; int x = 12345; byte buffer[8] = {0,0,0,0,0,0,0,0}; // 修正参数类型:void*接收任意变量指针,byte*接收buffer指针 void var_to_byte(const int byte_count, void* var_ptr, byte* buffer) { // 先清空buffer前8个字节 memset(buffer, 0, 8); // 把变量的字节复制到buffer,只复制指定的byte_count个字节 memcpy(buffer, var_ptr, byte_count); } void setup() { Serial.begin(115200); // 现在可以直接调用,不需要中间变量 var_to_byte(sizeof(f), &f, buffer); Serial.print("Buffer: "); for (int i=0;i<8;i++) { if (buffer[i]<0x10) { Serial.print("0"); } Serial.print(buffer[i],HEX); } Serial.println(); } void loop() { }
额外说明
memset和memcpy是标准C库函数,Arduino完全支持sizeof(f)会返回float类型的字节数(AVR平台是4字节),所以只会复制前4个字节到buffer,剩下的保持0- 如果要处理int类型的x,直接调用
var_to_byte(sizeof(x), &x, buffer)即可,函数具备通用性
内容的提问来源于stack exchange,提问作者Axel Siebert
相关产品推荐
相关产品推荐

