繁体   English   中英

字符指针和数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM