【问题标题】:'a' is an array, its content is its address, the address of a[0] is also the address of 'a', yet the content of a[0] is not the address of 'a', how?'a'是一个数组,它的内容就是它的地址,a[0]的地址也是'a'的地址,但是a[0]的内容却不是'a'的地址,怎么办?
【发布时间】: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[] aa(由于数组衰减)和&amp;a[0]计算为同一对象的地址。
  • a == &amp;a[0]。使用该信息更新输出消息(和相应的格式)(并同样更新 &amp;aa[0] 案例)可能会减少一些混乱并提出更精细的问题。
  • 虽然,正如已经评论和回答的a == &amp;a[0],当您使用(不正确的)格式转换%X 时,您不一定会看到相同的内容。在具有 64 位地址和 32 位整数的 little-endian 平台上,%X 很可能只打印a 地址的低 32 位。为了进一步混淆,它将以大写形式打印十六进制数字,尽管%p 可能以小写形式打印它们。 00000000000%X 也有点奇怪。如果您希望以精确的 16 位数字打印转换,请使用 %016X%16X 将插入前导空格。
  • ... 当然,使用整数格式转换代码打印指针是未定义行为。所以它可能会做任何事情。您应该请求并尊重编译器警告。我只是指出您可能在常见平台上看到的内容。

标签: arrays c pointers memory


【解决方案1】:

a 是一个数组,而不是一个指针。数组不是指针。

printf("%p", &amp;a);中,&amp;a是数组的地址。正确地,这应该通过将其转换为void * 来打印,就像printf("%p", (void *) &amp;a); 一样。

printf("0000000000%X", a);中,a自动转换为a的第一个元素的地址。由于这是一个地址(C 中的指针),它应该打印为%p,而不是%X,并且还应该转换为void *。使用%X 打印会导致各种问题。一旦正确打印,地址通常与&amp;a的地址相同,因为数组及其第一个元素在内存中的相同位置开始(因为后者是前者的第一部分)。

当数组在表达式中使用时,除了作为 sizeof 的操作数、作为一元 &amp; 的操作数或作为用于初始化一个数组(在声明中)。

printf("%p", &amp;a[0]);中,&amp;a[0]a的第一个元素的地址,实际上与前面代码中的a相同。

printf("000000000000000%X", a[0]);中,a[0]a的第一个元素的值。 %X 是一种技术上不正确的格式,因为它是 unsigned int,而 a[0]int,但该值通常会被打印出来,重新解释为 unsigned int。由于这是一个元素的值,而不是地址,它自然不同于之前的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-24
    • 2015-06-12
    • 2017-03-12
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 2016-11-21
    • 2018-06-21
    相关资源
    最近更新 更多