GO 一文搞懂指针和地址值的区别 go语言中的指针和地址值,在使用上常常具有迷惑性,主要是其特殊的*、符号的使用,可能会让你摸不透,本文希望能讲清楚go语言的指针(pointer)和值(value) 。
这里先简单的对指针和地址值概念做一个定义:
这是因为go方法传递参数的方式导致的 , go方法函数传递参数传递的是一个拷贝,看看下面的程序会输出什么?
答案是8,而不是9,因为AddAge函数修改的是学生的一个备份,而不是原始的学生对象
如果你想正确的给学生年龄增加的话 , 函数传递的需要是这个值的指针,如下所示:
需要注意的是,这里我们的指针传递的仍然是一个拷贝,比如 , 如果你将s赋值给另外一个指针地址,不会影响原有的指针,这点可以自行实践下 。
那在使用go语言开发的时候,何时该用指针何时改用地址值呢?比如考虑以下场景:
简单原则: 当你不确定该使用哪种的时候,优先使用指针
如果考虑在数组、切片、map等复合对象中使用指针和值,比如:
很多开发者会认为b会更高效 , 但是被传递的都是一个切片的拷贝,切片本身就是一个引用,所以这里被传递的其实没有什么区别 。
对于指针和地址值的使用,大家需要牢记的一点就是go数据传递的不可变性,活学活用此特点,在无状态函数中此特性非常有用 。
golang-指针类型 tips: *号,可以指向指针类型内存地址上的值 , 号,可以获取值类型的内存地址
每一个变量都有内存地址,可以通过变量来操作内存地址中的值,即内存的大小
go语言中获取变量的内存地址方法:通过符号可以获取变量的地址
定义:普通变量存储的是对应类型的值 , 这些类型就叫值类型
变量b,在内存中的地址为:0x1040a124,在这个内存地址上存储的值为:156
定义:指针类型的变量存储的是?个地址 , 所以?叫指针类型或引?类型
b 是值类型 , 它指向的是内存地址上的值
a是指针类型,它指向的是b的内存地址
指针类型定义,语法: var 变量名 *类型
指针类型在定义完成后,默认为空地址,即空指针(nil)
在定义好指针变量后,可以通过***** 符号可以获取指针变量指向的变量
在这里的 *a 等价于 b,通过修改 *a ,最终修改的是值类型b的值
这里a,d是值类型,b,c是指针类型
d就相当于把a内存地址上值,在内存中从新开辟了一块空间存储 , d和a互不影响
b,c相当于指向了a的内存地址,当使用*号引用出内存地址上的变量上,修改值得,a的值也会跟着改变
C语言中什么叫野指针野指针指向一个已删除的对象或未申请访问受限内存区域的指针 。
与空指针不同go语言中有野指针吗,野指针无法通过简单地判断是否为 NULL避免go语言中有野指针吗,而只能通过养成良好的编程习惯来尽力减少 。对野指针进行操作很容易造成程序错误 。需对指针进行初始化 。野指针主要是因为这些疏忽而出现的删除或申请访问受限内存区域的指针 。
扩展资料
指针变量未初始化
任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气 。所以 , 指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存 。如果没有初始化,编译器会报错“ ‘point’ may be uninitializedin the function ” 。
指针释放后之后未置空
有时指针在free或delete后未赋值 NULL,便会使人以为是合法的 。别看free和delete的名字(尤其是delete) , 它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉 。此时指针指向的就是“垃圾”内存 。释放后的指针应立即将指针置为NULL,防止产生“野指针” 。
推荐阅读
- 真实赛车是谁开发的游戏,真实赛车有什么车
- 怎么用我的手机连接你,我的手机怎么能连接你
- 养成游戏物语,一个养成游戏叫什么物语
- c语言如何跳出一个函数 c语言中如何跳出函数
- pg库一般加什么索引,pg数据库建立索引
- 使命召唤射击游戏剪辑视频,使命召唤枪战视频
- 新手做抖音直播教学多久,自学抖音直播
- go语言实现注册功能 go语言创建项目
- redis微信模板推送,redis redistemplate