go语言---指针

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

}
发布了22 篇原创文章 · 获赞 1 · 访问量 1873

猜你喜欢

转载自blog.csdn.net/weixin_42677653/article/details/105038470