array 和array 之间有什么区别?

如果我的二维数组是int数组[4] [5] = {1,2,3,4,5,6,7,8,9,0,11,12,13,14,15,16,17, 18,19,20};

当我打印一个位置:printf(“%d \ n”,数组[2,0]);. 这是在不给&的情况下打印值的地址。 但如果我这样打印:printf(“%d \ n”,&array [2] [0]); 它是值的打印地址。 正如我已经给它&它打印地址。 但两个地址都不一样。 但如果我打印printf(“,:%d \ n”,数组[3,0]); 它正在打印相同的数组地址[2,0]。

访问数组元素的[2] [0]和[2,0]之间有什么区别。

阅读逗号运算符。 array[2][0]访问第三行第一列的元素。 array[2,0]首先执行操作(2,0) (返回0),因此相当于array[0] ,它返回数组的第一行(实际上是&array[0][0]因为它衰减到一个指针)。

使用array[1,2]只是逗号运算符被误用的一个例子 – > 1, 2评估两个操作数并产生2 – >你正在访问array[2]


旁注:对于给定std::array的数组,数组不是一个好名字。

2, 0调用所谓的逗号运算符, 运算符丢弃在最后一个逗号之前出现的所有表达式的值,并表示最右边的表达式的值。
因此, array[2, 0]等效于array[0] ,并且数组到指针衰减产生array[0]中位置0处元素的地址 – 这相当于&array[0][0]

array[2,0]没有做你认为应该做的事情。 它只有一个索引,即表达式2,0 。 也就是说,它相当于array[(2,0)] 。 该表达式涉及逗号运算符,该运算符计算每个操作数,其结果是最后一个操作数的结果。 所以在你的情况下,它相当于array[0] 。 这表示第一个“内部”数组,当您尝试打印它时,会进行数组到指针的转换,并为您提供指向该数组开头的指针。

array [1] [2]和array [1,2]之间有什么区别?

差异是一件非常重要的事情。

第一个例子是多维数组访问。

您正在访问第一个数组的第二个元素值。

第二种情况只是一维数组,其中索引是用逗号运算符调用的。 这就是,cpu必须取1,在装箱时丢弃所有操作,然后取2

所以第二种情况只是访问1维数组的第2个元素值。

为了更好的udnerstanding你应该读这个:

逗号运算符是做什么的?

编译器将arr[3,0]视为arr[0] 。 这就是逗号运算符的工作原理。

这就是为什么arr[3,0] and arr[2,0]都打印相同的地址,因为它们都会解析为基地址,即arr [0]。

为了更好的可读性,您可以将数组定义重写为

 array[4][5]= { 1,2,3,4,5, //a[0][0~4] 6,7,8,9,10, //a[1][0~4] 11,12,13,14,15, //a[2][0~4] 16,17,18,19,20}; //a[3][0~4] 
  • array[2,0]是使用单个索引的单级解除引用,具有逗号运算符 。
  • array[2][0]是一个使用两个索引的双级解除引用。

根据运营商的定义,

逗号运算符(由标记表示)是一个二元运算符,它计算第一个操作数并丢弃结果,然后计算第二个操作数并返回该值(和类型)。

现在,说printf("%d\n",array[2,0]);. 得到评估为printf("%d\n",array[0]);

类似地, printf("%d\n",array[3,0]); 也被评估为printf("%d\n",array[0]);

因此,他们最终产生相同的结果。

另一方面, printf("%d\n",&array[2][0]); ,指第3行中第1个元素的地址。 所以它是不同的。

如果您注意到数据类型,您可以轻松找到差异。

  • array[0]表示int[5]的数据类型
  • array[2][0]表示int数据类型

注意:要打印指针,您需要使用%p格式说明符,而不是%d