数组内存管理
开辟内存 默认零值
数组,定长且元素类型一致的数据集合
必备知识点:
- 数组的内存是连续的
- 也就是声明的元素是连续挨着存放的,内存之间的间隔和元素的类型有关,就比如元素为
int8
类型,那么他们之间就相差一个字节
- 也就是声明的元素是连续挨着存放的,内存之间的间隔和元素的类型有关,就比如元素为
- 数组的内存地址实际上就是数组第一个元素的内存地址
- 也就是第0个元素的内存地址,变量的内存地址指向的就是第0个元素的内存地址
- 每个字符串的内部存储分为两部分
len
+str
小栗子
int8类型的
package main
import "fmt"
func main() {
nums := [3]int8{11,22,33}
fmt.Println(nums)
//%s %d %f 这些占位符分别表示字符串,整形,浮点型
//%p 是用来表示内存地址的 \n换行
fmt.Printf("数组的内存地址:%p \n",&nums)
fmt.Printf("数组第一个元素的内存地址:%p \n",&nums[0])
fmt.Printf("数组第二个元素的内存地址:%p \n",&nums[1])
fmt.Printf("数组第三个元素的内存地址:%p \n",&nums[2])
fmt.Printf("数组第二个元素:%d \n",nums[1])
}
>>>输出
[11 22 33]
数组的内存地址:0xc0000a2058
数组第一个元素的内存地址:0xc0000a2058 // 和数组内存地址相等
数组第二个元素的内存地址:0xc0000a2059 // 相差一个字节
数组第三个元素的内存地址:0xc0000a205a
数组第二个元素:22
int32类型的
package main
import "fmt"
func main() {
nums := [3]int32{11,22,33}
fmt.Println(nums)
//%s %d %f 这些占位符分别表示字符串,整形,浮点型
//%p 是用来表示内存地址的 \n换行
fmt.Printf("数组的内存地址:%p \n",&nums)
fmt.Printf("数组第一个元素的内存地址:%p \n",&nums[0])
fmt.Printf("数组第二个元素的内存地址:%p \n",&nums[1])
fmt.Printf("数组第三个元素的内存地址:%p \n",&nums[2])
fmt.Printf("数组第二个元素:%d \n",nums[1])
}
>>>输出
[11 22 33]
数组的内存地址:0xc00000a0b0
数组第一个元素的内存地址:0xc00000a0b0
数组第二个元素的内存地址:0xc00000a0b4 //相差四个字节
数组第三个元素的内存地址:0xc00000a0b8
数组第二个元素:22
字符类型
在数组里面存字符串,存储的并不是字符串的内容,而是存的字符串的长度(8bit)和指针(8bit),指针指向另外一个内存,这个内存里存放真正的内容,每一个字符串
package main
import "fmt"
func main() {
names := [3]string{"孙悟空", "八戒", "沙和尚啊"}
fmt.Println(names)
fmt.Printf("数组的内存地址:%p \n", &names)
fmt.Printf("数组第一个元素的内存地址:%p \n", &names[0])
fmt.Printf("数组第二个元素的内存地址:%p \n", &names[1])
fmt.Printf("数组第三个元素的内存地址:%p \n", &names[2])
}
>>>输出
[孙悟空 八戒 沙和尚啊]
数组的内存地址:0xc00006c330
数组第一个元素的内存地址:0xc00006c330 // 看起来虽然差了十位,但是由于是展示是以16进制展示 0123456789abcdef 其实相差的是16个bit位
数组第二个元素的内存地址:0xc00006c340
数组第三个元素的内存地址:0xc00006c350