go语言的[]*int和*[]int

[]*int是一个指向指针的切片,本质上是切片,只不过切片里面存放的元素是指针;
*[]int是一个指向切片的指针,本质上是指针,可以用*来获取切片;
简易记法:从右往左读,最后一个符号是[],说明是切片,倒数第二个符号是*说明切片里是指针;从右往左读,最后一个符号是*,说明是指针,倒数第二个符号是[]说明指针指向一个切片类型。

对于[]*int,可以使用for _, ptr := range slice获得切片里面的指针,并通过*ptr得到切片里的元素(本质上是指针/地址)对应的值。
对于*[]int,可以使用*slice获得整个切片。

[]*int

func main() {
	var a = 1
	var b = 2
	var slice []*int
	slice = append(slice, &a)
	slice = append(slice, &b)
	for _, ptr := range slice {
		fmt.Print(*ptr, " ")
	}
}
输出:1 2 

*[]int

func main() {
	var a = 1
	var b = 2
	var slice *[]int
	arr := []int{a, b}
	slice = &arr
	fmt.Println(*slice)
}
输出:[1 2]
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Go 语言中,`v [*int]int` 和 ` int[*int]` 是两个不同类型的声明,它们的语法和语义都是不同的。 `v [*int]int` 声明了一个指向整型数组的指针,该数组的长度是在运行时动态分配的。这个类型类似于 C 语言中的动态数组,可以用于实现动态容器等数据结构。例如: ``` package main import "fmt" func main() { var arrPtr *int arr := make([]int, 5) arrPtr = &arr[0] v := &arrPtr (*v)[0] = 1 (*v)[1] = 2 fmt.Println((*v)[0], (*v)[1]) } ``` 这个例子中,我们使用 `make` 函数创建了一个长度为 5 的整型切片 `arr`,然后取得第一个元素的地址,将其赋值给一个整型指针 `arrPtr`。接着,我们将 `arrPtr` 的地址赋值给一个指向整型数组的指针 `v`,并使用 `(*v)[0]` 和 `(*v)[1]` 分别对数组的前两个元素赋值,并打印出它们的值。 `i int[*int]` 声明了一个整型指针的数组,该数组的长度是在编译时确定的,每个元素都指向一个整型变量。这个类型类似于 C 语言中的数组指针,可以用于实现多维数组等数据结构。例如: ``` package main import "fmt" func main() { var arr [5]int var arrPtrs [5]*int for i := range arr { arrPtrs[i] = &arr[i] } i := &arrPtrs (*i)[0] = new(int) *(*i)[0] = 1 fmt.Println(*(*i)[0]) } ``` 这个例子中,我们创建了一个长度为 5 的整型数组 `arr`,以及一个指向整型指针的数组 `arrPtrs`。然后,我们使用 `for` 循环为每个元素赋值,将其地址存储到 `arrPtrs` 数组中。接着,我们将 `arrPtrs` 的地址赋值给一个指向整型指针数组的指针 `i`,并使用 `new` 函数为数组的第一个元素分配了一块内存空间,并将其地址赋值给 `(*i)[0]`。最后,我们通过 `*(*i)[0]` 取出第一个元素的值,并打印出来。 需要注意的是,在实际开发中,我们一般不会使用这样的语法来声明变量,而是使用更为直观和易读的方式来实现相同的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值