go语言 指针_new函数_指针变量做函数参数

╰+哭是因爲堅強的太久メ 2022-05-08 09:50 382阅读 0赞
  1. 如果学过C的都知道,指针很多地方都要用到,我们声明一个变量,其实就是就是开辟一块内存空间,我们在操作变量的时候,并不是直接取操作变量存在的空间,而是这个变量的内存地址。变量名对内存地址的引用。因此声明一个变量包含:内存空间和内存地址
  2. package main
  3. import "fmt"
  4. func main() {
  5. // 对于任意一个变量,都有两个含义:内存和地址
  6. var a = 10
  7. fmt.Printf("a = %d\n", a) // 变量的内存
  8. fmt.Printf("&a = %v \n", &a) // 变量的地址
  9. fmt.Printf("&a = %p \n", &a) // 变量的内存
  10. fmt.Println("------------------------------------ ")
  11. // 保存某一个变量的地址,需要用到指针 *int 保存int的地址 **int 保存*int的地址
  12. // 声明(定义) 定义只是特殊的声明
  13. // 声明一个变量为P 类型为*int 默认值为nil
  14. var p *int //定义一个指针变量
  15. p = &a //指针变量指向谁,就把谁的地址值赋值给哪个指针变量
  16. fmt.Printf("p = %p, &a = %v \n", p, &a)
  17. //*p表示访问指针变量p所指的单元a的值,指针p保存的a的地址
  18. fmt.Printf("*p = %v, a = %v\n", *p, a) // *p=10,a=10
  19. *p = 1111 // 表示把值赋值给变量a
  20. fmt.Printf("*p = %v, a = %v\n", *p, a) // 此时是把a的地址赋值给指针变量p, *p=1111 a=1111
  21. fmt.Println("")
  22. var b *int // 如果不初始化,默认值是nil
  23. fmt.Println("b = ", b)
  24. *b = 222 //err b指针没有合法的指向
  25. }

二、new 函数

  1. 表达式new(T)将创建一个T类型的匿名变量,为T类型的新值分配并且清零一块内存空间,然后将这块内存空间的地址值作为结果返回,这个结果就是指向这个新的T类型 的指针值,返回的指针类型为\*T.
  2. 我们在使用new函数时候,可以随意的使用,不用担心要关闭和删除空间,go语言会有自动回收机制
  3. package main
  4. import "fmt"
  5. func main() {
  6. a := 10
  7. var p *int
  8. p = &a // 合法指向
  9. *p = 111
  10. fmt.Printf("*p=%v\n", *p)
  11. var c *int
  12. c = new(int) // a为*int类型,指向匿名变量int
  13. *c = 222
  14. fmt.Printf("*c=%v\n", *c)
  15. b := new(int) // b为*int类型,指向匿名变量int
  16. *b = 333
  17. fmt.Printf("*b=%v\n", *b)
  18. }

三、指针做函数参数

  1. package main
  2. import "fmt"
  3. func swap(a, b int) {
  4. a, b = b, a
  5. fmt.Printf("a = %d, b = %d\n", a, b)
  6. }
  7. func swapPointer(p1, p2 *int) {
  8. *p1, *p2 = *p2, *p1
  9. fmt.Printf("*p1 = %v, *p2 = %v\n", *p1, *p2)
  10. }
  11. func main() {
  12. /*********普通变量做参数************/
  13. a, b := 1, 2
  14. // 通过一个函数交换a和b的位置
  15. swap(a, b)
  16. fmt.Printf("a = %d, b = %d\n", a, b)
  17. fmt.Printf("------------------------------\n")
  18. /*********指针变量作为参数************/
  19. c, d := 3, 4
  20. swapPointer(&c, &d)
  21. fmt.Printf("c = %d, d = %d\n", c, d)
  22. }

发表评论

表情:
评论列表 (有 0 条评论,382人围观)

还没有评论,来说两句吧...

相关阅读