用指针进行类型转换



我不明白指针的类型转换是如何工作的

double x = 0.7;
int *ptr = (int *)&x;

*(byte )&x是怎么回事?&x表示变量x的地址。那么地址的类型转换是什么意思呢?现在ptr也可以指向x吗?如果是,我们不会丢失数据吗?

ptr的大小是多少?

这行取变量x的地址,并将其值存储到ptr。必须强制转换赋值,因为不允许将double*赋值为int*。

通过在赋值后解引用ptr,违反了混叠规则,导致程序显示未定义的行为。

ptr的大小等于sizeof( ptr )sizeof( int* )表达式的结果

让我们稍微重构一下你的代码:

#include <stdio.h>
#include <stdlib.h>

int main (void)
{
    int i;
    double d = 0.7;
    unsigned char* c = (unsigned char*)&d;
    for (i = 0; i < sizeof(d); i++) {
        printf("%x ", c[i]);
    }
    unsigned int* n = (unsigned int*) &d;
    printf("n%x", *n);
    return 0;
}
上面的程序输出如下所示:
$ ./test.exe
66 66 66 66 66 66 e6 3f
66666666

那么地址类型转换是什么意思呢?现在ptr还可以参考吗x ?如果是,我们不会丢失数据吗?

基本上你要做的就是取&d,它是一个双精度*型,然后把它转换成int*型。通过这样做,您将把驻留在&d内存中的任何内容解释为int。这不是将double类型转换为int类型的简单问题,而是重新解释整个内存布局。这可能在不同的机器上有不同的输出,这取决于它们的架构(32/64位)和端序。

相关内容

  • 没有找到相关文章

最新更新