为什么此代码显示"cannot convert 'double' to 'double*'"错误?

Why does this code show the "cannot convert 'double' to 'double*'" error?

本文关键字:double to 错误 代码 cannot convert 为什么 显示      更新时间:2023-10-16

考虑以下代码:

double dist(double x[3], double y[3])
{
    double Sum;
    double distance;
    for(int i=0; i<3; i++)
    {
        cout << "Enter value of first coordinate";
        cin >> x[i];
        cout << "Enter value of second coordinate";
        cin >> x[i];
        Sum = Sum + pow((x[i] - x[i]), 2.0);
        distance = (int)sqrt(Sum);
    }
        cout << "DISTANCE: " << distance;
    return distance;
}
int main()
{
    int i, n;
    double x[3]; double y[3];
    cout << "enter number of test case" << endl;
    cin >> n;
    for(i=0; i<n; i++)
    {
        dist(x[i], y[i]);
    }
    return 0;
}

在线路dist(x[i], y[i])上,它不断给出错误

无法将参数"1"的"double"转换为"double*"以将其转换为"double-dist(double*,double*)"

这不是将数组传递给函数的方式:

for (i = 0; i < n; i++) {
    dist(x[i], y[i]);
}

您可能认为您使用一个包含x[0..n-1]中所有值的数组调用了函数dist一次(对于y也是如此)。事实并非如此。由于您处于循环中,您调用函数的次数与循环运行的次数一样多,在本例中为n次。

此外,作为参数传递给函数的值是double类型的元素。它不是您认为要提供的阵列。


我知道这个错误信息看起来很奇怪。"double*从哪里来?"你可能会问自己。答案很简单:

数组不能传递给函数

由于所谓的"类型衰减",数组在表达式中使用时会转换为指向其第一个元素(基地址)的指针。distdist(double x[3], double y[3])的参数类型与dist(double* x, double* y)完全等效。这意味着,当您错误地尝试将double的传递给函数时,编译器报告您无法将它们转换为指针。

传递数组的名称将传递指向第一个元素的指针。这将解决您的主要问题:

dist(x, y);

您仍然可以在指针上使用下标运算符x[n]的原因是,下标运算符是*(x + n)的语法糖。也就是说,一个偏移n的指针加上一个解引用,为您提供该地址的值。


这种类型衰减还带来了另一个问题:由于数组被转换为指针,因此无法确定其类型附带的大小信息。您可以有一个函数,它接受一个double[100],并向它传递一个包含1个元素的数组,因为当数组衰减到一个指针时,它们的类型完全匹配。有几种方法可以解决这个问题:

  • 使参数成为函数的引用/指针
  • 使用标准库数组类

现在,指针和引用是两种不同的东西,但它们仍然可以用来解决这个问题。使用对数组的引用与实际传入数组本身不同。引用充当对象的别名,它们基本上是一个隐藏的指针,只有少数例外(请参阅提供的链接)。然而,对于我们的例子来说,一个参考就足够了,下面是它的样子:

double dist(double (&x)[3], double (&y)[3]);

类型衰减不会在这里发生,并且您有一个保证的大小,因为如果传入任何其他大小的数组,编译器将报告错误。

参考资料是有用的,但它可能会让第一次来的人反感。幸运的是,标准库为我们提供了一个数组类std::array。不需要奇怪的语法,它有一个更干净的接口-没有指针!

#include <array>
double dist(std::array<double, 3> x, std::array<double, 3> y);
std::array<double, 3> x, y;
dist(x, y);

您的dist函数已经循环了3次。你可能想去掉main() 中的循环

  cin>>n;
  dist(x,y);
  return 0;

这样,x和y都是double*

只是猜测你的意图,通过

只需调用

dist(x, y);

实际上,您传递的是来自数组的双值,而不是数组本身。