0

我已经通过sizeof 运算符等效

size_t size = (size_t)(1 + ((X*)0));

却无法理解是什么意思(int*)0 or (int*)1000

告诉编译器什么?为什么要添加一个?你能否详细说明一下。

4

3 回答 3

3

(int *)0表示“将 0 视为整数的地址”。加一得到内存中“下一个”整数的地址。因此,将结果转换回整数会为您提供整数的大小。

但是,这依赖于未定义的行为,因此您不应该使用它。

于 2012-06-07T14:01:37.837 回答
1

这只是创建了一个指向地址 0 的指针。向它添加 1 确实会在指针上递增。这具有将地址与数据类型的大小一起推进的效果。在示例中,size 将包含类 X 的大小,因为指针将前进类 X 的大小,并且初始指针值为零。

于 2012-06-07T14:04:29.210 回答
1

了解(int*)0or的含义(int*)1000

这些只是演员表,与这里的第二行完全相同:

int a = 25;
short b = (short)a;

转换ashort允许您将值分配给b,其类型为short。这与(int*)0- 您只是告诉编译器将0其视为指向int.

关于强制转换的事情是你本质上是在告诉编译器:“看,我知道我在这里做什么,所以按照我告诉你的去做,不要再抱怨类型不匹配了。” 这意味着您确实需要知道自己在做什么,以及最终代码中的效果是什么。任何包含类似表达式的代码(int*)1000都可能a)高度可疑和b)非常依赖于编译器和编写代码的平台的细节。这可能在某种嵌入式系统中有意义,因为您控制整个系统,所以您知道内存位置 1000 会发生什么。一般来说,你应该避免这样的代码。

于 2012-06-07T14:05:04.797 回答