首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++和Java数组声明/定义:差异

C++和Java数组声明/定义:差异
EN

Stack Overflow用户
提问于 2015-09-24 17:03:21
回答 6查看 9.3K关注 0票数 10

我的问题真的很简单(这并不意味着答案也会一样简单)。D)

为什么C++中的数组包含大小作为类型的一部分,而Java的不包括?

我知道Java数组引用变量只是堆上数组的指针,但是C++数组引用变量也是数组的指针,但我仍然需要提供一个大小。让我们首先分析C++:

代码语言:javascript
复制
// 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就是这样工作的:

代码语言:javascript
复制
// 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++ (不是指针数组)中创建。

有人能给我解释一下吗?也许窗帘后面发生的事应该让人明白。谢谢。

EN

回答 6

Stack Overflow用户

发布于 2015-09-24 18:30:04

我想您真正的问题是,为什么堆栈数组在编译时必须有固定的大小。

首先,这使得计算以下局部变量的地址更容易。

堆栈数组的动态大小不是不可能的,它只是更复杂,正如您所想象的那样。

C99确实支持堆栈上的可变长度数组。一些C++编译器也支持这个特性。另见允许在运行时不进行动态分配的数组大小?

票数 1
EN

Stack Overflow用户

发布于 2015-09-24 17:15:18

更正:

C有时有维数

Java

代码语言:javascript
复制
 Sometype some[];

声明本身是对对象的(声明)引用,可以更改(到新实例或数组)。这可能是一个原因,因此在java维度中不能给出“左侧”。近处

代码语言:javascript
复制
Sometype * some 

在C中(请原谅我,Java中的数组更为智能和安全)如果我们考虑将数组传递给C函数,形式上的情况类似于Java中的情况。我们不仅没有维度,而且不能有维度。

代码语言:javascript
复制
void func(Sometype arg[])
{
 // in C totally unknown (without library / framework / convention  etc)
 // in Java formally not declared, can be get at runtime
}
票数 0
EN

Stack Overflow用户

发布于 2015-09-24 17:20:55

我认为这与编译器处理数组的代码有关。对于动态数组,您有一个数组,单元格通过重定向进行寻址。

但是多维数组存储在连续内存中,编译器使用数学公式对它们进行索引,从而根据数组的每个维度计算单元格位置。

因此,需要向编译器(除最后一个外)已知(声明)维度。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32767077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档