我是一名专业的软件开发人员,但我基本上不熟悉C ++语法。我试图将指针末尾的值与继承的C ++项目中的double进行比较。
以下代码成功从文本文件中获取valueAddress并打印,例如
|"Primary key value"|123.456|
其中123.456是文本文件中地址的double值。
...
char DebugString[64];
int valueAddress;
fscanf(inputFile, "%s %d", key, &valueAddress);//inputFile declared elsewhere
printf("|");
printf(database->primaryKey);// Defined elsewhere and not the focus of this question
printf("|");
sprintf_s(DebugString,64,"%g",* ((double *)valueAddress));
printf(DebugString);
printf("|");
...
为什么然后,我不能使用:
来访问该值if ((double *)valueAddress < -0.5)
{...}
因为我收到错误“错误C2440:'&gt;' :无法从'double'转换为'double *'“
我也做不到:
if ((double) *valueAddress < -0.5)
{...}
因为我收到错误“错误C2100:非法间接”。创建变量并尝试分配它也不起作用。
valueAddress是文本文件中的整数,它是double值的内存地址。所以我需要使用int valueAddress作为双指针。将值放在DebugString中时,它显然有效,那么为什么它不能在if语句中起作用?我怎么能绕过这个?
我显然误解了这里的语法。我有什么问题?
答案 0 :(得分:3)
使用int
表示存储在某个地方的双精度型地址并尝试将int
强制转换为double*
是未定义的行为在C ++中。< / p>
int
甚至可能不足以容纳指针地址。在64位系统上,32位int
是不够的。
你可能会使用intptr_t
代表地址,并使用*(double*)valueAddress
进行投射。但它仍然没有明确定义。
我愿意在这一点上予以纠正,但我认为唯一可行的选择是针对您的平台特定的内联汇编解决方案来实现此转换。也就是说,你只是从文本文件中读取数据,你可以使用完全正常的C ++来实现。
答案 1 :(得分:2)
首先,int
不是存储内存地址的正确数据类型。你真的应该使用intptr_t
中的<stdint.h>
,保证其大小正确。
要将此值重新解释为double*
并取消引用以进行比较,您可以执行以下操作:
if ( *(double*)valueAddress < -0.5 )
但我对此有点担心。除非该指针引用已属于您的程序的内存,否则不允许您访问它。这样做将属于未定义行为的范畴。
答案 2 :(得分:1)
您需要取消引用指针
if ( * ( (double * ) valueAddress ) < -0.5)
首先转换为指针,然后找到指向的值。