【问题标题】:How can the output be explained? [duplicate]如何解释输出? [复制]
【发布时间】:2013-05-22 10:36:46
【问题描述】:

我在 c 中处理指针,当我运行以下代码时,我得到“l”作为输出!为什么?

char *s = "Hello, World!";
 printf("%c", 2[s]);

2[s] 是什么意思?

【问题讨论】:

标签: c pointers


【解决方案1】:

2[s]s[2] 相同,因为编译器将两者都转换为 *(2 + s)

这里有一个很好的链接:why are both index[array] and array[index] valid in C?

【讨论】:

  • 另请注意,它不适用于较大类型的数组。因为s[2] 实际上是*(s+2*sizeof(char))。如果s 是一个整数数组,那么2[s] 仍然是*(2+s),但s[2]*(s*sizeof(int)),等于8[s](假设sizeof(int)==4)。
  • @IdanArye 错了。表达式s+2 始终与2+s 相同。指针运算始终适用于所指向类型的倍数。
  • @IdanArye 这很有趣,但我认为它不正确。你在哪里读到的?
  • 我的立场是正确的。我忘记了 int 被转换为指针类型,反之亦然
【解决方案2】:

这会打印出 s[2],即 l。这是因为 s[i] 在语法上等于 *(s + i)。因此 s[2]2[s] 都被转换*(s + 2)。

【讨论】:

    【解决方案3】:

    s[2] 和 2[s] 都是一样的。这就是 C 编译器的构建方式。 内部 s[2] 被视为 *(s+2)。类似于 2[s]。

    【讨论】:

      【解决方案4】:

      2[s] 与 s[2] 相同,可以写成 *(s+2)。

      【讨论】:

        【解决方案5】:

        这是s[2] 的另一种写法,它们的意思是一样的。在这种情况下,它将打印字符串的第三个字符,即'l'

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-08-03
          • 1970-01-01
          • 1970-01-01
          • 2015-11-11
          • 2016-08-18
          • 2011-09-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多