将数组传递给函数而不是变量

时间:2020-05-03 12:22:32

标签: c

我有一个非常基本的问题,但是我真的不明白发生了什么。

我只想创建一个将数组作为输入而不是双精度的函数。为什么以下两个代码段不相同,即使对于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是未签名的字符

1 个答案:

答案 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),但不清楚您要完成什么。