我不明白指针的类型转换是如何工作的
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位)和端序。