我不知道类型转换如何与指针一起工作
double x = 0.7;
int *ptr = (int *)&x;
*(byte )&x发生了什么?&x 表示变量x的地址。那么类型转换地址是什么意思呢?现在 ptr 也可以引用 x 吗?如果是,那么我们不会丢失数据吗?
另外ptr的大小是多少?
我不知道类型转换如何与指针一起工作
double x = 0.7;
int *ptr = (int *)&x;
*(byte )&x发生了什么?&x 表示变量x的地址。那么类型转换地址是什么意思呢?现在 ptr 也可以引用 x 吗?如果是,那么我们不会丢失数据吗?
另外ptr的大小是多少?
该行获取变量的地址x
并将其值存储到ptr
. 您必须进行分配,因为不允许将 double* 分配给 int* 。
通过ptr
在赋值后取消引用,您违反了别名规则并导致您的程序显示未定义的行为。
大小ptr
等于sizeof( ptr )
orsizeof( 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 这是一个 double* 并将其转换为一个 int*。通过这样做,您将 &d 处内存中的任何内容解释为 int。这不是将 double 类型转换为 int 的简单问题,而是重新解释整个内存布局。这可能在不同的机器上具有不同的输出,具体取决于它们的架构(32/64 位)和字节序。