美文网首页
golang 指针

golang 指针

作者: 中华虎 | 来源:发表于2018-08-12 19:51 被阅读0次

package main

import "fmt"

//============================================

//指针基本概念

//指针:就是地址,指向内存地址空间,这个地址往往是在内存中存储的另一个变量的值的起始位置

//指针变量:即存储地址的变量

//go指针特点

//1,默认值:nil

//2,&取变量地址

//3,*取目标对象的值

//4,直接用.来访问成员

/*func main() {

//代码段01-解释&,*号的应用

var num = 100  //声明int 类型num

fmt.Printf("&a=%p\n", &num) //输出:&a=0xc042050080

//代码段02-声明指针类型

var p *int=nil

p=&num

fmt.Printf("a=%d,*p=%d\n",num,*p)//输出:a=100,*p=100,此处将指针地址赋值给p,用*p访问对象依旧指向同一个值

//代码段03

*p=123 //此处直接通过指针修改了对象的值,因为p和a此时指向的对象是同一个,所以a的值也变了

fmt.Printf("a=%d,*p=%d\n",num,*p)//输出:a=123,*p=123

}*/

//============================================================

//new(T)表达式关于指针的应用

//1,new(T)创建的对象为堆内存上,作用就是创建T类型的匿名变量为该类型变量开辟一块内存空间,然后将这块空间的内存地址作为结果返回。*T

//2,开辟的内存空间的值就是该变量类型的默认值如:new(int)则默认值为0,如果new(bool)则默认值为false

/*func main() {

var obj *int              //创建int类型的指针

obj = new(int)            //让*obj指针指向int变量

fmt.Println("*obj=", *obj) //*obj= 0

//demo2---演示bool,其他数据类型自行测试

var obj2 *bool

obj2 = new(bool)

fmt.Println("*obj2", *obj2)

//直接修改指针对象的值

*obj2 = true

fmt.Println("*obj2", *obj2)

//注释:我们使用new函数无需担心其内存的生命周期或怎样将其销毁删除,go语言的内存管理系统会帮我们大理一切

}*/

//==================================================

//指针做函数参数

//

/*func main() {

var a, b = 10, 99

test(a, b)//输出:a=10,b=99 值类型传参[值类型传参本质是将变量的值copy一份作为参数传给函数]

fmt.Printf("a=%d,b=%d\n", a, b)

test2(&a, &b)//输出:&a=99,&b=10 指针传参[指针类型传参本质就是将指向具体内存空间地址当作参数传递,形参通过*直接访问变量的值,函数内部堆形参的操作就是在操作内存空中间的变量值]

fmt.Printf("&a=%d,&b=%d\n", a, b)

}

func test(a, b int) {

a, b = b, a

}

func test2(a, b *int) {

*a, *b = *b, *a

}*/

//==================指针常见错误使用方式====================

//空指针和野指针

func main() {

//1,空指针:即未被初始化的指针

  var obj *int

  //fmt.Println("*p", *obj) //输出:invalid memory address or nil pointer dereference,无效地址,即没有可指向的内存空间

//空指针解决方案

  obj=new(int)

fmt.Println("*p",*obj)

//2,野指针:即指向未知的内存地址空间

//var p *int

//*p = 0x042058080//未知空间

//fmt.Println("*p",*p)

}

//相关拓展知识块================栈帧==============

//1:用来给函数提供内存空间,取内存于stack上

//2:函数调用时产生栈帧,函数调用结束释放栈帧

//3:栈帧的存储:1,局部变量2,形参(两者地位等同)3,内存字段描述值

相关文章

  • Golang基础(三)——复杂类型

    Golang基础(三)——复杂类型 @([07] golang)[Go总结] [TOC] 指针 定义 指针变量可以...

  • 后端研发体系

    记录自己为了面试发现的文章 golang golang中都是值传递,没有引用传递,哪怕是指针,也是指针的值拷贝。 ...

  • golang指针

    关于指针,我的理解是这样的,它指向一个内存的地址,也就是某个类型在内存中存放的地方。 定义一个指针 var d *...

  • golang 指针

    在Go语言中,有几种东西可以代表“指针”。  1. uintptr类型:该类型实际上是一个数值类型,也是Go语言内...

  • golang 指针

    1.Golang提供了指针用于操作数据内存,并通过引用来修改变量。只声明未赋值的变量,golang都会自动为其初始...

  • golang 指针

    package main import "fmt" //=============================...

  • Golang:指针

    什么是指针? 指针是存储另一个变量的内存地址的变量。 在上面的例子中,变量 b 的值是 156,存储在地址为 0x...

  • golang指针

    1.需要函数返回指针return里面是地址,函数定义部分为返回指针,引用时再加指针

  • golang指针

    指针 Go有指针,但没有指针运算。通过类型作为前缀来定义一个指针’*’: var p *int。现在 p 是一个指...

  • Golang 指针

    指针 区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针。Go语言当中的指针涉及到三个点:指...

网友评论

      本文标题:golang 指针

      本文链接:https://www.haomeiwen.com/subject/fxjddxtx.html