让我们对程序做一些小改动,如清单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更改数据,你会发现编译器总是缩放运算符以适应正在处理的数据。很好,你不必计较这些细节了。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。