数组与切片在内存中的存在形式

1. 内存中的数组

代码说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
* @Author: Administrator
* @Description:
* @File: 0.内存中的数组
* @Version: 1.13.4
* @Date: 2020/1/22 16:44
*/

package main

import "fmt"

func main(){

var intArry [3]int
//当我们定义完数组后,其实数组的各个元素有默认值为0的数值
fmt.Println(intArry)//[0 0 0]


/*
首先可以肯定一点是,从如下的输出代码,我们可以看出整个数组列表的地址和数字下表为0的第一个元素地址,是相同的,那么得出的结论就是,intArry[0] 就是代表数组本身的地址
*/
fmt.Printf("intArry的地址=:%p intArry[0]的地址:%p",&intArry,&intArry[0])
//输出结果intArry的地址=:0xc000010300 intArry[0]的地址:0xc000010300

fmt.Printf("intArry的地址=:%p intArry[0]的地址:%p",&intArry,&intArry[1])

//第二个元素地址是? 这里直接说明一下,其实他是第一个地址的原基础上,加上这个数组类型占用的字节数
//因此结果是:0xc000010308 以此类推,他的存在方式是以十六进制方式相加,当你 取到第三个元素时 intArry[2] 此时内存地址 会以 0xc000010308 的基础上加8个字节 得到的结果会以十六进制进位表示0xc000010310

//为啥当 fmt.println(intArry) 时会整体输出数组以及里面的数值呢?
//因为当取值的时候会按照循序依次往后加当前类型的字节数,进行取值,所以能够一次性的把所有值取完。
}

数组内存的示意图:

1579683809143

切片内存的示意图: