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

Arduino Nano中数组直接索引与循环取memory address结果不一致问题

问题原因与解决方案:数组地址直接引用与循环获取不一致

你的问题出在指针类型的运算规则上,和Arduino环境无关,标准C++里也是同样的行为:

  • &luckyNumbers 获取的是整个数组的地址,它的类型是 int (*)[5](指向包含5个int的数组的指针)。在指针运算中,这类指针每次+1会偏移整个数组的字节大小(Arduino中int是2字节,5个int就是10字节),所以循环里&luckyNumbers + i每次偏移10字节,导致地址跳变2300、2310等。
  • 而&luckyNumbers[i] 获取的是数组第i个元素的地址,类型是int*,每次+1偏移1个int的大小(2字节),所以地址是连续的2290、2292等。

修正后的循环代码

你可以用以下几种正确方式获取元素地址:

  1. 直接使用数组元素取地址(和直接引用逻辑完全一致):
for( int i = 0; i < 5; i++) {
  Serial.print(" i = ");
  Serial.print(i);
  Serial.print(" @ memory address ");
  Serial.println(long(&luckyNumbers[i]));
}
  1. 利用数组名退化为指针的特性(数组名luckyNumbers本身就是指向第一个元素的int*指针):
for( int i = 0; i < 5; i++) {
  Serial.print(" i = ");
  Serial.print(i);
  Serial.print(" @ memory address ");
  Serial.println(long(luckyNumbers + i));
}
  1. 强制转换指针类型(仅在明确需要操作数组指针时使用,不推荐常规场景):
for( int i = 0; i < 5; i++) {
  Serial.print(" i = ");
  Serial.print(i);
  Serial.print(" @ memory address ");
  Serial.println(long( (int*)&luckyNumbers + i ));
}

补充说明

数组名和数组的地址在数值上是相同的,但类型完全不同,这是指针运算中容易踩的坑。标准C++的规则和Arduino环境在这里是一致的,你的预期没错,只是循环里的指针类型用错了。

内容的提问来源于stack exchange,提问作者RMF

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 02:20:25