如何将double *转换为double?

时间:2009-12-24 05:33:25

标签: c++

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

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

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

我希望你明白这个主意。最后一行导致了问题。最初角度为void*类型,因此我必须先将其转换为double*

6 个答案:

答案 0 :(得分: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 *的指针所指向的值。为了做到这一点,我们需要在赋值的左侧使用一元*,以表明我们想要写入指针所指向的位置。

// 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(如{ {1}}可以在运行时检查类型是否正确。)

答案 1 :(得分: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

答案 2 :(得分:1)

请注意以下这一行:

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

你写过&double的地方,我认为它应该是&dbangle。为了提高可读性,我写道:

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

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

答案 3 :(得分: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

答案 4 :(得分:0)

使用reinterpret_cast。

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

答案 5 :(得分: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); 
}