【问题标题】:Pointer argument from double to double*从双精度到双精度的指针参数*
【发布时间】:2018-07-13 21:38:28
【问题描述】:

我编写了一个非常基本的程序来尝试更好地理解指针,但我无法弄清楚它们。我继续收到错误 'void celsius(double *)': cannot convert argument 1 from 'double' to 'double *'

#include <iostream>

using namespace std;

void celsius(double*);

int main() {

    double temp;
    double value;

    cout << "Enter temperature in C ";
    cin >> value;

    temp = celsius(value);

    cout << temp << endl;

    return 0;
}

void celsius(double *par) {
double tem;

tem = (1.8 * par + 32);
    return tem;
}

在参考了几个资源后,我无法弄清楚为什么它会返回错误。我知道错误说这是因为它无法将双精度转换为双精度*,但我在网上看到的示例无法解释原因。

对代码或解释的任何帮助都很棒。谢谢。

【问题讨论】:

  • 您必须将value 的地址传递给需要指针的函数。例如:temp = celsius(&amp;value); 注意:这将揭示其他问题。
  • 只需将void celsius(double*) 更改为double celsius(double)。函数没有理由需要指针。
  • 另外,听起来你可以使用good C++ book
  • void celsuis(... 也应更改为 double celsius(...,因为您要返回 double
  • 我建议在指针之前探索 references。例如,声明void celsius(double&amp; variable)。通过引用传递时,函数知道参数存在。传递指针时,该点可能指向任何地方,不包括来自调用者的变量。使用引用更安全。

标签: c++ function pointers void


【解决方案1】:

您需要对您的程序进行以下更改。

  1. 将函数的返回类型改为double

    double celsius(double*);
    
  2. 当你调用函数时,确保你传递一个指向double的指针,而不是double

    temp = celsius(&value);  // Use &value, not value
    
  3. 在函数中,你需要使用*par来解引用指针并使用它的值。

    tem = (1.8 * (*par) + 32);  // Use *par not just par
    

另一种选择是保持返回类型不变,但更改函数的实现。

void celsius(double *par)
{
   *par = (1.8 * (*par) + 32);
}

将用法改为just

celsius(&value);
cout << value << endl;

【讨论】:

  • 为什么不建议将void celsius(double*) 更改为double celsius(double)?这是一个变化而不是 3 个。
  • @NathanOliver,我不想改变 OP 的动机 - 尝试更好地理解指针
  • 啊,那样的话void celsius(double *par) { *par = (1.8 * (*par) + 32) }celsius(value); cout &lt;&lt; value &lt;&lt; endl; 会展示更多。
  • @NathanOliver,这也是一个选项。谢谢:)
  • 感谢您的帮助!这有助于我更多地理解它。问题的一部分是查看了这么多不同的示例,而没有看到拼凑在一起的内容。但是这些例子确实很好地证明了这一点:)
【解决方案2】:

我敢肯定这已经说过十亿次了,但将指针变量视为一个变量。

double* 只是一种类型,在 32 台非机器上它可以保存 4 个字节的值。在 64 非机器上,寻址空间更大,因此指针更大。

那么,如果 double* 只是一个可以存储 double 的 4 字节地址的变量,那么它需要某物的地址...

你可以使用'&'获取其他变量的地址

例子:

double* ptr = &anotherVariable;

现在“ptr”包含一个 4 字节地址,然后您可以通过取消引用双指针本身来访问变量内容。

例子:

*ptr = 4.2;

但是,“ptr”变量本身包含一个地址,因此之前分配给它的“anotherVariable”也具有值 4.2

现在,如果您将值传递给函数并且函数参数是“double* temp”。您可以将变量的地址或实际指针传递给它,并且在函数内部您可以执行与上述相同的所有操作。

【讨论】:

  • 感谢您对这些工作方式的看法,这对我的理解很有帮助。真的很感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多