在函数c / c ++中传递指针时出错“double ** to double *”

时间:2016-03-29 00:03:36

标签: c++ pointers

我有一个double *result的函数。我知道指针需要通过函数中的引用传递。当我使用void ComputeSeriesPointer(double x, int n, double *result);在main中调用函数ComputeSeriesPointer(x, n, &result);时,我收到错误:

cannot convert ‘double**’ to ‘double*’ for argument ‘3’ to ‘void ComputeSeriesPointer(double, int, double*)’                            
 ComputeSeriesPointer(x, n, &result);                                                                                                                                                  
                                   ^

使用指针时,是不是都使用&键传递了它们?课堂上的例子都是这样完成的。即使在互联网上,事情也是这样完成的。任何解释/澄清都会很棒。

我也使用c ++编译器(按照我的教授的指示)运行它,因为我正在使用pow函数。

6 个答案:

答案 0 :(得分:1)

如果没有看到完整的代码,我不确定你在做什么,但是如果你做的是这样的话:

void ComputeSeriesPointer(double, int, double*){
    // ...
}

int main(){
    double *x = ...;
    ComputeSeriesPointer(1.0, 1, &x); 
    // ...
    return 0;
}

然后,问题是&x&运算符用于提取变量地址。在这种情况下,你的变量已经是一个指针,所以写&x你得到一个指向"的指针,换句话说就是double**。这是你的问题。以这种方式调用您的函数:ComputeSeriesPointer(1.0, 1, x)

答案 1 :(得分:0)

该函数期望您传递实际double变量的内存地址,而不是double*指针变量的内存地址:

double result; // NOT double*!
ComputeSeriesPointer(x, n, &result);

你也可以这样做:

double result; // NOT double*!
double *presult = &result;
ComputeSeriesPointer(x, n, presult);

答案 2 :(得分:0)

错误消息表明result的类型已经double *。如果变量已经是适当类型的指针,则不需要使用&运算符。所以你应该做

ComputeSeriesPointer(x, n, result);

或者,您需要将来自result的{​​{1}}变量的声明从double *更改为double

答案 3 :(得分:0)

你可能正在这样做:

double *myNewResult;
...
ComputeSeriesPointer(x, n, &myNewResult);

通过这样做,您传递的是double*而非double的地址。您不需要double *myNewResult,只需double myNewResult。或者如果您需要myNewResult成为double*,您可以将其传递给这样的函数:

ComputeSeriesPointer(x, n, myNewResult);

答案 4 :(得分:0)

该函数声明为

void ComputeSeriesPointer(double, int, double*);

第三个参数的类型为double *

但你把这个函数称为

ComputeSeriesPointer(x, n, &result);

其中第三个参数的类型为double **

您需要调用类似

的功能
ComputeSeriesPointer(x, n, result);

或者更改函数声明及其相应的定义,使第三个参数类型为double **

void ComputeSeriesPointer(double, int, double **);

答案 5 :(得分:-1)

将指针传递给函数 通过引用传递;指针是“引用”。 (C ++还引入了一些“引用”类型,它假装它不是指针,但这与你给出的代码示例无关。)

&运营商的意思是“地址”。它需要一个东西并返回指向该东西的指针。所以,

double x = 1; // this is a double
double *pointer_to_x = &x;
double **pointer_to_pointer_to_x = &pointer_to_x;

等等。

我们需要看一些代码调用ComputeSeriesPointer()才能正确回答,但我的猜测是你有:

double *result; // this kind of variable stores *the address of* a double-precision number. 
ComputeSeriesPointer( x, n, &result );

但你真的想要:

double result; // this kind of variable stores a double-precision number.
ComputeSeriesPointer( x, n, &result );

这样您就可以传入您希望ComputeSeriesPointer()将结果写入的地址。