我有一个非常基本的问题,但是我真的不明白发生了什么。
我只想创建一个将数组作为输入而不是双精度的函数。为什么以下两个代码段不相同,即使对于j == 0也是如此? (打印 * buf 时,我得到了不同的值)
1。)
void
SVPublisher_ASDU_setFLOAT64(SVPublisher_ASDU self, int index, double value)
{
uint8_t* buf = (uint8_t*) &value;
打印:
valueArray value: 1.145000
2。)
void
SVPublisher_ASDU_setFLOAT64Array(SVPublisher_ASDU self, int index, const double* valueArray, int length)
{
for (int j = 0; j < length; ++j) {
uint8_t* buf = (uint8_t*) (valueArray + 8 * j);
打印:
valueArray value: 3070733822295138354700875252470016317131267959765042782153548795915832793917922493698408448.000000
uint8_t是未签名的字符
答案 0 :(得分:1)
uint8_t* buf = (uint8_t*) &value;
将buf
设置为value
的地址,该地址是一个参数,表示它是所传递的参数的副本。编译器将该副本放置在某处,因此buf
获取该位置的地址。 uint8_t* buf = (uint8_t*) (valueArray + 8 * j);
将buf
设置为根据valueArray
计算的地址,该地址是传递给它的地址,并且该地址是调用方的某个数组(或单个对象)的开始。没有理由期望它们相同。一组源代码中的参数地址与另一组源代码中的某个数组的地址基本无关。
此外,(uint8_t*) (valueArray + 8 * j);
不太可能是您想要的计算。由于valueArray
是指向double
的指针,使用+ 8 * j
的地址算术以double
为单位工作,因此valueArray + 8 * j
是内存中的一个地方valueArray
大小为8 * j
类型的double
个对象。稍后强制转换为(uint8_t *)
不会影响此;它导致算术运算后的转换。您可能想在这里(uint8_t *) (valueArray + j)
,但不清楚您要完成什么。