二维数组
二维数组入门案例:
func main() {
//转置
var a1 = [3][4]int{
{1, 2, 3, 6},
{4, 5, 6, 15},
{7, 8, 9, 24}}
b1 := [4][3]int{}
for i := 0; i < 3; i++ {
for j := 0; j < 4; j++ {
if i != j {
b1[j][i] = a1[i][j]
} else {
b1[j][i] = a1[i][j]
}
}
}
fmt.Println(b1)
b2 := b1
//二维数组遍历方式
for i := 0; i < 4; i++ {
for j := 0; j < 3; j++ {
fmt.Printf("%v ", b2[i][j])
}
fmt.Println()
}
}
语法:var 数组名 [大小][大小]类型
,例如var a1 [2][2]int
;var a1 [...][3]int
二维数组仅支持第一维可以使用[...]
不明确大小,二维必须有明确大小。同样也支持类型推导形式,b1=[3][4]int
。
二维数组在内存的存在形式
1.二维数组的本质是多个一维数组
2.二维数组的地址等于其第一个一维数组的地址等于一位数组首个元素的地址
3.一维数组间地址的间隔等于列数*类型所占字节。例如,arr[0]的地址为0xc0000c0060,arr[1]的地址为0xc0000c0078,两者间隔24个字节(列数3,int类型 8个字节)
arr := [2][3]int{{1, 2, 3}, {4, 5, 6}}
fmt.Printf("arr的地址为%p\n", &arr) //arr的地址为0xc0000c0060
fmt.Printf("arr[0]的地址为%p\n", &arr[0]) //arr[0]的地址为0xc0000c0060
fmt.Printf("arr[0][0]的地址为%p\n", &arr[0][0]) //arr[0][0]的地址为0xc0000c0060
fmt.Printf("arr[1]的地址为%p\n", &arr[1]) //arr[1]的地址为0xc0000c0078
fmt.Printf("arr[1][0]的地址为%p\n", &arr[1][0]) //arr[1][0]的地址为0xc0000c0078
}
二维数组遍历
1.for
循环
2.for-range
循环
func main() {
//演示二维数组的遍历
var arr = [2][3]int{{1, 2, 3}, {4, 5}} //arr[1][2]默认为0
//for循环遍历
for i := 0; i < len(arr); i++ {//第一维长度
for j := 0; j < len(arr[i]); j++ {
fmt.Printf("%v ", arr[i][j])
}
fmt.Println()
}
//for range 循环遍历
for i, v := range arr {
for j, v1 := range v {
fmt.Printf("arr[%v][%v]=%v ", i, j, v1)
}
fmt.Println()
}
}
Output
1 2 3
4 5 0
arr[0][0]=1 arr[0][1]=2 arr[0][2]=3
arr[1][0]=4 arr[1][1]=5 arr[1][2]=0