- Go数组名是指针吗?若是,数组名存的是第一个元素的地址吗?
arr := [5]int{12, 34, 55, 66, 43}
p_arr := &arr
p_arr0 := &(arr[0])
fmt.Printf("p_arr: %p, %T, %d\n", p_arr, p_arr, *p_arr)
fmt.Printf("p_arr0: %p, %T, %d\n", p_arr0, p_arr0, *p_arr0)
// p_arr: 0xc00000a480, *[5]int, [12 34 55 66 43]
// p_arr0: 0xc00000a480, *int, 12
可见,Go数组名不是指针,数组名存的是第一个元素本身,这和C语言不同。
- Go切片名是指针吗?
sli := []int{12, 34, 55, 66, 43}
p_sli := &sli
p_sli0 := &(sli[0])
fmt.Printf("sli: %p, %T, %d\n", sli, sli, sli)
fmt.Printf("p_sli: %p, %T, %d\n", p_sli, p_sli, *p_sli)
fmt.Printf("p_sli0: %p, %T, %d\n", p_sli0, p_sli0, *p_sli0)
// sli: 0xc00000a510, []int, [12 34 55 66 43]
// p_sli: 0xc000004078, *[]int, [12 34 55 66 43]
// p_sli0: 0xc00000a510, *int, 12
可见,Go切片名是指针,指向第一个元素
- 从数组取出的切片和原数组地址什么关系?
arr_sli := arr[:]
p_arr_sli := &arr_sli
p_sarr_sli0 := &(arr_sli[0])
fmt.Printf("arr_sli: %p, %T, %d\n", arr_sli, arr_sli, arr_sli)
fmt.Printf("p_arr_sli: %p, %T, %d\n", p_arr_sli, p_arr_sli, *p_arr_sli)
fmt.Printf("p_sarr_sli0: %p, %T, %d\n", p_sarr_sli0, p_sarr_sli0, *p_sarr_sli0)
// arr_sli: 0xc00000a480, []int, [12 34 55 66 43]
// p_arr_sli: 0xc0000040f0, *[]int, [12 34 55 66 43]
// p_sarr_sli0: 0xc00000a480, *int, 12
可见,取出的切片名是指针,指向原数组切片出的第一个元素