字符指针和数组

时间:2011-02-14 12:53:26

标签: c string pointers printf

代码段是:

char c[]="gate2011";
char *p=c;
printf("%s",p+p[3]-p[1]);

输出是: 2011

有谁可以解释它是怎么来的?

-----提前致谢-----

3 个答案:

答案 0 :(得分:3)

依次浏览每一行:

 char c[] = "gate2011";

假设数组c位于存储器地址200处。

 char *p = c;

p现在是指向c的指针。因此它指向存储器地址200.p的实际内容是“200”,表示存储器地址。

  printf("%s", p + p[3] - p[1]);

当我们将它视为指针时,p的值为200。但是,我们也可以像对待数组一样对待它。 p [3]得到字符串中第4项的值,即“e”。 C将字符存储为ASCII值。 “e”的ASCII值为101。

接下来,我们得到p [1]的值。 p [1] ==“a”,其ASCII值为97.将这些代入函数:

  printf("%s", 200 + 101 - 97);

评估为:

  printf("%s", 204);

在内存地址204,我们有字符串“2011”。因此,该程序打印“2011”。

答案 1 :(得分:2)

我不确定你为什么要这样做,但无论如何,这就是正在发生的事情。

p + p[3] - p[1]

在这里,您获取一个指针的值,并在位置3处添加char的值,然后减去位置1处的char的值。在执行添加之前,将char值隐式转换为数值和减法。

如果p是位置1000,则将得到总和1000 + 101(对于e的ASCII) - 97(对于a的ASCII)。因此,结果是指向存储器中的位置1004的指针。然后, printf 中的%s将替换从此位置开始的字符串,并以特殊字符“\ 0”结尾。因此字符串被有效地剪辑为“2011”(前4个字母被遗漏,因为101 - 97 = 4)。

如果这仍然没有意义,我建议您仔细研究C中的数组是如何工作的。

答案 2 :(得分:0)

你有什么期望?为什么不呢?

p [3] -p [1] ='e' - 'a'= 4
p + 4 =“2011”