【问题标题】:Character pointer and array字符指针和数组
【发布时间】:2011-02-14 12:53:26
【问题描述】:

代码sn-p是:

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

输出是: 2011

谁能解释它是怎么来的?

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

【问题讨论】:

  • abcde: e - a = 4 p+4 指向 '2011'
  • 你到底在哪里找到了这个 sn-p?请告诉我你通常不会写那样的代码。
  • 真的,我在这里有一个问题。如果 ascii 值的差异下降到负值会发生什么?

标签: c string pointers printf


【解决方案1】:

依次遍历每一行:

 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”。

【讨论】:

    【解决方案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 中的数组是如何工作的。

    【讨论】:

    • 你能不能把 87 改成 97。系统不允许 - 太短了:)
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-06-26
      • 1970-01-01
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多