go指针

181 阅读2分钟

指针

c和c++(71年),go也有指针,指针完成直接内存操作。 第五代编程语言不具有指针。 go对指针应用很少,只保留了一部分。 指针就是地址,指针变量存储地址

var a int = 10
var g *int = &a
fmt.Println(*g)

&a:取地址 *p: 解引用,间接获取值

内存分布

以32位为例,最大4G空间 高位地址3G-4G为系统占有,为内核区kernel 内核功能 进程管理,内存管理,文件系统,设备驱动和网络应用 从小向大地址依次是 .text 代码段 .rodata 只读数据区 (常量) .data 数据段,初始化完成的全局变量 (变量) .bss 未初始化数据区 heap 堆 make new存储在堆 共享数据区 stack 栈

栈帧 用来给函数运行提供内存空间,区内存于stack上 当函数调用时,产生栈帧,函数调用结束,释放栈帧 栈帧存储:1.局部变量 2.形参(形参和局部变量形式相同) 3.内存字段描述值 main函数分配一个栈帧,第一个栈帧 栈基指针 栈顶指针 在上一个函数记录原始栈基指针和栈顶指针

func test1(m int) {
    var b int = 100
    b += m
}

func main(){
    test(5)
}

##空指针和野指针 默认值是nil &取地址, 访问目标 不使用->,直接用

指针使用注意: 空指针:未被初始化的指针 野指针:被一片无效的地址空间初始化

new: 在heap上申请一片内存空间 返回申请空间的首地址 var g *int = new(int) 默认类型的默认值 fmt.Println("%q\n", *s) 打印go语言格式字符串 变量存储 左值:对应变量指向内存空间 (写) 右值:对应变量空间存储内容 (读)

stack大小默认是1M,最大是8M 由操作系统释放,及时产生,及时回收

heap默认1G,编程认为无限 c:malloc,free c++:构造函数和析构函数 java有垃圾回收机制(gc) go 不使用将指针置为nil

指针传引用 指针传地址(引用):将形参地址值作为函数参数或返回值 传值(数据值):将实参值拷贝一份给形参 传引用:在A栈帧内部,修改B栈帧中的变量值