[英]Character pointer and array
该代码段是:
char c[]="gate2011";
char *p=c;
printf("%s",p+p[3]-p[1]);
输出是:2011
谁能解释它的来历?
- - -提前致谢 - - -
依次浏览每行:
char c[] = "gate2011";
假设数组c位于内存地址200。
char *p = c;
p现在是指向c的指针。 因此,它指向存储器地址200。p的实际内容是“ 200”,表示存储器地址。
printf("%s", p + p[3] - p[1]);
当我们将其视为指针时,p的值为200。 但是,我们也可以将其视为数组。 p [3]获取字符串中第四个项目的值,即“ e”。 C将字符存储为其ASCII值。 ASCII值“ e”为101。
接下来,我们得到p [1]的值。 p [1] ==“ a”,其ASCII值为97。将它们替换为函数:
printf("%s", 200 + 101 - 97);
评估结果为:
printf("%s", 204);
在内存地址204,我们有字符串“ 2011”。 因此,程序将打印“ 2011”。
我不确定为什么要这样做,但是无论如何,这就是正在发生的事情。
p + p[3] - p[1]
在这里,您获取一个指针的值,并在位置3处添加char的值,然后在位置1处减去char的值。在进行加法和减法之前,将char值隐式转换为数值。
如果p为位置1000,则将得出总和1000 + 101(ASCII表示e)-97(ASCII表示a)。 因此,结果是指向存储器中位置1004的指针。 然后, printf中的%s替换以该位置开始并以特殊字符'\\ 0'结尾的字符串。 因此,该字符串实际上被裁剪为“ 2011”(因为101-97 = 4,所以缺少前4个字母)。
如果这仍然没有道理,我建议您对C中的数组如何工作有个很好的了解。
你期望什么? 为什么不?
p [3] -p [1] ='e'-'a'= 4
p + 4 =“ 2011”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.