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

时间:2014-12-04 11:45:44

标签: c arrays linux

如果我的二维数组是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]之间有什么区别。

7 个答案:

答案 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你应该读这个:

What does the comma operator , do?

答案 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