有关此类型转换问题的任何想法吗?
这是我想要做的。这不是实际的代码:
LinkedList* angles;
double dblangle;
dblangle = (some function for angle calculation returning double value);
(double*)LinkedListCurrent(angles) = &double;
我希望你明白这个主意。最后一行导致了问题。最初角度为void*
类型,因此我必须先将其转换为double*
。
答案 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);
}