C ++反向索引器和数组名称

这个问题在这里已经有了答案:

  • 对于数组,为什么会出现[5] == 5 [a]? 17个答案

  • 这是因为arr[n] == *(arr + n)

    但是,因为加法是可交换的,所以*(arr + n) == *(n + arr) 。 因此, *(n + arr) == n[arr] == *(arr + n) == arr[n]

    可能值得一提的是*(arr + n)仍然有点误导。 在汇编中,它实际上意味着*(arr + (n * s)) ,其中ssizeof arr[0] ,但这是在封面之下,所以您不必担心它。


    我不认为这个特殊的[ab-]使用指针算术规则有任何特定的名字。 它只是在C和C ++中定义指针运算的方式而已。 两种语言标准都没有做出任何特殊的尝试来防止下标和指针的逆转。 例如,相关的C ++规则在5.2.1 [expr.sub]段落1中:

    后缀表达式后跟方括号中的表达式是后缀表达式。 其中一个表达式的类型应该是“T的数组”或“指向T的指针”,而另一个表达式应该是非范型的枚举或整型。 结果是类型“T”。类型“T”应该是完全定义的对象类型。 表达式E1 [E2]与*((E1)+(E2))是相同的(根据定义)[注意:有关*和+的详细信息,请参阅5.3和5.7;有关数组的详细信息,请参阅8.3.4。 除了在数组操作数的情况下,如果该操作数是左值,则结果是左值,否则是左值。

    它可能会寻找“C ++ 5.2.1”或“C ++ [expr.sub]”,但是使用逆转并没有超出混淆C或C ++看起来不够长的人。

    链接地址: http://www.djcxy.com/p/86739.html

    上一篇: C++ reversing indexer and name of array

    下一篇: Questions regarding pointers