阅读cppreference我发现了这个例子:
int a[4] = {1, 2, 3, 4};
int* p = &a[2];
std::cout << p[1] << p[-1] << 1[p] << (-1)[p] << 'n'; // 4242
我对1[p]
和(-1)[p]
的含义感到困惑。在其他地方寻求帮助时,我被告知:1[ptr]
相当于*(1 * sizeof(T) + ptr)
"所以我理解为什么它输出4242
,但我发现很难推理。因为通常把指针放在方括号里是没有意义的,而且它本身就是一个错误:
[cling]$ 1[p]
(int) 4
[cling]$ [p]
input_line_15:2:3: error: 'p' cannot be captured because it does not have
automatic storage duration
[p]
^
这只是我应该记住的语法的一个特例,还是我误解了语句背后的一些逻辑?
假设p
为指针或数组,n
为整数。当编译器看到以下内容:
p[n]
逻辑上将表达式解释为:
*(p+n)
当它看到这个时:
n[p]
编译器将其视为:
*(n+p)
在代数上与*(p+n)
相同因此:p[n] == n[p]