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
。