一维数组引用多维数组

5
为什么这段代码可以编译通过?
int[] array = new int[][]{{1}}[0];

左边是一维数组。右边我认为是三维的,但实际上不是吗?

3个回答

7

右侧是一个一维数组,它是二维数组的第一个(0th)元素。

new int[][]{{1}}

为了更清晰地展示,让我们添加括号。
int[] array = (new int[][]{{1}}) [0];// [0] is returning first row of 2D array
                          // which is 1D array so it can be assigned to `array` 

1
int[][]{{1}} - 我看到两个方括号,所以我想这是一个二维数组。为什么会这样呢?你能解释一下吗? - Pawel
1
现在我明白了。对于那些仍然看不到的人来说:int array = new int[]{1, 2, 4} [0];。首先,数组被创建为三个元素,并且我选择从中选择第一个元素。它只是一个整数。 - Pawel
@Pawel - 很高兴你解决了问题。当你发出第二条评论时,我正准备写一篇解释文章。这是一件好事,因为我做得不好。 :) - Ted Hopp
@Pshemo - 这个修改非常有意义,尽管我不确定 OP 的盲点是什么。要注意的关键是 new int[][]{{1}}(带或不带括号)是一个数组创建表达式,而尾随的 [0] 只是选择刚创建的数组中索引为 0 的元素。 - Ted Hopp

3
右侧表达式有两个作用。
//   instantiate new 2D array
//            ┌──────┸───────┑  ┌ access zeroth element of new 2D array
//            │              │  │
int[] array = new int[][]{{1}} [0];

这基本上相当于以下内容:
int[][] array2D = new int[1][1];
array2D[0][0] = 1;

int[] array = array2D[0];

0
双维数组从内存管理的角度来看与单维数组相同(也就是说数据是存储在一个维度中)。因此,双维数组的第一个元素与单维数组的第一个元素相同。

1
我知道多维数组是内存中的数组。但是 int[][] array = new int[5][10] 可以通过,而 int[] = new int[3][2] 则不行。大小必须匹配,但在我的例子中,我认为它们并不匹配。 - Pawel
我认为大小不必匹配,因为二维数组的每个元素只是一种整数类型。所以,我相信int[] array = new int[3][2]也可以工作。 - thestar
但是它不行。在编译器中尝试 :p。消息:类型不兼容。 - Pawel
你不必相信,只需检查即可。顺便说一下,int[] arrayX = new int[3][2]; 不会编译,因为你试图将二维整数数组传递给一维数组。 - Pshemo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接