Go基础(④指针)
简单示例
package mainimport "fmt"func main() {var num int = 100var p *int = &num // 指向int类型的指针fmt.Println(*p) // 解引用,输出 100*p = 200 // 通过指针修改原变量fmt.Println(num) // 输出 200
}
package mainimport "fmt"func main() {a := 10var p *int // 声明一个指向int的指针pp = &a // p存储a的内存地址(p指向a)fmt.Println("a的值:", a) // 输出:a的值:10fmt.Println("a的地址:", &a) // 输出:a的地址:0xc00001a0a8(地址值可能不同)fmt.Println("p存储的地址:", p) // 输出:p存储的地址:0xc00001a0a8(和a的地址相同)fmt.Println("p指向的值:", *p) // 输出:p指向的值:10(通过指针访问a的值)// 通过指针修改a的值*p = 20fmt.Println("修改后a的值:", a) // 输出:修改后a的值:20
}
函数中使用指针
如果想在函数内部修改外部变量的值,需要传递指针:
package mainimport "fmt"// 传递指针参数
func addOne(p *int) {*p = *p + 1 // 修改指针指向的变量的值
}func main() {x := 5addOne(&x) // 传递x的地址fmt.Println(x) // 输出:6(x的值被函数内部修改了)
}
数组指针的基本用法
数组指针:
可以直接通过指针修改数组元素(Go 会自动解引用),但无法改变数组的长度(数组长度固定)。
package mainimport "fmt"func main() {// 定义一个数组arr := [3]int{10, 20, 30}// 声明一个数组指针,指向arrvar p *[3]int = &arr// 打印指针存储的地址(数组的地址)fmt.Println("数组地址:", p) // 类似 0xc00001a0c0// 通过指针访问数组元素(两种方式都可以)fmt.Println(p[0]) // 直接用指针[索引],输出 10fmt.Println((*p)[1])// 先解引用再访问,输出 20(和上面效果一样)// 通过指针修改数组元素p[2] = 300fmt.Println(arr[2]) // 输出 300,原数组被修改了
}
切片指针:
需先解引用指针才能操作切片元素,且可以修改切片的长度、容量或底层数组(通过 append
等操作)。
s := []int{1, 2, 3}
p := &s // 切片指针 *[]int
(*p)[0] = 100 // 必须解引用才能修改元素(不能直接 p[0])
*p = append(*p, 4) // 修改切片本身(长度变为4)
fmt.Println(s) // 输出 [100 2 3 4]
函数中使用数组指针
package mainimport "fmt"// 接收数组指针参数
func modifyArray(p *[3]int) {p[0] = 100 // 修改数组第一个元素
}func main() {arr := [3]int{1, 2, 3}modifyArray(&arr) // 传递数组的地址fmt.Println(arr) // 输出 [100 2 3],原数组被修改
}
** 指针的指针
func main() {num := 10p := &num // 一级指针(*int)pp := &p // 二级指针(**int)**pp = 20 // 通过二级指针修改原变量fmt.Println(num) // 输出 20
}
123