【发布时间】:2022-01-25 07:13:43
【问题描述】:
请帮我把头发扯掉! C不知道如何打印正确的地址或什么?如果是这样,我们就忽略它吗?我已经解释了这段代码中的所有内容:
#include <stdio.h>
int main()
{
int a[] = {0xA, 0xB};
printf("%p", &a); printf(" <---address of 'a'\n");
printf("0000000000%X", a); printf(" <---content of 'a'\n");
printf("%p", &a[0]); printf(" <---address of a[0]\n");
printf("000000000000000%X", a[0]); printf(" <---yet the content of a[0] is not the same as the content of 'a' despite sharing the same memory location\n\n");
return 0;
}
我尝试了一个常规指针,它的内容是一个地址,它的地址?不同的地址。恐怕我对指针的基本理解是错误的。提前谢谢你
【问题讨论】:
-
你用的是什么编译器?
-
给定
int[] a、a(由于数组衰减)和&a[0]计算为同一对象的地址。 -
即
a == &a[0]。使用该信息更新输出消息(和相应的格式)(并同样更新&a和a[0]案例)可能会减少一些混乱并提出更精细的问题。 -
虽然,正如已经评论和回答的
a == &a[0],当您使用(不正确的)格式转换%X时,您不一定会看到相同的内容。在具有 64 位地址和 32 位整数的 little-endian 平台上,%X很可能只打印a地址的低 32 位。为了进一步混淆,它将以大写形式打印十六进制数字,尽管%p可能以小写形式打印它们。00000000000%X也有点奇怪。如果您希望以精确的 16 位数字打印转换,请使用%016X。%16X将插入前导空格。 -
... 当然,使用整数格式转换代码打印指针是未定义行为。所以它可能会做任何事情。您应该请求并尊重编译器警告。我只是指出您可能在常见平台上看到的内容。