【问题标题】:why %p,%x gives address in alphabet values and why %p gives any value in so many zeros(x86); also why the %d and %u specifiers do not work like them为什么 %p,%x 用字母值给出地址,为什么 %p 用这么多的零(x86)给出任何值;还有为什么 %d 和 %u 说明符不像它们那样工作
【发布时间】:2020-07-08 04:06:10
【问题描述】:

谁能简要解释一下这些说明符是如何工作的。我搜索了很多关于它们的信息,但仍然对它们感到困惑。(我有一台 32 位电脑)。

#include<stdio.h>

int main()
{
    int v,*p;
    v=3;
    *p=v;
    printf("the value of  v = %d \n",v);
    printf("the address of  v = %d \n\n",&v);

    printf("the value of  v = %p \n",v);
    printf("the address of  v = %p \n\n",&v);

    printf("the value of  v = %u \n",v);
    printf("the address of  v = %u \n\n",&v);

    printf("the value of  v = %x \n",v);
    printf("the address of  v = %x \n\n",&v);

    printf("value stored through p  = %d \n",*p);
    printf("address of p = %d \n\n",p);

    printf("value stored through p  = %p \n",*p);
    printf("address of p = %p \n\n",p);

    printf("value stored through p  = %u \n",*p);
    printf("address of p = %u \n\n",p);

    printf("value stored through p  = %x \n",*p);
    printf("address of p = %x \n\n",p);


    return 0;
}

【问题讨论】:

  • %p 的输出是实现定义的,对应参数的类型必须是void*。此代码中的大多数行都会导致未定义的行为。
  • 大部分是未定义的行为。语言定义指定你必须为相应参数的类型使用正确的说明符,否则它是未定义的。
  • 能否请您将我添加的输出截图替换为从实际文本中剪切和粘贴的内容,这样会更容易阅读和索引问题。
  • 好吧,伙计们,我明白你想说的话,但我心中还有另一个困惑,即在这段代码中如何...int a = 10; int *b = &a; printf("%p\n",b); printf("%X\n",b); ...在 %p 值之前有两个零,即 0018FF20 但在 %x(即十六进制)中,该值只是 18FF20 .....我的意思是这个概念背后的逻辑是什么......

标签: c pointers format-specifiers specifier


【解决方案1】:

%d 和%u 用于以普通十进制格式打印数字。除非您添加前导零的选项,例如%05d 打印至少 5 位带前导零的数字,它以最紧凑的格式打印,因为这是人类通常更喜欢看到他们的数字的方式。

%p 用于打印内存地址。这以与实现相关的格式打印。由于它通常是供程序员使用的,因此十六进制是最常见的格式。如果它们总是相同的长度,通常也最容易处理它们,因此显示了计算机架构的最大尺寸。

【讨论】:

  • 好的,我明白了..但还有另一个困惑;如何在这个 int a = 10; int *b = &a; printf("%p\n",b); printf("%X\n",b); ..code 在 %p 值之前有两个零,即 0018FF20 但在 %x(即十六进制)中,该值只是 18FF20 ......我的意思是这个概念背后的逻辑是什么......
  • @Pranshutaneja:整数类型的转换说明符不显示前导零,除非您添加字段宽度和前导零标志 - %08x 将值格式化为最小字段宽度为 8 的十六进制和用前导零填充。 %p 说明符的行为取决于实现 - 有些实现用前导零填充,有些则没有。并且重复之前提出的一点,指针不是整数,并且在指针值上使用整数转换说明符的行为是未定义的——你不能相信输出是正确的。
猜你喜欢
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多