当前位置:   article > 正文

go初学篇(五)之指针_获取指针指向的内容

获取指针指向的内容

前言

对于指针,C语言可是靠着这个东西混的游刃有余,go创作初继承了大量C的属性,所以指针就是必不可少的,而go的指针和C也有很大不同。咱们也不用深究不同点,只要知道指针是存储一个变量内存地址的,它本身也是一个变量。

1. 获取变量的地址

go语言中取地址符为&,往往放到一个变量的前面,用来返回相应的内存地址
  1. var a int = 1
  2. fmt.Printf("变量的地址: %x\n", &a)
   变量的地址: c0000aa058

2. 声明指针

  一般的格式为*TT表示的是变量类型
  1. var a int = 10 /* 声明一个实际变量 */
  2. var b *int /* 声明一个指针变量 */
  3. b = &a /* 指针变量的存储地址 */
  4. fmt.Printf("a 变量的地址是: %x\n", &a)
  5. /* 指针变量的存储地址 */
  6. fmt.Printf("ip 变量的存储地址: %x\n", b)
  7. /* 使用指针访问值 */
  8. fmt.Printf("*ip 变量的值: %d\n", *b)
  1. a 变量的地址是: c000018098
  2. ip 变量的存储地址: c000018098
  3. *ip 变量的值: 10

如果一个指针被定义了但是没有赋予任何变量,那么它就是一个空指针,值为nil

3.指针的一系列操作

获取指针就是访问指针指向变量的值,语法就是*a

3.1操作指针改变变量的数值

  1. a := 100
  2. b := &a
  3. fmt.Println("a的地址是", b)
  4. fmt.Println("a的值是", *b)
  5. *b++
  6. fmt.Println("a的新值是", a)
  1. a的地址是 0xc000018098
  2. a的值是 100
  3. a的新值是 101

3.2用指针在函数里传参

  1. func foo(a *int) {
  2. *a = 12
  3. }
  4. func main() {
  5. b := 15
  6. fmt.Println("在改变之前b的值为", b)
  7. c := &b
  8. foo(c)
  9. fmt.Println("在改变之后b的值为", b)
  10. }
  1. 在改变之前b的值为 15
  2. 在改变之后b的值为 12

如果函数的参数是数组,就不要用指针指向它,也就是说,函数的参数不能是用指针指向的数组,要使用切片

  1. func foo(arr *[3]int) {
  2. arr[0] = 90
  3. }
  4. func main() {
  5. a := [3]int{89, 90, 91}
  6. foo(&a)
  7. fmt.Println(a)
  8. }
[90 90 91]

虽然上面的结果正确,但这并不是实现这一目标好用的方法,相对而言还显得复杂,我们不妨用切片来试试

  1. func foo(arr []int) {
  2. arr[0] = 90
  3. }
  4. func main() {
  5. a := [3]int{89, 90, 91}
  6. foo(a[:])
  7. fmt.Println(a)
  8. }
  1. [90 90 91]

在开发的过程中我们有可能需要保存原数组,指针就是不错的选择

  1. const MAX int = 3
  2. func main() {
  3. a := []int{110, 111, 112}
  4. var i int
  5. var arr [MAX]*int
  6. for i = 0; i < MAX; i++ {
  7. arr[i] = &a[i] /* 整数地址赋值给指针数组 */
  8. }
  9. for i = 0; i < MAX; i++ {
  10. fmt.Printf("a[%d] = %d\n", i, *arr[i])
  11. }
  12. }
  1. a[0] = 110
  2. a[1] = 111
  3. a[2] = 112

4.指向指针的指针
如果一个指针存的是另一个指针的地址,则这个指针变量就是指向指针变量的指针

  1. var a int
  2. var arr *int
  3. var aarr **int
  4. a = 100
  5. /* 指针 arr 地址 */
  6. arr = &a
  7. /* 指向指针 arr 地址 */
  8. aarr = &arr
  9. /* 获取 aarr 的值 */
  10. fmt.Printf("变量 a = %d\n", a)
  11. fmt.Printf("指针变量 *arr = %d\n", *arr)
  12. fmt.Printf("指向指针的指针变量 **aarr = %d\n", **aarr)
  1. 变量 a = 100
  2. 指针变量 *arr = 100
  3. 指向指针的指针变量 **aarr = 100

函数的参数是指针

  1. func swap(x *int, y *int) {
  2. var tem int
  3. tem = *x /* 保存 x 地址的值 */
  4. *x = *y /* 将 y 赋值给 x */
  5. *y = tem /* 将 temp 赋值给 y */
  6. }
  7. func main() {
  8. /* 定义局部变量 */
  9. var a int = 10
  10. var b int = 20
  11. fmt.Printf("变化前 a 的值为 : %d\n", a)
  12. fmt.Printf("变化前 b 的值为 : %d\n", b)
  13. /* 调用函数用于交换值
  14. * &a 指向 a 变量的地址
  15. * &b 指向 b 变量的地址
  16. */
  17. swap(&a, &b)
  18. fmt.Printf("变化后 a 的值为 : %d\n", a)
  19. fmt.Printf("变化后 b 的值为 : %d\n", b)
  20. }
  1. 变化前 a 的值为 : 10
  2. 变化前 b 的值为 : 20
  3. 变化后 a 的值为 : 20
  4. 变化后 b 的值为 : 10
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/思考机器6/article/detail/63207
推荐阅读
相关标签
  

闽ICP备14008679号