Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将double*转换为double?_C++ - Fatal编程技术网

C++ 如何将double*转换为double?

C++ 如何将double*转换为double?,c++,C++,对这个打字问题有什么想法吗 这就是我要做的。这不是实际代码: LinkedList* angles; double dblangle; dblangle = (some function for angle calculation returning double value); (double*)LinkedListCurrent(angles) = &double; 我希望你能明白。最后一行是导致问题的原因。最初的角度是void*类型,因此我必须首先将其转换为double*为什

对这个打字问题有什么想法吗


这就是我要做的。这不是实际代码:

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

我希望你能明白。最后一行是导致问题的原因。最初的角度是
void*
类型,因此我必须首先将其转换为
double*

为什么您要使用内存地址作为浮点数

如果您的意思是取消引用:


您可以使用一元
*
运算符取消对指针的引用。取消引用指针意味着提取指向的值,以获得原始类型的值

// 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*
。为了做到这一点,我们需要使用赋值左侧的一元
*
,以指示我们要写入指针指向的位置

// 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\u cast
(因为
dynamic\u cast
可以在运行时检查类型是否正确)。

使用联合。如果希望将两个变量存储在一个内存位置(但不能同时存储),则不必假装其中一个是另一个

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
使用reinterpret_cast

double foo = 3.0;
double* pfoo = &foo;
double bar = reinterpret_cast<double>(pfoo);
double-foo=3.0;
双*pfoo=&foo;
双杆=重新解释铸件(pfoo);
回答这个问题:


我想做与你在这里做的相反的事。我想把指针上的值复制到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); 
}
请注意这一行:

(double*)LinkedListCurrent(angles) = &double;
如果你写了
&double
,我想应该是
&dbangle
。为了提高可读性,我将写:

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

但是,您不应该像其他人提到的那样进行这种类型的转换。

将double*转换为double不是一个好主意。你为什么要这么做?无论如何,你可以使用reinterpret_cast进行这样的转换。同时阅读:我已经将你的评论从答案复制到你的实际问题中,并添加了一些格式。这将使其更易于查看和阅读。通常,在原始问题中包含这样一个片段是一个好主意。非常感谢您经历了这些麻烦。那个伪代码仍然没有多大帮助。右手边应该是什么?LinkedListCurrent(角度)做什么?为什么你在C++中实现你自己的链表而不是使用STD::List.你确定要使用C语言吗?我想做与你在这里做的相反的事情。我想把指针上的值复制到d浮点数上。我怎么能这么做?我不明白。代码同时执行这两个操作:在指针中存储地址,然后取消对指针的引用以获取指向的数字。我会添加注释。如果你真的想在
e
中使用
dp
的地址,那么你必须解释原因。下面是我要做的。这不是实际的代码:LinkedList*angles;双D语言;dblangle=(返回双值的角度计算函数);(双*)LinkedListCurrent(角度)=&double;我希望你能明白。最后一行是导致问题的原因。最初的角度是void*类型,所以我必须首先将其转换为double*。这不是实际的代码:LinkedList*angles;双D语言;dblangle=(返回双值的角度计算函数);(双*)LinkedListCurrent(角度)=&double;我希望你能明白。最后一行是导致问题的原因。最初的角度是void*类型,所以我必须首先将其转换为double*。人们不仅回答问题,而且还提出更多的问题来找出真正的问题是什么,这很好。我删除了我的答案,所以这将得到投票,因为这是更全面的+1.
reinterpret\u cast
希望使用:(实际上,不应该使用任何类型的Casic。您不应该使用C++中的空洞指针的链表数据类型,而是应该使用<代码>模板化< /COD>数据结构,或者D。
((double*)LinkedListCurrent(angles)) = &dbangle;