代码段是:
char c[]="gate2011";
char *p=c;
printf("%s",p+p[3]-p[1]);
输出是: 2011
有谁可以解释它是怎么来的?
-----提前致谢-----
答案 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”