【问题标题】:What is the difference between (int)a and *(int*)&a [duplicate](int)a 和 *(int*)&a 有什么区别 [重复]
【发布时间】:2021-05-04 02:25:18
【问题描述】:

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

【问题讨论】:

标签: c pointers casting


【解决方案1】:

这两种表达方式有很大的不同。

在这个表达式中

(int)a

对象a的值被转换为int.类型的整数值

在这个表达式中

*(int*)&a

子表达式(int*)&a 表示编译器为int 类型的对象分配了内存,也就是说,在内存中确实存储了一个int 类型的有效对象。但是,为对象分配的初始内存范围可能大于存储int 类型的有效对象的范围,或者不能存储int 类型的对象,因此取消引用指针可能导致未定义的行为。

使用第一个表达式,编译器尝试将值转换为 int 类型的值,而在第二种情况下,编译器尝试解释内存范围,因为它存储了 @987654330 类型的有效对象@。

这是一个演示程序。

#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*)&amp;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

【讨论】:

  • 但是这里 double 类型是用 int* 强制转换的,int 的大小和 double 的大小不同,但是 float 和 integer 的大小是一样的,不是吗?
  • @user15111237 但表示不同。我写过这个“或者不能存储 int 类型的对象”
  • 另外如果#define a 5那么它不会编译