8.1. 数组
数组
如果要存储商城里所有商品的销量,应该怎样存储呢?
可能有同学说,通过定义变量来存储。但是,问题是商城有100个商品,那么要定义100个变量吗?
像以上情况,最好是通过数组的方式来存储。
所谓的数组:是指一系列同一类型数据的集合。
1. 数组定义
数组是一系列相同数据类型在内存中有序存储的数据集合
数组定义也是通过var 关键字
格式:var 数组名 [元素个数]数据类型
例子: 定义了10个整型变量的数组元素
定义了10个整型变量的数组元素
var arr [10]int
var 后面是数组的名字a,长度是10,类型是整型。表示:数组a能够存储10个整型数字。也就是说,数组a的长度是10。
我们可以通过len( )函数测试数组的长度,如下所示:
var a [10]int
fmt.Println(len(a))
当定义完成数组a后,就在内存中开辟了10个连续的存储空间,每个数据都存储在相应的空间内,数组中包含的每个数据被称为数组元素(element),一个数组包含的元素个数被称为数组的长度。
注意:数组的长度只能是常量。以下定义是错误的:
var n int = 10
var a [n]int
2. 数组赋值
数组定义完成后,可以对数组进行赋值操作。
数组是通过下标来进行操作的,下标的范围是从0开始到数组长度减1的位置。
var a[10] int
表示的范围是a[0],a[1],a[2].......,a[9]
数组名[下标] 指向具体某一个元素
2.1 数组赋值例子: 通过下标赋值
var arr [10]int
arr[0] = 123
arr[1] = 110
arr[2] = 234
arr[5] = 567
//打印数组
fmt.Println(arr)
fmt.Println(arr[0])
fmt.Println(arr[1])
fmt.Println(arr[2])
2.2 在定义数组时 依次为数组元素赋值
var arr [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
在定义数组是 可以为部分元素赋值
var arr [10]int = [10]int{1, 2, 3, 4, 5}
2.3 在定义数组时可以指定下标赋值
var arr [10]int = [10]int{1: 10, 4: 20, 6: 30}
2.4 定义时写…可以根据元素个数赋值
var arr [4]int = [...]int{1, 2, 3, 4}
也可以简写为
arr := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
2.5 len(数组名)//计算数组元素个数
fmt.Println(len(arr))
2.6 遍历数组元素值
arr := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
for i:=0;i<len(arr);i++{
fmt.Println(arr[i])
}
也可以使用range 数组名变量,按照最大的范围去遍历数组
arr := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
for _, v := range arr {
fmt.Println(v)
}
3. 数组常见问题
先定义一个arr 10个长度的 int 数组
var arr [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
3.1 数组下标越界
给arr下标 10 赋值。会报错,这就是 数组下标越界
arr[10]=321//err
最大值下标:len(arr)-1,简单来说就是。从0开始,你肯定要减去1啊
访问 -1,这个下标,也会提示越界报错
arr[-1]=321//err
3.2 两个数组如果类型和元素个数相同可以赋值
arr1=arr
3.3 打印数组数据类型
fmt.Printf("%T\n", arr)
3.4 打印数组地址
数组名表示整个数组 数组名对应的地址就是数组第一个元素的地址
fmt.Printf("数组地址:%p\n", &arr)
打印数组中的元素地址
/fmt.Printf("数组第一个元素地址:%p\n",&arr[0])
//fmt.Printf("数组第二个元素地址:%p\n",&arr[1])
//fmt.Printf("数组第三个元素地址:%p\n",&arr[2])
打印数组所有元素地址
for i := 0; i < len(arr); i++ {
fmt.Printf("%p\n", &arr[i])
}
4. 数组逆置
定义个 arr,我们来逆置 arr。
思路,就是for循环的交换
var arr [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
找到最大 最小值。
i := 0 //最小值下标
j := len(arr) - 1 //最大值下标
开始for 循环
//for 表达式1;表达式2;表达式3{}
//for 返回值:=range 集合{}
//for 条件 {}
for i < j {
//if (i >= j) {
// //跳出循环
// break
//}
//交换数据
arr[i], arr[j] = arr[j], arr[i]
//改变下标
i++
j--
}
fmt.Println(arr)
5. 数组冒泡排序
文本太长,请看下一节。