我对 (int)a
和 *(int*)&a
之间的区别很感兴趣。它们有不同的输出。
答案 0 :(得分:0)
这两种表达方式有很大的不同。
在这个表达式中
(int)a
对象a
的值被转换为int.
类型的整数值
在这个表达式中
*(int*)&a
子表达式 (int*)&a
表示编译器为 int
类型的对象分配了内存,即在内存中确实存储了一个 int 类型的有效对象。但是,为该对象分配的初始内存范围可能大于存储 int
类型的有效对象的范围,或者可能存储的不是 int
类型的对象,因此取消引用指针可能导致未定义的行为。
即使用第一个表达式,编译器尝试将值转换为 int
类型的值,而在第二种情况下,编译器尝试解释内存范围,因为它存储了该类型的有效对象int
。
这是一个演示程序。
#include <stdio.h>
int main(void)
{
double x = 1.5;
printf( "%d\n", ( int )x );
printf( "%d\n", *( int *)&x );
return 0;
}
它的输出是
1
0
另一个例子,当使用像这样的表达式 *(int*)&a
可以产生有效的代码和结果。
#include <stdio.h>
int main(void)
{
struct A
{
int x;
int y;
} a = { .x = 10, .y = 20 };
printf( "%d\n", *( int *)&a );
return 0;
}
程序输出为
10