Go 1.4操作符指针理解
对于初学者来说操作符指针类型、指针、取地址容易混淆,多练就好了。
只需要记住两个符号:&
(取内存地址)和*
(解引用)。
定义和使用:你可以使用 &
操作符获取一个变量的内存地址,使用 *
操作符通过指针来访问该地址指向的变量值。
指针==指向的内存地址
1. &
取地址符(操作符)
&
是取地址符号,它用于获取一个变量的内存地址,也就是获取一个指向该变量的指针。
场景:
当你需要将某个变量的指针传递给另一个函数或在程序中需要引用该变量而不是复制它的值时,使用 &
。
package main
import "fmt"
func main() {
x := 10
p := &x // p 是指向 x 的指针
fmt.Println("x 的值:", x)
fmt.Println("p 保存的地址:", p)
fmt.Println("通过 p 访问 x 的值:", *p)
}
2. 指针的特点:
- 可以存储某个变量的内存地址。
- 可以通过指针修改变量的值。
- 指针可以是
nil
,即它不指向任何变量。
3. *
p操作符
*
是解引用符号,用于通过指针访问指向的变量的值。它可以用来获取指针指向的内存地址处存储的数据。
当有一个指针,想要访问或修改指针指向的变量的值时,使用 *
。
package main
import "fmt"
func main() {
var x int = 10 // 声明一个变量 x,值为 10
var p *int // 声明一个指向 int 类型的指针 p
p = &x // 使用取地址符 & 获取 x 的内存地址,并赋值给 p
fmt.Println("x 的值:", x) // 输出 x 的值,10
fmt.Println("p 存储的地址:", p) // 输出 p 存储的地址
fmt.Println("通过 p 获取的值:", *p) // 通过指针 p 获取指向的值(即 x 的值)
// 通过指针修改 x 的值
*p = 20
fmt.Println("修改后的 x 的值:", x) // 输出修改后的 x 的值,20
}
&x
表示取变量x
的内存地址,将该地址赋给p
。*p
表示通过指针p
来访问它指向的变量的值。在这里,*p
的值就是x
的值。*p = 20
表示通过指针修改x
的值。
package main
import "fmt"
type Person struct {
Name string
Age int
}
func main() {
var p *Person // 声明一个指向 Person 类型的指针 p, 初始值为 nil
fmt.Println(p) // 打印 p,结果是 nil
// 创建一个 Person 类型的变量
p1 := Person{Name: "John", Age: 30}
// 获取 p1 的内存地址,并赋值给指针 p
p = &p1
fmt.Println(p) // 打印 p,结果是 p1 的内存地址
fmt.Println(*p) // 解引用指针 p,打印 p1 的值
}
4.疑惑
4.1、指针类型
package main
import "fmt"
type Person struct {
Name string
Age int
}
func main() {
p1 := Person{"John", 30} // 创建一个 Person 类型的变量 p1
var p *Person // 声明一个指向 Person 类型的指针 p
p = &p1 // 将 p1 的内存地址赋给 p,即 p 指向 p1
fmt.Println(p) // 输出指针 p,显示的是 p1 的内存地址
fmt.Println(*p) // 通过 *p 解引用指针,访问 p1 的内容
fmt.Println(p.Name) // 直接访问指针 p 所指向的结构体字段 Name
}
简单来说:
Person 是一个数据类型(比如一个结构体)。
- *Person 是一个指针类型,它指向的是 Person 类型的变量。
- p *Person 声明的是一个指针变量 p,它保存的是一个指向 Person 类型数据的内存地址。
解释:
1. p *Person:p 是一个指向 Person 类型的指针变量,意味着 p 保存的就是 Person 类型变量的内存地址。
2. p = &p1:我们将 p1 的内存地址赋给 p,也就是让 p 指向 p1。
3. *p:通过解引用 *p,我们可以访问指针 p 所指向的 Person 结构体的值。
4. p.Name:直接通过指针 p 访问 p1 的 Name 字段。
总结:
• p *Person 声明了一个指向 Person 类型的指针变量 p。
• p 保存的是 Person 类型变量的内存地址,*p 允许你通过指针访问和操作该变量的值。
如果还感到混乱,可以把指针理解成指向内存中某个位置的 “导航”。通过 & 获取指针,即获取 “导航”;通过 * 访问指针指向的实际数据,就是 “跟随导航去查看位置”。