【问题标题】:return an address of a double返回双精度地址
【发布时间】:2010-04-01 19:13:57
【问题描述】:

我在理解以下工作的原因时遇到了问题:

void doubleAddr(double* source, double** dest)
{
     *dest = source;
}

我得到一个指向双精度的指针,并想更改 dest 指向的双精度:

//usage:
int main()
{
     double* num;
     double* dest;

     doubleAddr(num, &dest);
     return 0;
}

提前致谢

【问题讨论】:

  • 你刚刚将 dest 指向与 num 指向相同的东西,这是一个未定义的地址
  • 哦,间接的乐趣。我相信其他人会有一个很好的答案:-)
  • 其实你没事。现在更清楚了。谢谢

标签: c function pointers


【解决方案1】:

您没有正确使用指针。首先,您没有在main() 中初始化任何东西,所以这非常危险。 doubleAddr() 的代码是正确的,但它复制的是指针,而不是双精度。如果您尝试通过指针复制数字,则需要类似:

void copyDouble(double source, double *dest)
{
    *dest = source;
}

int main()
{
    double num = 5.6;
    double dest;

    copyDouble(num, &dest);

    printf("%f\n", dest);
    return 0;
}

如果您想做一些不同的事情,可以添加更多 *&

【讨论】:

  • 你说得对,我没有正确使用指针,但这不是我的意图。我真的只想将源地址分配给 dest。谢谢
【解决方案2】:

该函数有效,因为您实际上并没有访问它所指向的内存。您只是将目标指针变量分配为指向与源指针变量相同的内存地址,仅此而已。由于您的“num”变量实际上并未指向内存中的有效双精度值,因此如果您之后尝试取消引用指针,您的代码将出现不良行为,因为它指向随机内存。换句话说:

int main() 
{ 
     double* num; // <- uninitialized, points at random memory
     double* dest; 

     doubleAddr(num, &dest); 
     // 'dest' now points to the same address that 'num' points to

     *dest = 12345.0; // BAD!!!!

     return 0; 
} 

让代码工作的正确方法如下:

int main() 
{ 
     double num; // <- physical value in memory
     double* dest; 

     doubleAddr(&num, &dest); 
     // 'dest' now points at 'num'

     *dest = 12345.0; // OK! 'num' is updated correctly    

     return 0; 
} 

【讨论】:

  • 谢谢。我的样本中的问题是我实际上并没有指向双打,我想有点着急......无论如何,你是被选中的:)你的答案是最完整的
【解决方案3】:

在您的函数中,source 是指向双精度的指针。 dest 是一个指向 double 的指针。

*dest = source

取消引用dest 一次(使其成为指向双精度的指针)并将其设置为source

main() 中,dest 是一个指向双精度的指针,您在调用doubleAddr 时获取它的地址,使其成为指向双精度指针的指针。

【讨论】:

    【解决方案4】:

    让我们一步一步来:

    • doubleAddr 有效,因为double** dest 是一个指向指针的指针。这并不是最好的方法,但却是一个很好的学习练习。

    • 1234563
    • 由于source 也是一个“双”指针,所以*dest = source 可以正常工作。

    顺便说一句,您的程序不完整。如果你想测试它,你需要修改它,例如:

    int main()
    {
     double* num;
     double* dest;
     double test;
     num = &test;
    
     doubleAddr(num, &dest);
     printf("%lf\n", *dest);
     return 0;
    }
    

    【讨论】:

    • 不错。一步一步对我有用。好吧,我有点着急,忘了让指针指向某个东西。你的回答让事情变得更清楚了,谢谢。谢谢
    【解决方案5】:

    在第一个函数中,source 是一个指向 double 的指针,而 dest 是一个指向 double 的指针,这样就可以被函数修改。

    任务

      *dest = source; 
    

    修改dest的调用者副本。

    而且,是的,main 用未初始化的数据调用它。垃圾进垃圾出。

    【讨论】:

    • 是的,有垃圾问题,我会清理它。谢谢你的时间
    【解决方案6】:

    首先,我很惊讶它的工作 - 这归结为“好运”......因为变量指向任何东西,它第一次工作,下一次你可能不会那么幸运,最糟糕的是代码会崩溃!

    为了更好地理解这一点,试试这个:

    doubleAddr的调用是正确的,但是……你没有为变量numdest分配内存,如下图稍微改变一下参数。

    双数 = 5.0F; 双目标= 0.0F; doubleAddr(num, &dest);

    然后修改doubleAddr的参数

    void doubleAddr(双源,双* dest) { *dest = 来源; }

    注意dest 的值是'5.0',这是一个引用调用参数,它采用变量dest 的地址。

    【讨论】:

    • 我尝试传递地址本身,而不是更改值。在我的项目中,我们得到一个指向结构的指针,并且需要返回其中一个字段的地址。这就是我使用双**的原因。谢谢你的时间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    相关资源
    最近更新 更多