-2

我不知道类型转换如何与指针一起工作

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

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

另外ptr的大小是多少?

4

2 回答 2

1

该行获取变量的地址x并将其值存储到ptr. 您必须进行分配,因为不允许将 double* 分配给 int* 。

通过ptr在赋值后取消引用,您违反了别名规则并导致您的程序显示未定义的行为。

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

于 2014-06-12T11:29:24.123 回答
0

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

#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 这是一个 double* 并将其转换为一个 int*。通过这样做,您将 &d 处内存中的任何内容解释为 int。这不是将 double 类型转换为 int 的简单问题,而是重新解释整个内存布局。这可能在不同的机器上具有不同的输出,具体取决于它们的架构(32/64 位)和字节序。

于 2014-06-12T11:28:13.903 回答