Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;_C++_Arrays_Pointers - Fatal编程技术网

C++ 在C++;

C++ 在C++;,c++,arrays,pointers,C++,Arrays,Pointers,鉴于此: int i[] = { 1, 2, 3 }; int *p = i; 我知道这一点: p[0]; 与此相同: *(p + 0); 但是。。。谁能解释一下为什么,理论上的区别是什么 非常感谢。…据我所知,理论上没有什么不同。 p[0]操作的作用与*(p+0)完全相同。指针是从初始元素开始的内存偏移量。到计算机,没有任何区别。对于T*。对于用户定义的(智能指针)类型,一个将使用运算符+和运算符*,而另一个使用运算符[] 对于阅读代码的程序员来说,订阅意味着您正在访问相似项数组的第n个

鉴于此:

int i[] = { 1, 2, 3 };
int *p = i;
我知道这一点:

p[0];
与此相同:

*(p + 0);
但是。。。谁能解释一下为什么,理论上的区别是什么


非常感谢。

…据我所知,理论上没有什么不同。
p[0]操作的作用与*(p+0)完全相同。指针是从初始元素开始的内存偏移量。

到计算机,没有任何区别。对于
T*
。对于用户定义的(智能指针)类型,一个将使用
运算符+
运算符*
,而另一个使用
运算符[]

对于阅读代码的程序员来说,订阅意味着您正在访问相似项数组的第n个元素(所有中间项都具有相同的类型)。而指针算法则建议使用具有固定偏移量的数据结构

但是,当你在做指针时,线条会变得模糊
&a[n]
a+n
也是等效的,但我看到后者用于数组的次数远远多于
*(a+n)
用于数组的次数


但最终,这就像变量命名,或者任何其他情况下,有多种方法可以编写相同的内容(例如,
while
vs
for
循环)。按照惯例,您可以在实际行为的基础上为源代码赋予额外的含义。但是它不会被强制执行,存在使用不同约定的不同编码样式。

根本没有语义上的区别:
p[0]
是一种语法糖,称为
数组对象元素的下标指定
,或者只是一个下标操作符。 从C++标准草案2012-01-16:
除已为类(13.5.5)声明的情况外,下标运算符[]的解释方式应确保E1[E2]在定义上与*((E1)+(E2))相同。由于适用于+的转换规则,如果E1是数组,E2是整数,那么E1[E2]表示E1的第E2个成员。
在对Ben Voigt回答的评论中指出了一个有趣的部分:“a[n]与n[a]是同一件事”,标准中也声称:

Therefore, despite its asymmetric appearance, subscripting
is a commutative operation.
这就是为什么我们可以这样做(仅适用于内置类型:
注意:除非已经为类声明了它)。
对于多维数组:

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
。所有这些都被添加到语言中,以使代码更具可读性和优雅。

“理论上有什么区别?”没有?!?数组是连续的,这意味着它们在内存中按顺序排列。因此,您可以从第一个索引前进4个字节,以到达第二个索引以及后续的每个元素。只要你知道对象的类型,你就可以用这种方式索引它。@Cyber:你甚至不需要知道对象的类型。。。指针的算术运算是指向对象大小的倍数。@地狱火:我们不向C++代码中添加<代码> C <代码>标签,这在C.@ Ben Voigt中也可能是有效的。坦白说,如果标题不包括“C++”,你认为它是用哪种语言编写的?为了使它更有趣,[n]是与n[a]……DRAOSHT相同的事情:只对内置类型,是的。对于这个问题,你应该引用C++标准。在这条规则的边缘有一些细微的差别。