C++ 数组运算符和 *(array + index)(如果有)有什么区别?
What is the difference between the C++ array operator and *(array + index) if any?
我经常使用像下面这样的代码来索引数组中的项目,只是为了提醒自己数组值是指向数组第一个元素的指针。
int array[] = {0,1,2,3,4,5};
*(array + 2) = 42;
虽然它看起来有点难看,但有时我实际上更喜欢它而不是传统的 []
运算符。
int array[] = {0,1,2,3,4,5};
array[2] = 42;
除了让将来可能会阅读我的代码的其他人有点生气之外,使用指针算法在 []
运算符上索引数组有什么后果吗?
对于数组来说,没有区别。但是,它不能很好地扩展到其他容器,因此重构以这种等效性编写的代码以使用,例如,std::vector
将需要更多的努力。
C++ 规范的第 5.2.1 节 [expr.sub] 说:
... The expression E1[E2]
is identical (by definition) to *((E1)+(E2))
所以根据定义,它们完全相同。
有关规范的旧版本,请参阅 http://www.open-std.org/jtc1/sc22/open/n2356/expr.html。同样的措辞出现在所有的人身上。
[更新]
请注意,"the array value is a pointer to the first element of the array" 并不完全正确,sizeof(array)
(除其他外)将证明这一点。在许多情况下,数组 衰减 指向指针,但这不是一回事。所以我想说你在这里的风格选择简直令人困惑,对其他人甚至对你自己......另外,正如其他评论者指出的那样,你违反了非常普遍和有用的 "container access" 抽象。也就是说,您排除了用 std::vector
或 std::deque
或任何其他容器替换数组的可能性。只是风格不佳,IMO。
内置 []
运算符是 根据 +
和 *
定义的 。
即a[b]
,其中[]
是内置运算符,正好等同于*(a+b)
。这也允许您编写 2[array]
或 3["hello"]
或 0[this]
.
等宝石
显然,对于重载运算符,没有这样的等价关系。
我经常使用像下面这样的代码来索引数组中的项目,只是为了提醒自己数组值是指向数组第一个元素的指针。
int array[] = {0,1,2,3,4,5};
*(array + 2) = 42;
虽然它看起来有点难看,但有时我实际上更喜欢它而不是传统的 []
运算符。
int array[] = {0,1,2,3,4,5};
array[2] = 42;
除了让将来可能会阅读我的代码的其他人有点生气之外,使用指针算法在 []
运算符上索引数组有什么后果吗?
对于数组来说,没有区别。但是,它不能很好地扩展到其他容器,因此重构以这种等效性编写的代码以使用,例如,std::vector
将需要更多的努力。
C++ 规范的第 5.2.1 节 [expr.sub] 说:
... The expression
E1[E2]
is identical (by definition) to*((E1)+(E2))
所以根据定义,它们完全相同。
有关规范的旧版本,请参阅 http://www.open-std.org/jtc1/sc22/open/n2356/expr.html。同样的措辞出现在所有的人身上。
[更新]
请注意,"the array value is a pointer to the first element of the array" 并不完全正确,sizeof(array)
(除其他外)将证明这一点。在许多情况下,数组 衰减 指向指针,但这不是一回事。所以我想说你在这里的风格选择简直令人困惑,对其他人甚至对你自己......另外,正如其他评论者指出的那样,你违反了非常普遍和有用的 "container access" 抽象。也就是说,您排除了用 std::vector
或 std::deque
或任何其他容器替换数组的可能性。只是风格不佳,IMO。
内置 []
运算符是 根据 +
和 *
定义的 。
即a[b]
,其中[]
是内置运算符,正好等同于*(a+b)
。这也允许您编写 2[array]
或 3["hello"]
或 0[this]
.
显然,对于重载运算符,没有这样的等价关系。