v [*int]int 和i int[*int]在go语言中的区别是什么 实现案列
时间: 2023-08-30 12:06:06 浏览: 105
在 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]` 取出第一个元素的值,并打印出来。
需要注意的是,在实际开发中,我们一般不会使用这样的语法来声明变量,而是使用更为直观和易读的方式来实现相同的功能。
阅读全文