package main
import "fmt"
// 指针
// 变量的本质就是内存中一块数据的标记,把值储存到变量中的实质是把值储存到内存中
// 每次对变量重新赋值就是修改变量地址中的内容
// 在go语言中,可以通过"&变量名"的形式来获取变量的地址值
// 重新创建一个非引用型变量(即使是把已有变量直接赋值给新变量)也会开辟新的内存地址
func main() {
a := 1
b := 2
fmt.Println(a) // 1
fmt.Println(&a) // 0xc00000a0c8
fmt.Println(b) // 2
fmt.Println(&b) // 0xc00000a0e0
a = 2
b = 1
fmt.Println(a) // 2
fmt.Println(&a) // 0xc00000a0c8
fmt.Println(b) // 1
fmt.Println(&b) // 0xc00000a0e0
// 引用
c := b // 可以理解为:将b变量中保存的值,复制一份到c变量的内存中去
fmt.Println(b, c) // 1 1 数值一样
fmt.Println(&b, &c) // 0xc00000a0e0 0xc00000a130 地址值不一样
// 修改其中一个,另一个不变,类似于python的深拷贝
b = 5
fmt.Println(b, c) // 5 1
fmt.Println(&b, &c) // 0xc00000a0e0 0xc00000a130
/* 指针变量
指针变量指向一个值的内存地址
使用 "&变量名" 返回值就是一个指针类型
使用 "var 变量名 *类型" 就是声明指针类型变量
声明指针不会开辟内存地址,只是准备要指向内存某个空间,而声明变量会开辟内存地址,准备存放内容,
所以指针类型变量都是把一个变量的地址赋值给指针变量
使用 "*指针" 能够获取内存地址中的值,所以 "*指针" 就和直接使用变量是相同的
应用指针可以实现多个地方操作同一个内存地址的值(在方法参数应用指针较多)
*/
// 创建变量
x := 32
var point *int
point = &x // 此时point与&x是相等的
fmt.Println(point) // 0xc00000a158
fmt.Printf("point的类型是: %T\n", point) // point的类型是: *int
fmt.Printf("&x的类型是: %T\n", &x) // &x的类型是: *int
*point = 45 // 等价于: x = 45
fmt.Println(*point, x) // 45 45
// 这里直接操作的是内存地址,直接将那一块地址中的值修改
// 空指针 <nil>
// 声明一个指针
var y *float64 // 这个时候不会开辟内存空间,如果不指向任何一个内存空间,即为空指针
fmt.Println(y) // <nil>
fmt.Println(y == nil) // true
fmt.Printf("y的类型是: %T\n", y) // y的类型是: *float64
// 定义变量,开辟内存空间
z := 21.6
y = &z // 将y指向了z所在的内存地址
// 操作指针
*y = 33.33
fmt.Println(*y, z) // 33.33 33.33
*&z = 44.44
fmt.Println(*y, z) // 44.44 44.44
}
go语言---指针
最新推荐文章于 2024-07-06 14:56:41 发布