鉴于此:
int i[] = { 1, 2, 3 };
int *p = i;
我知道:
p[0];
与此相同:
*(p + 0);
但......有人可以解释我为什么以及理论差异是什么?
非常感谢。
答案 0 :(得分:3)
对于电脑来说,没有任何区别。对于T*
。对于用户定义的(智能指针)类型,一个将使用operator+
和operator*
,而另一个使用operator[]
。
对于阅读代码的程序员来说,下标表明您正在访问类似项目数组的第n个元素(所有介入项目都具有相同的类型)。虽然指针算术表明您有一个具有固定偏移量的数据结构。
当您制作指针时,线条变得模糊。 &a[n]
和a+n
也是等价的,但我看到后者与数组一起使用的数量远远超过我看到*(a+n)
与数组一起使用的数据。
最后,它就像变量命名,或任何其他情况,其中有多种方法可以编写相同的内容(例如while
vs for
循环)。按照惯例,您可以在源代码之外为实际行为指定其他含义。但它不会被强制执行,并且存在使用不同约定的不同编码样式。
答案 1 :(得分:3)
根本没有语义差异:p[0]
是一个语法糖,很快就会被称为a subscripted designation of an element of an array object
或只是一个下标运算符。
来自C ++标准工作草案2012-01-16:
Except where it has been declared for a class (13.5.5), the subscript operator [] is interpreted in such a way that E1[E2] is identical to *((E1)+(E2)) by definition. Because of the conversion rules that apply to +, if E1 is an array and E2 an integer, then E1[E2] refers to the E2-th member of E1.
在对Ben Voigt的评论中指出的一个有趣的部分回答:" a [n]与n [a]"相同。也在标准中声称:
Therefore, despite its asymmetric appearance, subscripting
is a commutative operation.
这就是为什么我们可以这样做(仅适用于内置类型:Note: Except where it has been declared for a class
)。
至于多维数组:
A consistent rule is followed for multidimensional arrays. If E
is an n-dimensional array of rank i×j ×. . .×k, then E appearing
in an expression that is subject to the array-to-pointer conversion (4.2)
is converted to a pointer to an (n − 1)-dimensional array with rank
j × . . . × k. If the * operator, either explicitly or implicitly as
a result of subscripting, is applied to this pointer, the result
is the pointed-to (n − 1)-dimensional array, which itself is
immediately converted into a pointer.
有关更多信息,请参阅C ++ 11标准§ 8.3.4
。
这是与->
运算符相同的糖,用于访问结构或联合的成员,给出指向这样的指针:p->a
== (*p).a
。所有这些都被添加到语言中,使代码更具人性化和更优雅。
答案 2 :(得分:2)
......据我所知,没有理论上的差别。 p [0]操作与*(p + 0)完全相同
答案 3 :(得分:0)
对于同样的事情,这只是syntax sugar。指针是初始元素的记忆偏移量。