我已经通过sizeof 运算符等效。
size_t size = (size_t)(1 + ((X*)0));
却无法理解是什么意思(int*)0 or (int*)1000
。
它告诉编译器什么?为什么要添加一个?你能否详细说明一下。
我已经通过sizeof 运算符等效。
size_t size = (size_t)(1 + ((X*)0));
却无法理解是什么意思(int*)0 or (int*)1000
。
它告诉编译器什么?为什么要添加一个?你能否详细说明一下。
(int *)0
表示“将 0 视为整数的地址”。加一得到内存中“下一个”整数的地址。因此,将结果转换回整数会为您提供整数的大小。
但是,这依赖于未定义的行为,因此您不应该使用它。
这只是创建了一个指向地址 0 的指针。向它添加 1 确实会在指针上递增。这具有将地址与数据类型的大小一起推进的效果。在示例中,size 将包含类 X 的大小,因为指针将前进类 X 的大小,并且初始指针值为零。
了解
(int*)0
or的含义(int*)1000
。
这些只是演员表,与这里的第二行完全相同:
int a = 25;
short b = (short)a;
转换a
为short
允许您将值分配给b
,其类型为short
。这与(int*)0
- 您只是告诉编译器将0
其视为指向int
.
关于强制转换的事情是你本质上是在告诉编译器:“看,我知道我在这里做什么,所以按照我告诉你的去做,不要再抱怨类型不匹配了。” 这意味着您确实需要知道自己在做什么,以及最终代码中的效果是什么。任何包含类似表达式的代码(int*)1000
都可能a)高度可疑和b)非常依赖于编译器和编写代码的平台的细节。这可能在某种嵌入式系统中有意义,因为您控制整个系统,所以您知道内存位置 1000 会发生什么。一般来说,你应该避免这样的代码。