如果我的二维数组是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]);.这是打印值的地址而不给出&amp ;.但如果我这样打印:printf(“%d \ n”,& array [2] [0]);它是值的打印地址。正如我给出的&它打印地址。但两个地址都不一样。但如果我打印printf(“,:%d \ n”,数组[3,0]);它正在打印数组[2,0]的相同地址。
访问数组元素的[2] [0]和[2,0]之间有什么区别。
答案 0 :(得分:5)
阅读逗号运算符。
array[2][0]
正在访问第三行第一列的元素。
array[2,0]
首先执行操作(2,0)
(返回0),因此等同于array[0]
,它返回数组的第一行(实际为&array[0][0]
,因为它衰减为指针)。
答案 1 :(得分:4)
使用array[1,2]
只是comma operator被滥用的一个例子 - > 1, 2
评估操作数和产量2
- >您正在访问array[2]
。
旁注:array
不是给定std::array
的数组的好名称。
答案 2 :(得分:2)
2, 0
调用所谓的逗号运算符,丢弃在最后一个逗号之前出现的所有表达式的值,并在最右边表示表达式的值。
因此array[2, 0]
相当于array[0]
,并且数组到指针衰减产生array[0]
中位置0处元素的地址 - 相当于{{1} }}
答案 3 :(得分:1)
array[2,0]
没有做您认为应该做的事情。它只有一个索引,即表达式2,0
。也就是说,它相当于array[(2,0)]
。该表达式涉及逗号运算符,该运算符计算每个操作数,其结果是最后一个操作数的结果。所以在你的情况下,它等同于array[0]
。这表示你的第一个"内部"数组,当你尝试打印它时,会进行数组到指针的转换,并为你提供一个指向该数组开头的指针。
答案 4 :(得分:1)
编译器将arr[3,0]
视为arr[0]
。这就是逗号运算符的工作原理。
这就是为什么arr[3,0] and arr[2,0]
都打印相同的地址,因为两者都会解析为基地址,即arr [0]。
答案 5 :(得分:1)
array [1] [2]和array [1,2]有什么区别?
差异很大。
第一个例子是多维数组访问。
您正在访问第一个数组的第二个元素值。
第二种情况只是一维数组,其中索引是用逗号运算符调用的。
这就是,cpu必须取1,在加密,
之后丢弃所有操作,然后取2
。
所以第二种情况只是访问一维数组的第二个元素值。
为了更好的udnerstanding你应该读这个:
答案 6 :(得分: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]
是使用单个索引的单级解除引用,具有,
comma operator。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
。