我想将数字与地址进行比较。 这是代码。
#include "stdio.h"
int main (void) {
int a = 1;
printf("%#x\n", &a); // The address of a is 0x18ff44
int b = 0x18ff44;
if (b == &a) { //error
printf("no\n");
}
return 0;
}
我想知道我是否可以将号码与地址进行比较。
错误:错误C2446:' ==' :没有来自' int *'到' int'
我做了一些研究,我有两个假设:
可能因为不同的数据类型无法进行比较。
但是我尝试将float的数据类型与char进行比较,并且代码被认可是正确的。
我的假设是,当执行关系操作时,编译器需要将type1转换为type2。但转换为' int *'到' int'没有意义。 我的问题:这个假设是否正确?如果不是,为什么会发生这种情况?
编译器信息:从https://www.microsoft.com
下载的VC 6.0答案 0 :(得分:1)
b
(int
)的类型不兼容,表达式&a
(int *
)的类型。修复很简单 - 将b
声明为int *
:
int *b = (int *) 0x18ff44; // literal will have integral, non-pointer type,
... // so the cast is necessary
if ( b == &a ) // int * == int *
{
...
}
现在表达式具有兼容的类型,错误将消失。
要打印指针值,请使用%p
转换说明符,如下所示:
printf( "&a = %p\n", (void *) &a );
这是C中极少数(如果不是唯一的)地方之一,需要施放void *
。
修改强>
要回答较大的问题,为什么 int
与int *
不兼容?
int
数据类型是签名类型,只有保证才能表示[-32767,32767]
范围内的值。它可能能够表示更广泛的值(并且在大多数现代实现中,它通常[-232, 232-1]
),但它可能或可能不能表示所有可能的指针值。指针值可以转换为int
值,反之亦然,但结果不能保证有意义或定义明确。
指针类型的表示基本上取决于实现,并且该表示甚至可能不是标量值。对于不同的指针类型,它甚至可能不同(尽管void *
和char *
必须具有相同的表示和对齐)。因此,int
和指针类型之间的直接比较可能没有意义。实现可以使用相同的字大小和表示,但由于不能保证这种情况,语言要求类型不兼容。
答案 1 :(得分:0)
这似乎有效:
public class Salary
{
protected Integer id;
protected Boolean simulated;
protected Double salary;
}
public class Simulation extends Salary
{
//you do not need Integer id here
private Double simulatedSalary;
private Double notsimulatedSalary;
private Double totalSalary;
}
编辑:为了64位系统的通用性,请使用:
#include "stdio.h"
int main (void) {
int a = 1;
printf("%p\n", &a); // The address of a is 0x18ff44
int b = 0x18ff44;
if (b == (int) &a) { //no error
printf("no\n");
}
return 0;
}
答案 2 :(得分:0)
是的,您可以将变量与地址进行比较,但这非常危险。
首先,您的代码使用gcc版本4.6.3正确编译。所以我假设编译器错误与MSVC有关,肯定会被禁用。
尽管如此,
地址类型为size_t
,可以(通常)为32或64,具体取决于您的计算机和构建环境。另一方面,整数可能小于size_t,不足以解决整个RAM!
所以我建议你使用size_t而不是int(或将你的整数和指针转换为size_t
),然后比较它们,我认为这是最安全的,因为我们真正比较两个内存更有意义指针类型而不是整数和浮点数。
我会做这样的事情:
size_t a_adr = (size_t)&a;
size_t b_adr = (size_t)&b;
if (a_adr == b_adr)
..
在处理我朋友的指针时要小心。