以下C程序的输出是什么

时间:2017-02-12 02:59:51

标签: c pointers printf

#include<stdio.h>

int main()

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

当我在代码上运行时,我得到输出400.但为什么400?

3 个答案:

答案 0 :(得分:2)

首先为p分配格式化字符串。然后它减少了两次。最后,使用附加参数400将其值减去2传递给printf。

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

答案 1 :(得分:1)

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

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

由于p是一个char指针p++,意味着将指针向前移动1个字符。执行两次以将p向前移动2个字符,使其指向回车符的开头。 p-2表示指针数学在char*点前面给出p 2个字符。

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

答案 2 :(得分:0)

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

例如,假设当你向它添加两个时它指向地址6(你不应该知道指针指向的位置)你将地址改为8。

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