【发布时间】:2015-09-26 00:28:55
【问题描述】:
我的问题真的很简单(这并不意味着答案会那么简单.. :D)
为什么 C++ 中的数组包含大小作为类型的一部分而 Java 不包含?
我知道 Java 数组引用变量只是指向堆上数组的指针,但 C++ 指向数组的指针也是如此,但即便如此我也需要提供一个大小。 我们先来分析一下C++:
// in C++ :
// an array on the stack:
int array[*constexpr*];
// a bidimensional array on the stack:
int m_array[*constexpr1*][*constexpr2*];
// a multidimensional array on the stack:
int mm_array[*constexpr1*][*constexpr2*][*constexpr3*];
// a dynamic "array" on the heap:
int *array = new int[n];
// a dynamic bidimensional "array" on the heap:
int (*m_array)[*constexpr*] = new int[n][*constexpr*];
// a dynamic multidimensional "array" on the heap:
int (*mm_array)[*constexpr*][*constexpr*] = new int [n][*constexpr1*][*constexpr2*];
n 不必是编译时常量表达式,所有元素都默认初始化。动态分配的“数组”不是数组类型,但新表达式会产生一个指向第一个元素的指针。
所以当我创建一个动态数组时,除了第一个维度之外的所有维度都必须是常量表达式(否则我无法声明指针来保存它们的元素)。对吗??
现在到 Java。我只能在堆上分配数组,因为 Java 是这样工作的:
// a dynamic array on the heap:
int[] array = new int[n];
// a dynamic bidimensional array on the heap:
int[][] m_array = new int[n][];
// a dynamic multidimensional array on the heap:
int[][][] mm_array = new int [n][][];
在Java中,定义数组引用变量时似乎并不关心数组大小(在Java中显式提供大小是错误的),所以我只需要在创建时提供第一个维度的大小数组。这允许我创建锯齿状数组,我不确定我是否可以在 C++ 中创建(不是指针数组)。
谁能解释一下这是怎么回事?也许窗帘后面发生的事情应该清楚。谢谢。
【问题讨论】:
-
In Java, it doesn't seem to care about array size when defining an array reference variable (it's an error in Java to explicitly provide a size这不是真的。你能给出一个关于这个的编码示例吗? -
首先要记住的是 C/C++ 没有多维数组。
-
@user3437460 int [10] 数组;数组引用变量。在 Java 中是非法的
-
@Luca 那是因为
int[10] array在 Java 中是错误的语法。您可以在 Javaint [] array = new int[10]中提供数组大小。我在回答你的问题吗? -
@user3437460 我认为你应该更仔细地阅读这个问题。并区分引用变量和对象实例。