繁体   English   中英

在 function 中修改和返回两个浮点数(或双精度数)的最佳方法?

[英]Best way to modify and return two float (or double) in a function?

我试图返回两个值, uv ,我将它们作为 arguments 传递给 function get_uv( float u, float v )

因为 double 和 float 与 integer 类型不兼容,我们无法将它们转换为指针,下面的代码给出错误:无法转换为指针类型。

void calc_uv( float *u, float *v )
{
    u = (float *) 0.0f;
    v = (float *) 1.0f; 
}

void anyfunction()
{
    float u, v;
    calc_uv( &u, &v )

    printf("u: %f , v: %f", u, v);
}

如果我使用它会起作用:

void calc_uv( float *u, float *v )
{
    *u = 0.0f;
    *v = 1.0f; 
}

但我不明白为什么,因为 u 和 v 已经是指针。 你能解释一下这里发生了什么吗?

从 function 修改和返回两个浮点数的最佳方法是什么?

我看到我可以使用类似float *f = malloc(sizeof *f); 但我的目标不是不择手段地获取指针,而是以最优雅或简洁的方式更改输入值。

但我不明白为什么,因为uv已经是指针。 你能解释一下这里发生了什么吗?

是的,function 接收这些变量作为指针。 它们包含什么? anyfunction() function 中分配的变量的地址。

现在您的意图应该是通过执行*u取消引用指针来修改此“地址”位置,这意味着将地址处的值“修改”为新值。 但是您实际上是通过执行u = (float *) 0.0f; ,这是完全错误的,因为指针存储的是地址而不是值。

但我不明白为什么,因为uv已经是指针。你能解释一下这里发生了什么吗?

您的困惑似乎是基于您没有正确理解指针在 C 中的工作原理,并且我们使用*运算符取消引用指针以访问它们实际指向的对象。

如果您使用:

void calc_uv( float *u, float *v )
{
    *u = 0.0f;
    *v = 1.0f; 
}

*u in *u = 0.0f; *v中的*v = 1.0f; 不是指针本身的第二次声明。

这些是使用*运算符对指针进行的操作,以解除对指针uv的引用,目的是访问它们在调用者中指向的对象。

看看这里:

“取消引用”指针是什么意思?

https://en.wikipedia.org/wiki/Dereference_operator


边注:

  • 你说“我正在尝试返回两个值”。 使用指针时,您实际上并没有return值。
float u, v;
calc_uv( &u, &v )

&u表示对u的引用(指针)

&v表示对v (指针)的引用

void calc_uv( float *u, float *v )

float *u - 指向浮动的指针

float *v - 指向浮动的指针

u = (float *) 1.0f;

您将指针分配为 1.0f 转换为浮点指针。 在这种情况下没有任何意义。

您需要取消引用(访问指针指向的 object)指针

*u = 1.0f 

我想我理解你的困惑。 *有不同的含义,具体取决于它的使用位置。

  1. 在声明中float *f; 它向编译器显示f是指针。
  2. 在表达式中*f = 1.0f; if 显示您取消引用指针f的编译器。 它不会再次声明/定义它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM