(int)a 和 *(int*)&a 有什么区别

时间:2021-01-30 10:16:46

标签: c pointers casting

我对 (int)a*(int*)&a 之间的区别很感兴趣。它们有不同的输出。

1 个答案:

答案 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