1.介绍
- 数组指针 :它是一个指针,但是数据类型为数组,或者说指向数组
- 指针数组 :它是一个数组,该数组的元素都为地址值
2.数组指针
var 变量名 *[数组大小] 数组类型:
var arrPtr *[size] Type
初始化指针可以通过 new 函数来分配内存并返回指针的地址:
p := new(int) // 分配一个 int 类型的内存,并将指针 p 指向该内存
因为数组指针是一个指针,所以在定义时,先写 *, 表示定义一个指针,后面接数据类型
运行结果:
注意,输出的结果不是地址(不是 16 进制的数),在 Golang 中,直接输出的是&[元素 1 元素 2 ……]
我们可以输出一下二者的地址:
fmt.Printf("arr 数组的地址为:%p\n", &arr)
fmt.Printf("arrPtr 存储的地址为:%p\n", arrPtr)
可以看到,它俩的输出时一样的,因为将数组 arr 的地址赋值给了 arrPtr,而 arrPtr 是一个指针,存储的是内存地址。
当然 arrPtr 也有自己的内存地址,我们可以看一下:
fmt.Printf("arrPtr 指针自己的地址为:%p\n", &arrPtr)
输出为:
arrPtr 指针自己的地址为:0xc000006028
2.1获取指针的地址和解使用
通过 & 操作符可以获取变量的地址,例如:
x := 10
p := &x // 将指针 p 指向变量 x 的地址
a := 10
b := &a // 将指针 b 指向变量 a 的地址
使用 * 操作符可以解引用指针,获取指针指向的值 :
fmt.Println(*p) // 输出指针 p 指向的值,即变量 x 的值
输出结果:
type of b:*int
type of c:int
value of c:10
取地址操作符 & 和取值操作符 * 是一对互补操作符,& 取出地址,* 根据地址取出地址指向的值。
3.通过指针访问数组
访问数组的元素可以通过下标来访问,比如:arr [0] 即可访问数组 arr 的第一个元素。
但是我们学习了指针数组,所以尝试使用指针数组来访问元素内容,在 Golang 中,取地址的操作为 * (寻址运算符) 。
因此,我们先取存储的地址 *arrPtr,访问到数组 ,然后再下标取值 *arrPt[0],代码如下:
*arrPtr[0]
解决问题的办法很简单,就是添加一个小括号,更改运算优先级即可:
(*arrPtr)[0]
fmt.Println("(*arrPtr)[0] 通过指针访问数组的第一个元素:", (*arrPtr)[0])
fmt.Println("arrPtr[0] 通过指针访问数组的第一个元素:", arrPtr[0])
输出:
(*arrPtr)[0] 通过指针访问数组的第一个元素: 1
arrPtr[0] 通过指针访问数组的第一个元素: 1
4.指针数组
它是一个数组,该数组的元素都为地址值
var 变量名 [数组大小] * 数组类型:
var ptrArr [size] *Type
因为指针数组是一个数组,所以在定义时,先写 [size], 表示定义一个数组,后面再接指针 * 和 数组的数据类型
实例:
1. 创建一个数组指针, 数组的类型为 int,大小为 4,并赋值:
package main
import "fmt"
func main() {
var ptrArr [4]*int
a,b,c,d := 1,2,3,4
arr2 :=[4]int{a,b,c,d}//拷贝四个变量的值为函数组元素
fmt.Println(arr2)
ptrArr =[4]*int{&a,&b,&c,&d}//拷贝四个变量的地址值给函数组元素
fmt.Println(ptrArr)
}
输出:
数组 arr2 : [1 2 3 4]
指针数组 ptrArr : [0xc0000140f0 0xc0000140f8 0xc000014100 0xc000014108]
2. 操作数据,查看变化
(1).arr2 的第一个元素改变,a 会不会变化,ptrArr 会不会变化?
arr2[0] = 100
fmt.Println("arr2 的值为:", arr2)
fmt.Println("a 的值为;", a)
fmt.Println("ptrArr 的值为;", *ptrArr[0])
输出:
arr2 的值为: [100 2 3 4]
a 的值为; 1
ptrArr 的值为; 1
先看 a 的值为 1 解释:
ptrArr 的值为 1 解释:
fmt.Println("ptrArr[0] 的值:", ptrArr[0])
fmt.Printf("a 的内存地址为:%p\n", &a) // %p 占位符表示地址值
输出:
ptrArr[0] 的值: 0xc0000140f0
a 的内存地址为:0xc0000140f0
(2). 指针数组变化,a,b,c,d 会不会改变? 数组 arr2 会不会改变?
*ptrArr[0] = 1000 // 指针数组的第一个元素地址指向的值发生改变
fmt.Println("a 的值为:", a)
fmt.Println("arr2 的值为:", arr2)
输出:
a 的值为: 1000
arr2 的值为: [100 2 3 4]
a 的值为: 1000 解析:
arr2 的值为: [100 2 3 4] 解析: