当前位置: 首页 > news >正文

数组的三种主要声明方式

  1. 仅声明类型和名称,不指定大小和初始化

    • 语法:​​ 元素类型[] 数组名; (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的新数组
  2. 声明并指定大小(创建数组对象)​

    • 语法:​​ 元素类型[] 数组名 = new 元素类型[数组长度];
    • 特点:​
      • 一步完成声明和创建
      • 使用 new 关键字在堆内存中分配指定长度的连续空间。
      • 数组元素会被初始化为默认值​(0, null, false 等)。
      • 声明后数组大小不可改变​(静态数组)。
      • 可以直接通过索引 数组名[索引] 访问和操作元素。
    • 示例 (Java/C#/C++):​
      int[] scores = new int[3]; // 声明并创建长度为3的int数组
      scores[0] = 90; // 正确,现在可以访问元素
      int scores[3]; // C++:声明并隐式创建了在栈上的int数组(通常,但可能依据上下文不同)
  3. 声明并使用字面量初始化

    • 语法:​​ 元素类型[] 数组名 = {元素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))。

选择哪种声明方式取决于你的具体需求:何时知道数组大小、是否有初始值可用、是否需要延迟初始化等

http://www.dtcms.com/a/336444.html

相关文章:

  • 大模型对齐算法(二): TDPO(Token-level Direct Preference Optimization)
  • Android中使用Compose实现各种样式Dialog
  • tcp会无限次重传吗
  • Eclipse Tomcat Configuration
  • Portkey-AI gateway 的一次“假压缩头”翻车的完整排障记:由 httpx 解压异常引发的根因分析
  • 学习日志36 python
  • 力扣经典算法篇-52-零钱兑换(动态规划)
  • Java语法进阶之常用类
  • 【C2000】德州仪器C2000产品整体介绍
  • http工作流程
  • LangChain 多任务应用开发
  • matlab tlc的文件、字符串操作
  • Python @staticmethod 装饰器与 staticmethod() 函数
  • Tomcat Session Replication Cluster:实现高可用性和可扩展性的关键
  • 机试备考笔记 14/31
  • Ugit使用记录
  • Next.js跟React关系(Next.js是基于React库的全栈框架)(文件系统路由、服务端渲染SSR、静态生成SSG、增量静态再生ISR、API路由)
  • 提升 LLM 推理效率的秘密武器:LM Cache 架构与实践
  • Pandas初学者入门
  • C语言中回调函数的作用
  • 2025.8.11-2025.8.17第33周:完成第一次头马备稿演讲
  • 北京JAVA基础面试30天打卡12
  • 【URP】[法线贴图]为什么主要是蓝色的?
  • ZipList优缺点总结
  • leetcode_438 找到字符串中的所有异位词
  • 代码随想录刷题Day34
  • 上位机知识篇---静态库
  • 计算机网络 TCP 延迟确认机制
  • SpringCloud 01 分布式系统
  • 自由学习记录(85)