如果有的话,C ++数组运算符和*(数组+索引)之间有什么区别?

时间:2015-03-11 00:05:56

标签: c++ arrays c++11 indexing

我经常使用以下代码来索引数组中的项目,只是为了提醒自己数组值是指向数组第一个元素的指针。

int array[] = {0,1,2,3,4,5};
*(array + 2) = 42;

虽然它看起来有点难看,但实际上我更喜欢传统的[]运营商。

int array[] = {0,1,2,3,4,5};
array[2] = 42;

除了让将来可能会阅读我的代码的其他人有点生气之外,使用指针算法在[]运算符上索引数组有什么后果吗?

3 个答案:

答案 0 :(得分:9)

C ++规范的第5.2.1节[expr.sub]说:

  

...表达式E1[E2]*((E1)+(E2))

完全相同(根据定义)

根据定义,它们完全相同。

有关旧版本的规范,请参阅http://www.open-std.org/jtc1/sc22/open/n2356/expr.html。所有这些措辞都出现了相同的措辞。

[更新]

请注意,“数组值是指向数组第一个元素的指针”并不完全正确,因为sizeof(array)(以及其他内容)将演示。数组在许多上下文中衰减指针,但这不是一回事。所以我会说你在这里的风格选择简直令人困惑,对其他人甚至对你自己......另外,正如其他评论者指出的那样,你违反了非常普遍和有用的“容器访问”抽象。也就是说,您要排除用std::vectorstd::deque或任何其他容器替换数组。只是风格很差,IMO。

答案 1 :(得分:4)

对于阵列,没有区别。但是,它并没有很好地扩展到其他容器,因此重构用这种等效性编写的代码来使用,例如std::vector将需要更多的努力。

答案 2 :(得分:4)

根据[]+,内置*运算符定义

也就是说,a[b],其中[]是内置运算符,与*(a+b)完全等效。这也允许您将此类宝石写为2[array]3["hello"]0[this]

显然,对于重载运算符,没有这样的等价。