Go笔记(七):指针

1、指针

  在Go中,指针的操作有两个符号:&(取地址) 和 * (变量指针的声明 | 取指针变量的值)。

  一个指针变量指向了一个值的内存地址。

  Go中函数传值皆为值拷贝,对于引用类型的传值,可以创建一个指针变量,无需拷贝数据。Go中,类型指针不能进行偏移和运算。

2、指针地址和指针类型

  变量在运行是都拥有一个地址,该地址代表变量在内存中的位置。

  Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。

  Go语言中的值类型(int、float、bool、string、array、struct)都有对应的指针类型。

3、声明指针

3.1、声明指针变量

var pointer_name *type

   pointer_name: 指针变量名称

  type:指针类型

  *: 用于指定变量是作为一个指针

 1 package main
 2 
 3 import "fmt"
 4 
 5 // 声明指针
 6 func definepointer() {
 7    // * 变量指针的声明
 8    var intpt *int // 指向整型
 9    var strpt *string // 指向字符串
10    // & 取指针变量的地址
11    fmt.Printf("intpt: %v\n", &intpt)
12    fmt.Printf("strpt: %v\n", &strpt)
13 }
14 
15 func main() {
16    definepointer()
17 }

  执行结果如下:

3.2、空指针

  当一个指针被定义后没有分配到任何变量时,它的值为 nil。nil 指针也称为空指针,值为指针类型的默认值。

 1 package main
 2 
 3 import "fmt"
 4 
 5 // 空指针
 6 func defineNilPointer() {
 7    var ptr *int
 8    fmt.Printf("ptr: %v\n", ptr)
 9    fmt.Printf("ptr 的值为 : %x\n", ptr)
10 }
11 
12 func main() {
13    defineNilPointer()
14 }

  执行结果如下:

3.3、指针初始化

 1 package main
 2 
 3 import "fmt"
 4 
 5 /**
 6    初始化指针
 7  */
 8 func initpointer() {
 9    // * 变量指针的声明
10    var intpt *int
11    var i = 10
12    // 将变量i的内存地址赋给指针类型的变量intpt
13    intpt = &i
14    fmt.Printf("initpointer ===> intpt地址: %v\n", intpt)
15    // * 取指针类型的变量值
16    fmt.Printf("initpointer ===> intpt的值: %v\n", *intpt)
17 
18    // 声明string类型指针
19    var strpt *string
20    // 类型
21    fmt.Printf("initpointer ===> strpt的类型: %T\n", strpt)
22    s1 := "timi"
23    strpt = &s1
24    // 地址
25    fmt.Printf("initpointer ===> s1的地址: %v\n", strpt)
26    // 指针类型
27    fmt.Printf("initpointer ===> s1值: %v\n", *strpt)
28 }
29 
30 func main() {
31    initpointer()
32 }

  执行结果如下:

4、指针数组

 1 package main
 2 
 3 import "fmt"
 4 
 5 /**
 6    指针数组的声明及初始化
 7  */
 8 func pointArr() {
 9    var arrptInt [3]*int
10    // 数组元素变量内存地址
11    fmt.Printf("arrptInt的地址 : %v\n", arrptInt)
12    // 数组指针类型
13    fmt.Printf("arrptInt的指针类型 : %T\n", arrptInt)
14    // 数组指针元素默认值
15    fmt.Printf("arrpt的默认值 : %x\n", arrptInt)
16 
17    // 定义字符串类型指针
18    var arrptStr [3]*string
19    // 定义数组
20    arrpt := []string{"tom", "jack", "timi"}
21    // 将数组的元素地址赋值到字符串类型指针中
22    for i := 0; i < len(arrpt); i++ {
23       arrptStr[i] = &arrpt[i]
24    }
25    // 输出字符串类型指针内容
26    for i := 0; i < len(arrptStr); i++ {
27       fmt.Printf("arrptStr[%d] = %v\n", i, *arrptStr[i])
28    }
29 }
30 
31 func main() {
32    pointArr()
33 }

  执行结果如下:

 

posted @ 2023-04-18 09:07  无虑的小猪  阅读(33)  评论(0编辑  收藏  举报