You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino中如何直接传递变量指针地址给函数?

解决直接传递变量地址到函数的问题

问题根源

你的代码能“侥幸”运行是因为Arduino的AVR编译器对类型不匹配做了隐式转换,但这是未定义行为,随时可能出问题。核心问题是函数的参数类型和你传递的指针类型完全不匹配:

  • &f是float*类型,但函数要求的是int*
  • &buffer是byte(*)[8](指向8个byte数组的指针),但函数要求的是int*
  • 你写的int z = &f;本质是把指针强制转成int,这在32位平台会直接报错,完全是错误写法

正确的实现方式

我们需要修改函数,让它能接收任意类型的变量指针,并且直接操作字节:

  1. 用void*接收任意变量的地址(void*可以兼容所有指针类型)
  2. 用byte*接收buffer的地址(因为我们要操作字节数组)
  3. 用标准库的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:51:15