在C ++中使用指针的不同方式

时间:2014-05-26 14:28:27

标签: c++ arrays pointers

鉴于此:

int i[] = { 1, 2, 3 };
int *p = i;

我知道:

p[0];

与此相同:

*(p + 0);

但......有人可以解释我为什么以及理论差异是什么?

非常感谢。

4 个答案:

答案 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。指针是初始元素的记忆偏移量。