Go数组名和切片名是不是指针?

  1. 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语言不同。

  1. 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切片名是指针,指向第一个元素

  1. 从数组取出的切片和原数组地址什么关系?
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

可见,取出的切片名是指针,指向原数组切片出的第一个元素

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值