开发者学堂课程【GO 语言核心编程-基础语法、数组、切片、Map:指针及其内存布局】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/625/detail/9536
指针及其内存布局
内容介绍:
一、基本介绍
二、案例演示
一、基本介绍
(1)基本数据类型,变量存的就是值,也叫值类型
(2)获取变量的地址,用&,如:var num int ,获取 num 的地址&num
新建文件夹 pointerdemo,在该文件夹下新建一个文件 main.go
package main
import (
"fmt"
)
//演示 golang 中指针类型
func main() {
//基本数据类型在内存的布局
var i int = 10
// i 的地址是什么,
fmt.Println("i的地址=",&i)
//即可输出变量 i 的地址
}
输出结果:
i的地址=0xc04204e080
示意图(基本数据类型在内存的布局):
变量 i 代表一个值,而这个值又储存在内存空间 a 内,这一内存空间有其特定的地址0xc04204e080,该空间的地址即i变量的地址,就像一个人住了一个房间,而这个房间会对应一个门牌号,则门牌号对应的地址即这个人的地址。
(3)指针类型,指针变量存的是一个地址,这个地址指向的空间存的才是值
举例说明指针的内存布局:
如:var ptr *int = &num(因为*的存在,表示ptr是指针名称,它指向int,若没有*,ptr则是一个整数)
package main
import (
"fmt"
)
//演示 golang 中指针类型
func main() {
var i int = 10
var ptr *int = &i
//var ptr *int = &i的含义:
①ptr 是一个指针变量
②ptr 的类型*int,即指针 ptr 指向 int
③ptr 本身的值是&i
fmt.Println("i的地址=",&i)
fmt.Printf("ptr=%v\n", ptr)
fmt.Printf("ptr的地址=%v", &ptr)
}
输出结果:
i 的地址=0xc04204e080
ptr= 0xc04204e080
ptr 的地址= 0xc04206c020
ptr 指针内存分布示意图:
指针变量 ptr 会指向一个内存空间 b,该内存空间有其特定地址0xc04206c020,即ptr本身的地址,而内存空间 b 内储存的地址0xc04204e080真正指向内存空间 a。
(4)获取指针类型所指向的值,
使用:*,如var *ptr int,使用*ptr 获取 ptr 指向的值
package main
import (
"fmt"
)
//演示 golang 中指针类型
func main() {
var i int = 10
var ptr *int = &i
fmt.Println("i的地址=",&i)
fmt.Printf("ptr=%v\n", ptr)
fmt.Printf("ptr指向的值=%v", *ptr)
}
输出结果:
i 的地址=0xc04204e080
ptr= 0xc04204e080
ptr 的地址= 0xc04206c020
ptr 指向的值=10
*ptr提示计算机先取出该指针的值/地址,再用*取出该指针指向的值
二、案例演示
画出代码对应的指针布局示意图(自己练习)
①var num int = 1
指针内存布局示意图:
②var i = 999
var ptr *int = &i
指针内存布局示意图: