这种在 C 字符串中访问字符的方式如何工作?

How does this way of accessing character in C-String work?

This question 在最近的一次考试中被问及考生必须找到以下代码的输出:

#include<stdio.h>
#include<string.h>
int main()
{
    char * c = "GATECSIT2017";
    char *p = c;
    printf("%d", (int)strlen(c+2[p]-6[p]-1));
    return 0;
}

我开始用 C++ 编写代码,所以我不是 C 字符串方面的专家。在弄乱了代码之后,我明白了它是如何工作的,但是我不清楚一件事,那就是这种从 char* 字符串访问 char 的方式。

我的问题是,2[p] 如何获取索引 2 处的字符? 它会解析为 *(p+2) 还是有其他事情发生?另外,是否有任何文档或任何文章可以解释此行为?

对于任何数组或指针 a 和索引 i,表达式 a[i] 等于 *(a + i).

因为 +commutative property 表达式 *(a + i) 等于 *(i + a),根据第一个等式等于 i[a],即索引和 pointer/array.

的切换位置

所以在你的情况下表达式 2[p] 等于 *(2 + p) 等于 *(p + 2) 等于 p[2].

使用例如2[p] 仅用于(不良)混淆,因此请不要在任何地方使用它。