二维数组

应用场景: 五子棋
地图也是二维数组,有3D地图

定义使用

  1. package main
  2. import "fmt"
  3. func main() {
  4. var arr [4][6]int
  5. fmt.Println("arr = ", arr) // arr = [[0 0 0 0 0 0] [0 0 0 0 0 0] [0 0 0 0 0 0] [0 0 0 0 0 0]]
  6. arr[1][2] = 1
  7. arr[2][1] = 2
  8. arr[2][2] = 3
  9. fmt.Println("arr = ", arr)
  10. for i := 0; i < len(arr); i++ {
  11. fmt.Printf("第%v个数组 = ", i+1)
  12. for j := 0; j < len(arr[i]); j++ {
  13. fmt.Printf("%v ", arr[i][j])
  14. }
  15. fmt.Println()
  16. }
  17. /*
  18. 第1个数组 = 0 0 0 0 0 0
  19. 第2个数组 = 0 0 1 0 0 0
  20. 第3个数组 = 0 2 3 0 0 0
  21. 第4个数组 = 0 0 0 0 0 0
  22. */
  23. }

直接初始化二维数组

  1. // 声明并初始化
  2. var arr3 [2][3]int = [2][3]int{{1, 2, 3}, {4, 5, 6}}
  3. fmt.Println("arr3 = ", arr3) // arr3 = [[1 2 3] [4 5 6]]

内存分配

  1. // 二维数组内存探究
  2. var arr2 [2][3]int
  3. arr2[1][1] = 10
  4. fmt.Println("arr2 = ", arr2) // arr2 = [[0 0 0] [0 10 0]]
  5. // 0xc00000a3f0 + 3(元素个数) * 8(int占8个字节) = 0xc00000a408
  6. fmt.Printf("arr2[0]的地址: %p\n", &arr2[0]) // 0xc00000a3f0
  7. fmt.Printf("arr2[1]的地址: %p\n", &arr2[1]) // 0xc00000a408
  8. // 上面的地址就是数组元素首地址
  9. fmt.Println("arr2[0][0]的地址: ", &arr2[0][0]) // 0xc00000a3f0
  10. fmt.Println("arr2[1][0]的地址: ", &arr2[1][0]) // 0xc00000a408

image.png

二维数组遍历

  1. // 遍历
  2. var arr4 [2][3]int = [2][3]int{{1, 2, 3}, {4, 5, 6}}
  3. for i := 0; i < len(arr4); i++ {
  4. fmt.Printf("第%v层", i)
  5. for j := 0; j < len(arr4[i]); j++ {
  6. fmt.Printf("%v ", arr4[i][j])
  7. }
  8. fmt.Println()
  9. }
  10. // for range
  11. for i, v := range arr4 {
  12. fmt.Printf("i = %v, v = %v\n", i, v)
  13. for j, v2 := range v {
  14. /*
  15. range创建每个元素的副本,而不是直接返回对该元素的引用
  16. 迭代返回变量是一个迭代过程中根据切片依次赋值的新变量
  17. 所以v的地址总是相同的
  18. 要想获取每个元素的地址,可以使用切片变量和索引值
  19. */
  20. fmt.Printf("arr4[%v][%v] = %v, 地址:%v \n", i, j, v2, &v2)
  21. }
  22. fmt.Println()
  23. }