如何将double*转换为double?

3

有关类型转换问题的任何想法吗?

这是我正在尝试的内容。以下并非实际代码:

LinkedList* angles;
double dblangle; 
dblangle = (some function for angle calculation returning double value);
(double*)LinkedListCurrent(angles) = &double; 

我希望你能理解。最后一行代码出现了问题。初始时,angles是void*类型,所以我必须先将其转换为double*类型。


将double*转换为double并不是一个好主意。你为什么想这样做呢?无论如何,你可以使用reinterpret_cast进行此类转换。 - Prasoon Saurav
还应该阅读这篇文章:https://dev59.com/IXRC5IYBdhLWcg3wVvct - Prasoon Saurav
1
我已经将您在答案中的评论复制到了您实际的问题中,并添加了一些格式。这样可以更容易地看到和阅读它。通常在原始问题中包含这样的片段是一个好主意。 - Brian Campbell
非常感谢您的辛苦阅读。 - Muhammad Farhan
那个伪代码仍然不是很有帮助。右侧应该放什么?LinkedListCurrent(angles)是做什么的?为什么要在C++中实现自己的链表而不使用std::list?您确定要使用C吗? - Potatoswatter
6个回答

8
您使用一元运算符*来取消引用指针。取消引用指针意味着提取所指向的值,以获取原始类型的值。
// Create a double value
double foo = 1.0;
// Create a pointer to that value
double *bar = &foo;
// Extract the value from that pointer
double baz = *bar;
编辑2:(删除编辑1,因为它与你实际的问题无关,而是基于误解)
从你的说明中看来,你想知道如何设置一个指向已从 void * 转换为 double * 的指针所指向的值。为了做到这一点,我们需要在赋值语句的左侧使用一元运算符 *,以表示我们要写入指针所指向的位置。请注意保留html标记。
// Get a void * pointing to our double value.
void *vp = &foo;
// Now, set foo by manipulating vp. We need to cast it to a double *, and
// then dereference it using the * operator.
*(double *)vp = 2.0;
// And get the value. Again, we need to cast it, and dereference it.
printf("%F\n", *(double *)vp);

所以,我假设你的LinkedListCurrent返回指向链表中某个元素的void *,并且你希望更新该元素。在这种情况下,你需要执行以下操作:

*(double*)LinkedListCurrent(angles) = dbangle;

这将更新由LinkedListCurrent返回的指针所指向的值,使其等于dbangle。我认为这就是你想做的事情。
如果你试图更新LinkedListCurrent返回的指针,那么你是做不到的。该指针已被复制到一个临时位置,用于从函数中返回。如果你需要返回一个可以更新的指针,你必须返回一个指向指针的指针,并更新内部指针。
我的解释基于我根据你发布的示例片段和我对接口的一些猜测,推断出你想做什么。如果你想要更好的解释,或者如果我的某个假设是错误的,你可能需要尝试发布一些实际的代码、任何错误消息以及关于你想做什么的更详细的说明。显示链表数据类型的接口将有助于提供一些上下文来解释你的问题是关于什么的。 编辑3:正如评论中指出的那样,你可能不应该在这里进行强制类型转换;强制类型转换应该尽可能少地使用。通常应该使用模板化的集合类型,这样你的编译器就可以为你进行类型检查。如果你需要在同一个结构中存储异构类型,它们通常应该共享一个超类,并具有执行操作的虚拟方法,如果你真的需要将一个值强制转换为特定类型,则使用dynamic_cast(因为dynamic_cast可以在运行时检查类型是否正确)。

这是我想要做的事情。以下不是实际的代码:LinkedList* angles; double dblangle; dblangle = (某个返回double值的角度计算函数); (double*)LinkedListCurrent(angles) = &double; 希望你能明白我的意思。最后一行引起了问题。初始时,angles是void类型,因此必须先将其转换为double - Muhammad Farhan
很好,人们不仅回答问题,还会提出更多问题以找出真正的问题所在。我删除了我的答案,这样它就会被投票支持,因为这个回答更全面。 +1。 - Todd Gamblin
需è¦پن½؟用reinterpret_castم€‚:( - GManNickG
@GMan 真的,不应该需要使用任何类型的强制转换。在C++中,您不应该使用带有void指针的链表数据类型,而应该使用模板化数据结构或包含具有虚函数指针的对象的数据结构。最坏的情况下,如果需要提取特定类型的对象,则应该使用dynamic_cast。很难在一个答案中解释所有这些问题,特别是没有关于他正在尝试做什么的更多信息,因此我想尝试回答只是直接的问题,而不进一步涉及风格问题。 - Brian Campbell

2

为什么你要把内存地址当做浮点数来使用呢?

如果你的意思是取解引用

double d = 1.0;  // create a double variable with value 1.0
double *dp = &d; // store its address in a pointer
double e = *dp;  // copy the value pointed at to another variable

我想要做与你在这里所做的相反的事情。我想将指针中的值复制到d浮点数变量中。我该怎么做呢? - Muhammad Farhan
我不明白。这段代码同时执行了两个操作:将一个地址存储在指针中,然后对指针进行解引用以获取指向的数字。我会添加注释。 - just somebody
如果你真的想在e中使用dp的地址,那么你必须解释为什么。 - just somebody
这是我想要做的事情,以下并非实际代码:LinkedList* angles; double dblangle;dblangle = (某个返回双精度值的角度计算函数); (double*)LinkedListCurrent(angles) = &double;希望你能理解我的意思。最后一行代码引起了问题。初始时angles是void类型,所以我必须先将其转换为double类型。 - Muhammad Farhan

1
请注意这一行:
(double*)LinkedListCurrent(angles) = &double;

在你写的地方,&double 应该改为 &dbangle。为了提高可读性,我会这样写:

((double*)LinkedListCurrent(angles)) = &dbangle;

然而,正如其他人所提到的那样,你不应该进行这种类型的转换。


0
使用联合体。如果您想要将两个变量存储在一个内存位置中(但不是同时),您不必假装其中一个是另一个。
union double_and_ptr {
    double d;
    double *p;
};

double_and_ptr x, y;
x.d = 0.1;
y.p = &x.d; // store a pointer in the same place as a double
y.d = x.d * 1.2; // store a double in the same place as a ptr

0

使用reinterpret_cast。

double foo = 3.0;
double* pfoo = &foo;
double bar = reinterpret_cast<double>(pfoo);

从技术上讲是正确的。但我无法想象为什么有人会这样做...如果他们真正理解它的作用的话。(此外,如果指针只有64位,它不是只能“工作”吗?) - Stephen C

0
回答如下:

我想做与你在这里所做的相反。我想将指针的值复制到d浮点数中。我该怎么做?

您可以像这样操作:

// declare a pointer to a double
double *pointer_to_double; 

// declare a double
double my_double = 0.0;

// use the indirection operator (*) to dereference the pointer and get the value
// that it's pointing to. 
my_double = *pointer_to_double;

在实际编程中,可以这样完成:

void print_chance_of_snow(double *chance)
{
    double d = *chance;
    d = d * 100; // convert to a percentage
    printf("Chance of snow is: %.2f%%\n", d);
}

int main(int argc, char *argv[])
{
    double chance_of_snow = 0.45;
    print_chance_of_snow(&chance_of_snow); 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接