博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang 指针实践
阅读量:5890 次
发布时间:2019-06-19

本文共 2072 字,大约阅读时间需要 6 分钟。

package mainimport "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,内存字段描述值复制代码

转载于:https://juejin.im/post/5b701e84f265da282c39ac4d

你可能感兴趣的文章
The Z-Index CSS Property: A Comprehensive Look | Smashing Coding
查看>>
Java中HashMap详解
查看>>
Office版本差别引发的语法问题
查看>>
Apache——访问控制
查看>>
web前端(10)—— 浮动,清除默认样式
查看>>
ggplot2 aes函数map到data笔记
查看>>
3450: Tyvj1952 Easy
查看>>
delphi基本语法
查看>>
java中的Static class
查看>>
删除重复节点
查看>>
.net请求Webservice简单实现天气预报功能
查看>>
Loj #3056. 「HNOI2019」多边形
查看>>
【3】数据库的表设计和初始化
查看>>
Django rest framework的基本用法
查看>>
正则表达式匹配非需要匹配的字符串(标题自己都绕晕了)
查看>>
沙盒目录介绍
查看>>
260. Single Number III
查看>>
c#基础--字符串的处理_string类
查看>>
crossplatform---Nodejs in Visual Studio Code 10.IISNode
查看>>
CentOS 配置 ROR 环境
查看>>