首页 理论教育 Arduino单片机实战开发技术:标量重要性

Arduino单片机实战开发技术:标量重要性

时间:2023-10-23 理论教育 版权反馈
【摘要】:代码清单8-4.Using an int Array如果运行该程序,它将显示01234。如果我们查看greet整数数组的内存映射,它已更改为图8-10所示:图8-10字符数组的变化请注意,与greet左值的偏移量始终是2个字节,而不是1个字节。显然,这是因为int占用的存储空间是char的两倍。Serial.print;Serial.print;Serial.print;Serial.print;这不是数组中第二个值的左值。在这种情况下,任何增量都会将偏移量增加2,因为每个int需要2字节的内存。

Arduino单片机实战开发技术:标量重要性

让我们对程序做一些小改动,如清单8-4所示。这个清单使用了我们在清单8-3中使用的第一个变体。

代码清单8-4.Using an int Array

如果运行该程序,它将显示01234(for循环的表达式2阻止显示最后一个元素)。如果我们查看greet整数数组的内存映射,它已更改为图8-10所示:

图8-10 字符数组的变化

请注意,与greet左值(2200)的偏移量始终是2个字节,而不是1个字节。显然,这是因为int占用的存储空间是char的两倍。但是,for循环中的语句的数学结果如何,请看:

Serial.print(greet[i]);

This seems like it should resolve as:

Serial.print(greet[i]);

Serial.print(greet+i);

Serial.print(2200+0);

Serial.print(2200);

它与数组中的第一个数字对齐。但是,当i=1时,下一个过程会发生什么?(www.xing528.com)

Serial.print(greet[i]);

Serial.print(greet+1);

Serial.print(2200+1);

Serial.print(2201);

这不是数组中第二个值的左值。出了什么问题?

事实上,没有出什么错,因为编译器不是这样计算的。每当编译器计算数组左值的偏移量时,它都会根据数据类型的标量来移动偏移量。为了证明这一点,请尝试使用上面的第二种变体,但不使用int。

Serial.print(*(greet+i*sizeof(int)));

Serial.print(*(greet+i*2);

Serial.print(*(2200+1*2);

Serial.print(*(2202);

这很好,因为2202是数组第二个元素的左值。如果使用以下语句尝试指针

Serial.print(*ptr++);

它也可以很好地工作,因为所有指针也被缩放以适合底层数据类型。在这种情况下,任何增量都会将偏移量增加2,因为每个int需要2字节的内存。你可以在程序中键入use更改数据,你会发现编译器总是缩放运算符以适应正在处理的数据。很好,你不必计较这些细节了。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈