文章目录
指针
-
内存中的数据(获取变量的地址:&i)
对于基本数据类型来说,变量存的就是值,也叫值类型。获取变量的地址使用“&”,比如:
package main import "fmt" func main() { //基本数据类型在内存布局 var i int = 10 fmt.Println("i的地址=", &i) //&获取i的地址,类似于python的id() fmt.Println("i的值=", i) }
输出结果:
i的地址= 0xc0000aa008 i的值= 10
-
指针的定义(在数据类型前加*,例如:*int)
指针变量存的是一个地址,这个地址指向的空间存的才是值,比如:
var ptr *int = &num
package main import "fmt" func main() { //基本数据类型在内存布局 var i int = 10 /* var ptr *int = &i 1.ptr是一个指针变量 2.ptr的类型是*int 3.ptr本身的值是&i */ var ptr *int = &i fmt.Printf("ptr=%v\n", ptr) //ptr=0xc04204e080 fmt.Println("ptr的地址=", &ptr) //ptr的地址=0xc04206c020 }
-
获取指针类型所指向的值(*ptr,本质上有两步:首先获取ptr的值(xxx),再根据这个值(地址)获取到(xxx)指向的值)
通过*ptr取值
-
指针修改值(*ptr = 666)
package main import "fmt" func main() { //基本数据类型 var num int = 10 fmt.Printf("num的地址=%v 原始值=%v\n", &num, num) //num的地址=0xc00001e090 原始值=10 //指针 var ptr *int ptr = &num fmt.Printf("ptr的地址=%v 指向的值为=%v 自身=%v\n", &ptr, *ptr, ptr) //ptr的地址=0xc000012030 指向的值为=10 自身=0xc00001e090 //修改值 *ptr = 666 fmt.Printf("num修改后的值=%v\n", num) //num修改后的值=666 }
-
值类型和引用类型
-
值类型
- 值类型:有对应的指针类型,形式为”*数据类型 “比如int对应的指针就是”*int”,float32对应的指针类型就是”*float32″,以此类推
- 值类型的基本数据类型包括:int、float、bool、string、数组和结构体struct
- 值类型:变量直接存储值,内存通常在栈中分配
-
引用类型
引用类型的基本数据类型包括:指针、slice切片、map、管道、interface等
- 变量存储的一个地址,这个地址对应的空间才是真正存储数据(值),内存通常在堆上分配,当没有任何变量引用这个地址时,该地址对应的数据空间就成为一个垃圾空间,由GC来回收。
- 变量存储的一个地址,这个地址对应的空间才是真正存储数据(值),内存通常在堆上分配,当没有任何变量引用这个地址时,该地址对应的数据空间就成为一个垃圾空间,由GC来回收。
内存的栈区和堆区示意图如下:
-
结构体
数组
管道
函数
切片
接口
map
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/143958.html