数组的理解其实很简单,就是数据的连续堆积。最早FORTRAN和ALGOL 68就有数组的概念。Python的列表就是数组。
最简单的数据结构
- 现实世界中最简单方便有效的数据结构。小数据量的绝佳选择, 兼顾效率和易用。
- 操作系统、驱动和库常有使用。
数组存放栈或堆
- C/C++允许定义数组于堆栈区,这种方式更加灵活,尤其对于内存性能要求较高的场所。
- C#/Java/Kotlin 等语言的数组不可能位于堆栈区,只能是堆对象,某些时候不太灵活。
- 大部分编程语言将数组作为引用类型,包括C/C++/Java/C#等,不过Go把数组当做值类型。
数组形态
- 大部分使用中括号表示数组,中括号加下标表示数组长度或Index.
C/ObjC/C++/Java/C#/Python 等都遵循此规则。 - 除了普通的一维数组、二维和多维数组,C#还提供交错数组,每个维度可以是不同的长度。
数组定义的方括号位置
- C/ObjC/C++ 方括号在标识符后面。
- C# 方括号必须紧跟类型。
- Java方括号可紧跟类型之后或者标识符后面。
- Kotlin 比较特殊,初始化数组用内置函数 arrayOf, 并不需要显式方括号。
可变数组VLA
- 尽管C99支持VLA, C11中废弃它,因为它实在不太好用。动态数组比它优秀多了。
- C# stackalloc支持VLA.
数组索引
字符串本质是一个数组,一般二者的索引起始点是相同的。
- 从0开始: 和现实世界对应,"当前"的元素距离是0. 大部分编程语言采用
- 例如C/ObjC/C++/Java/C#/Python/JavaScript/Go/Rust/Swift/仓颉/Kotlin 等。
- 从1开始
- 例如Pascal/Fortran/VB.
- C语言数组名和索引位置互换是同一个意思,a[1]等同于1[a].
反向索引
- C# 8.0支持形如^1访问数组最后一个元素,^2代表倒数第二个,以此类推。
- Python 支持-1代表列表最后一个元素,-2代表倒数第二个,以此类推。
索引区间
- C# 8.0提供了数组切片功能,是一个左闭右开的区间,例如0..3代表前3个元素的切片。System.Index和System.Range分别代表索引和索引区间。
索引是负数
- Python支持索引是负数,以列表为例,-1代表倒数第一个数。
- C/ObjC/C++ 也支持数组索引为负数,但这是比数组基址更小的位置,一般都是错误的代码。
数组元素类型
- 为了方便管理,数组元素一般都是相同类型。
- Javascript数组元素可以是不同对象。
数组赋值
- C语言把数组名当成常量,数组名不可以被赋值。
- Java/C#/Kotlin 等语言的数组名只是一个引用,本质是指针,可以被赋值。
数组可扩展
- C/ObjC/C++/C# 创建的数组都不可以动态扩展容量。
- C# 2.0 Array.Resize()函数是创建了新数组(同时将旧数组内容拷贝到新数组)。
- VB提供了Redim改变数组元素个数。
访问未初始化数组
- C#/Java/Kotlin 等语言访问未初始化数组在编译期间就会报错。
- C/ObjC/C++ 没有如此严格,编译器可能睁一只眼闭一只眼。
- GCC和G++ 需要额外用 -Wuninitialized 参数才会显式提示警告。
若文章对您有帮助,欢迎关注 程序员小迷 。助您在编程路上越走越好!
微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。
我是 程序员小迷 (致力于C、C++、C#、Android、iOS、Java、Kotlin、Objective-C、Swift、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。
本文暂时没有评论,来添加一个吧(●'◡'●)