golang-指针类型

tips: *号,可以指向指针类型内存地址上的值,&号,可以获取值类型的内存地址

变量和内存地址

每一个变量都有内存地址,可以通过变量来操作内存地址中的值,即内存的大小

go语言中获取变量的内存地址方法:通过&符号可以获取变量的地址

var a int32
a = 100
fmt.Printf(“%d\n”, a)     //变量的值
fmt.Printf(“%p\n”, &a)	 //变量的内存地址

数据类型

值类型

定义:普通变量存储的是对应类型的值,这些类型就叫值类型

var b int32
b = 156
fmt.Printf(“%d\n”, b)
fmt.Printf(“%p\n”, &b)

变量b,在内存中的地址为:0x1040a124,在这个内存地址上存储的值为:156

指针类型(引用类型)

定义:指针类型的变量存储的是⼀个地址,所以⼜叫指针类型或引⽤类型

var b int32
b = 156
var a *int32
a = &b

b 是值类型,它指向的是内存地址上的值

a是指针类型,它指向的是b的内存地址

指针类型的定义

指针类型定义,语法: var 变量名 *类型

 b := 255
 var a *int = &b
 fmt.Printf("Type of a is %T\n", a)
 fmt.Println("address of b is", a)

指针类型在定义完成后,默认为空地址,即空指针(nil)

操作指针类型变量

在定义好指针变量后,可以通过***** 符号可以获取指针变量指向的变量

 b := 255
 a := &b
 fmt.Println("address of b is", a)
 fmt.Println("value of b is", *a)
 *a++
 fmt.Println("new value of b is", b)

在这里的 *a 等价于 b,通过修改 *a ,最终修改的是值类型b的值

之前学过的切片是引用类型

内存的分配

make⽤来分配引⽤类型的内存,⽐如 map、slice以及channel

new⽤来分配除引⽤类型的所有其他类型的内存,⽐如 int、数组等

值类型和指针类型的拷贝

值类型的拷贝是深度拷贝,会将给拷贝的值创建一个新的内存空间,存储值

指针类型的拷贝是浅拷贝,拷贝后的值,指向的内存地址和原值的内存地址一样,修改其中一个值,这个内存地址上的值都会改变

 var a int = 100
 var b *int = &a
 var c *int = b
 var d int = a
 *c = 200

这里a,d是值类型,b,c是指针类型

d就相当于把a内存地址上值,在内存中从新开辟了一块空间存储,d和a互不影响

b,c相当于指向了a的内存地址,当使用*号引用出内存地址上的变量上,修改值得,a的值也会跟着改变

posted @ 2020-10-10 16:59  S小胖S  阅读(642)  评论(0编辑  收藏  举报