二进制表达式的操作数无效,C语言

3

我正在开发一个函数,该函数接收一些值并找到这些值的最小值、最大值和平均值。我通过引用将所有内容传递给函数,但在执行基本操作(如+/)时遇到了一些错误。主要的错误提示是:

Invalid operands to binary expression ('double *' and 'double *')

void MinMaxAvg(double *pA, double *min, double *max, double *avg, int lines, double *total )
{
    for (int i=0; i<lines; i++)
    {
        if ( i==0)
        {
            min = &pA[0];
            max = &pA[0];
        }
        else
        {
            if (&pA[i] < min)
            {
                min = &pA[i];
            }

            if (&pA[i] > max)
            {
                max = &pA[i];
            }
        }

        total += &pA[i];     //<-- Errors on this line

    }

    avg = (total / lines);         // <-- Errors on this line.

}
3个回答

5

看起来你有些类型混淆了。在你的例子中,你是将 指针 设置为一个新值,而不是设置指针所指向的值。

第一个应该是:

*total += pA[i];

第二句应该是:“同时,需要注意的是:”
*avg = (*total / lines);

实际上,你可能想在第二个错误中使用浮点除法(一些编译器以意外的方式使用整数除法):

*avg = (*total / (double)lines);

如果你这样做,仍然会出现错误。例如&pA[i] > ...将导致指针比较,即将比较指针的地址。很可能不是你想要的结果。


谢谢!这非常合理!完全解决了我的问题。 - aprohl5
哪个编译器会在那里产生整数除法? - Fred Foo
很高兴能帮助到你;)-- @larsmans我看过至少一些Borland的编译器套件在这种情况下产生整数除法。但奇怪的是并不总是这样。某些版本似乎存在错误,但我猜它不会是唯一一个这样做的编译器。不过添加类型转换也没有坏处,所以小心谨慎总没错,对吧? - Magnus

2

您试图将地址添加到指针上,这是无效的操作。

您可能想要这样做:

*total += pA[i];

您对&pA的使用似乎非常混淆,对指针minmax的重新赋值也是如此。

如果您有一个指向值的指针(例如double *min),那么*min就是访问(读取或写入)被指向的值的方式。


1
在C语言中没有像C++那样的“按引用传递”(pass by reference)机制。如果你想要使用变量的值,需要在代码中对每个指针进行解引用操作。现在你正在处理变量的地址。

不太确定你的意思,因为我的代码似乎运行得很好。 - aprohl5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接