【问题标题】:What will be the output of the following C program以下 C 程序的输出将是什么
【发布时间】:2017-02-12 02:59:50
【问题描述】:
#include<stdio.h>

int main()

{
  char *p;
  p="%d\n";
  p++;
  p++;
  printf(p-2, 400);
  return 0;
}

当我运行上面的代码时,我得到了 400 的输出。但为什么是 400?

【问题讨论】:

  • 您还期望得到什么,为什么?
  • 其实我并没有更深入地了解 printf() 函数的语法。所以我不明白我的代码中发生了什么。

标签: c pointers printf


【解决方案1】:

p 首先分配了格式化字符串。然后将其减 1 两次。最后,它的值减 2 被传递给带有附加参数 400 的 printf。

p 的最新值中减去 2 会将其移回原始格式字符串。因此 printf 打印值 400。

【讨论】:

    【解决方案2】:

    printf() 的第一个参数是一个格式字符串。变量p 是一个指向字符数组的指针,这也是字符串的表示方式。

    当 p 被分配一个字符串 "%d\n" 时,它表示格式化一个整数以打印其值,然后打印回车符。

    由于p 是一个字符指针p++ 表示将指针向前移动1 个字符。这样做两次以将 p 向前移动 2 个字符,使其指向回车字符的开头。 p-2 说做指针数学以在 p 指向的位置前面给出 char* 2 个字符。

    这是%d 回车字符串的开头。这成为格式字符串,第二个参数 400 替换 %d 并打印自身,后跟回车。

    【讨论】:

      【解决方案3】:

      您声明了一个指向字符串的指针并将其赋值为"%d\n"。该指针在内存中保存一个地址。

      例如,假设它指向地址 6,当您向其添加两个时(您不应该这样做,您总是必须知道指针指向的位置)您将地址更改为 8。

      现在,当您执行printf 时,您将用地址p 的当前值替换它,指向(8) 减2,即6。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-13
        • 2019-07-06
        • 2018-01-23
        • 2015-11-01
        • 2022-10-05
        • 1970-01-01
        • 1970-01-01
        • 2022-11-16
        相关资源
        最近更新 更多