数组的三种主要声明方式
仅声明类型和名称,不指定大小和初始化
- 语法:
元素类型[] 数组名;
(Java, C#) 或元素类型 数组名[];
(C++, 兼容C风格的Java/C#也支持但不推荐) - 特点:
- 声明了一个数组变量,但没有分配内存空间。
- 数组大小未定,无法直接使用元素。
- 必须通过
new
(在 Java/C# 等托管语言中)或在后续代码中指定具体的数组大小或字面量进行初始化后才能使用。 - 目的: 通常用于后续指向一个被创建好的具体数组对象。
- 示例 (Java/C#):
int[] myArray; // 仅声明,此时myArray为null (Java/C#) // myArray[0] = 1; // 错误!还未初始化,不能访问元素 myArray = new int[5]; // 初始化:分配一个能容纳5个int的新数组
- 语法:
声明并指定大小(创建数组对象)
- 语法:
元素类型[] 数组名 = new 元素类型[数组长度];
- 特点:
- 一步完成声明和创建。
- 使用
new
关键字在堆内存中分配指定长度的连续空间。 - 数组元素会被初始化为默认值(0, null, false 等)。
- 声明后数组大小不可改变(静态数组)。
- 可以直接通过索引
数组名[索引]
访问和操作元素。
- 示例 (Java/C#/C++):
int[] scores = new int[3]; // 声明并创建长度为3的int数组 scores[0] = 90; // 正确,现在可以访问元素
int scores[3]; // C++:声明并隐式创建了在栈上的int数组(通常,但可能依据上下文不同)
- 语法:
声明并使用字面量初始化
- 语法:
元素类型[] 数组名 = {元素1, 元素2, ..., 元素n};
或元素类型[] 数组名 = new 元素类型[] {元素1, 元素2, ..., 元素n};
(更显式的写法) - 特点:
- 一步完成声明、创建、填充初始值。
- 数组长度由字面量中元素个数自动确定。
- 语法简洁,初始化值明确可见。
- 是上述方式2的一个语法糖(便捷写法)。
- 示例 (Java/C#/C++):
String[] names = {"Alice", "Bob", "Charlie"}; // 声明并直接用3个字符串初始化 int[] primeNumbers = new int[]{2, 3, 5, 7, 11}; // 显式写法(在特定上下文如方法参数传递时常用)
int primes[] = {2, 3, 5, 7, 11}; // C++
- 语法:
关键区别总结表
方式 | 是否分配内存 | 是否指定大小 | 是否初始化元素值 | 典型用例 |
---|---|---|---|---|
仅声明 (int[] arr; ) | ❌ | ❌ | ❌ | 在初始化前暂时存储数组引用 |
声明并创建大小 (new int[5]; ) | ✅ | ✅ | ✅ (用类型默认值) | 明确知道数组大小但元素值后续填充 |
声明并用字面量初始化 ({1,2,3} ) | ✅ | ✅ (自动计算) | ✅ (用指定值覆盖默认值) | 创建并立刻赋值一组已知初始值的元素 |
注意点:
- C/C++ 语法差异: C/C++ 中数组可以直接在栈上声明
int arr[5];
(方式2),也可以在堆上用new int[5]
(方式1+动态分配)。同时支持字面量初始化(方式3)。- Go语言 (
type [size]T
):Go 中的数组类型包含长度信息 ([5]int
和[3]int
是不同类型),声明var arr [5]int
(未初始化)或arr := [5]int{1,2}
(部分初始化)等方式。- JavaScript/Python 等弱类型语言: 通常只有类似“方式3”的字面量语法(
let arr = [1, 2, 3];
),或者使用构造函数 (new Array(5)
)。
选择哪种声明方式取决于你的具体需求:何时知道数组大小、是否有初始值可用、是否需要延迟初始化等