您好我正在学习C中的结构和指针。这时我正在打印& tmp.z - 8时,该值与Iam进行类型转换和打印(char *)& tmp.z - 8时不同。我浏览了一些关于类型转换和指针的文章,但是找不到合理的理由,有人可以帮我解决这个问题吗?
struct xyz
{
int x;
char y;
double z;
}tmp;
int main()
{
printf("%p\n",&tmp.z - 8);
printf("%p\n",(char *)&tmp.z - 8);
return 0;
}
答案 0 :(得分:4)
tmp.z
是double类型的变量。
因此&tmp.z
会指向double
。
如果将1减去类型为double
的指针,则将转到上一个双位置,即8个地址减去(如果sizeof(double)为8))。如果您使用&tmp.z - 8
,您将获得64个地址,小于&tmp.z
如果你进行类型转换,(char *)&tmp.z
会给出一个字符指针。如果从中减去8,则在此之前将获得8个字符,即地址为8个位置,因为字符的大小为1。