问题 C多维数组中奇怪的数组语法


我知道这是真的:

x[4] == 4[x]

多维数组的等价物是什么?以下是真的吗?

x[4][3] == 3[x[4]] == 3[4[x]]

11761
2017-11-13 02:49


起源

你试过吗?发生了什么? - Carl Norum
@Jim:x [4] == *(x + 4)== *(4 + x)== 4 [x] - Stuart Golodetz
@JimClay因为 x[4] == *(x + 4) 所以 4[x] == *(4 + x)。该 [] 运算符只是语法糖。 - Andrew Marshall
谢谢你的解释。我既迷恋又立刻被击退。 - Jim Clay
@JimClay:..这就是C的真正含义。令人反感和迷人。 - kbyrd


答案:


x[y] 被定义为 *(x + (y))

x[y][z] 会成为 *(*(x + (y)) + z)

x[y[z]] 会成为 *(x + (*(y + (z))))


x[4][3] 会成为 *(*(x + (4)) + 3)     会成为 *(*(x + 4) + 3)

3[x[4]] 会成为 *(3 + (*(x + (4)))) 会成为 *(*(x + 4) + 3)

3[4[x]] 会成为 *(3 + (*(4 + (x)))) 会成为 *(*(x + 4) + 3)

这意味着它们都是等价的。


13
2017-11-13 02:54



在多维数组的情况下 int x[5][7] 你有 x[y][z] 定义为 *(x + 7*y + z)。和 x[y] 会成为 x + 7*y 即指向指示切片的指针。但我相信等价仍然有效,即使扩展的表达式有点长。如果编译器完全接受代码,那就是。 - MvG


是。在每种情况下 x 是一个衰减到指针然后在其上执行指针运算的数组。


1
2017-11-13 02:55