关于Golang语言的指针与内存讲解
- 基本数据类型,变量存的就是值,也叫值类型
- 获取变量的地址,用&,比如:
var num int
,获取num的地址:&num
1
2
3
4
5
6
7
8
9
10package main
import "fmt"
func main() {
// 基本数据类型在内存布局
var num int = 1
// num 的地址是什么, &num
fmt.Println("num的地址=", &num)
}
基本数据类型在内存的布局:
- 指针类型,指针变量存的是一个地址,这个地址指向的空间存的才是值
- 比如:
var ptr *int = &num
举例说明:指针在内存的布局1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16package main
import "fmt"
func main() {
// 基本数据类型在内存布局
var num int = 1
// num 的地址是什么, &num
fmt.Println("num的地址=", &num)
// 下面的 var ptr *int = &num
// 1. ptr是一个指针变量
// 2. ptr的类型 *int
// 3. ptr本身的值&num
var ptr *int = &num
fmt.Printf("prt=%v", ptr)
}
指针类型在内存的布局:
注意: ptr此时也是有地址的,
0xc00000a0a8
不过是ptr指针所指向的地址
获取指针类型所指向的值
使用:*
,比如:var ptr *int
,使用*ptr
获取ptr
指向的值1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18package main
import "fmt"
func main() {
// 基本数据类型在内存布局
var num int = 1
// num 的地址是什么, &num
fmt.Println("num的地址=", &num)
// 下面的 var ptr *int = &num
// 1. ptr是一个指针变量
// 2. ptr的类型 *int
// 3. ptr本身的值&num
var ptr *int = &num
fmt.Printf("prt=%v\n", ptr)
fmt.Printf("ptr的地址=%v\n", &ptr)
fmt.Printf("ptr指向的值 =%v", *ptr)
}
关于指针的一些知识点举例
不能使用非地址形式的变量定义指针1
2
3
4
5func main() {
var a int = 300
var ptr *int = a
fmt.Println(ptr)
}
类型不匹配1
2
3
4
5func main() {
var a int = 300
var ptr *float32 = &a
fmt.Println(ptr)
}
指针转换1
2
3
4
5
6
7
8
9func main() {
var a int = 300
var b int = 400
var ptr *int = &a
*ptr = 100
ptr = &b
*ptr = 200
fmt.Printf("a=%d, b=%d, *ptr=%d", a,b,*ptr)
}
a=100, b=200, *ptr=200
指针的使用细节
- 值类型,都有对应的指针类型,形式为
*
数据类型,比如int
的对应的指针就是*int
,float32
对应的指针类型就是*float32
,依次类推。 - 值类型包括:基本数据类型
int
系列,float
系列,bool
,string
、数组和结构体struct