Golang指针
学过C语言的老司机都知道,指针就是一个变量,用于存储另一个变量的内存地址。
那么什么是变量呢?在现代计算机体系结构中所有的需要执行的信息代码都需要存储在内存中,为了管理存储在内存的数据,内存是划分为不同的区域的,不同区域都用内存地址来标识。一个典型的内存地址是个16进制的8位数(一个字节)比如0xAFFFF(这是一个内存地址的十六进制表示)。
要访问数据,我们需要知道它的存储地址。我们可以跟踪存储与我们的程序相关的数据的所有内存地址。但是要记住这些内存地址,非常费劲,怎么办呢?
于是我们引入了变量的概念。变量只是给存储数据的内存地址的好记得别名。指针也是一个变量。但它是一种特殊的变量,因为它存储的数据不仅仅是一个普通的值,如简单的整数或字符串,而是另一个变量的内存地址。

在上面的图中,指针p包含变量a的地址值0x0001。
package main
import "fmt"
func main() {
var p *int
fmt.Println("p = ", p)
}
# Output
p = <nil>
指针声明
T类型的指针使用以下语法声明:
//类型T的指针
var p *T
类型T是指针指向的变量的类型。比如整型指针:
//类型为整型指针
var p *int
p指针只能保存int变量的内存地址。
指针的零值,不是0,而是nil。任何未初始化的指针值都为nil。我们直接撸一个代码:
package main
import "fmt"
func main() {
var p *int
fmt.Println("chongchong p = ", p)
}
#Output
chongchong p = <nil>
初始化指针
初始化一个指针,只需给他赋予其他变量的内存地址接口。变量的地址可以使用使用&运算符获得:
var x = 100
var p *int = &x
上面我们通过对x做&运算符来获取其地址,然后将该地址分配给指针p。
就像Golang中的其他变量一样,编译器也会推断指针变量的类型。所以你可以在上面的例子中省略指针p中的类型声明,直接简写为:
var p = &x
撸代码之例2 :
package main
import "fmt"
func main() {
var a = 3.1415926
var p = &a
fmt.Println("chongchong value a = ", a)
fmt.Println("chongchong Address a = ", &a)
fmt.Println("chongchong value p = ", p)
}
输出结果
chongchong value a = 3.1415926 chongchong Address a = 0Xc82000a330 chongchong value p = 0Xc82000a330
指针解引用
要获得指针指向地址的值,我们可以使用*运算符。这叫解引用。
package main
import "fmt"
func main() {
var a =
var p = &a
fmt.Println("chongchong a = ", a)
fmt.Println("chongchong p = ", p)
fmt.Println("chongchong *p = ", *p)
}
输出入下:
chongchong a = chongchong p = 0Xc82000a330 chongchong *p =
通过*运算符不仅能取值,还可以对指向变量值做修改。以下示例通过指针p设置存储在变量a中的值:
package main
import "fmt"
func main() {
var a =
var p = &a
fmt.Println("chongchong a = ", a)
*p +=
fmt.Println("chongchong a(altered)= ", a)
}
结果如下:
chongchong a =
chongchong a(altered)=
多重指针
指针可以指向任何类型的变量。所以也可以指向另一个指针。以下示例显示如何创建指向另一个指针的指针:
package main
import "fmt"
func main() {
var a = 3.141596
var p = &a
var pp = &p
fmt.Println("a = ", a)
fmt.Println("chong address a = ", &a)
fmt.Println("p = ", p)
fmt.Println("chongchong p = ", &p)
fmt.Println("pp = ", pp)
fmt.Println("chongchong *pp = ", *pp)
fmt.Println("chongchong **pp = ", **pp)
}
结果输出为
a = 3.1415926
chong address a = 0Xc82000a330
p = 0Xc82000a330
chongchong p = 0Xc820030020
pp = 0Xc820030020
chongchong *pp=0Xc82000a330
chongchong **pp = 3.1415926
Go中没有指针算术
老司机,都知道,可以在C/C ++中队指针做计算,但是golang就不支持那样做了。
package main
func main() {
var x =
var p = &x
var p1 = p + // Compiler Error: invalid operation
}
但是,golang中可以使用==运算符来比较两个相同类型的指针是否相等。
包主要
package main
import "fmt"
func main() {
var a =
var p1 = &a
var p2 = &a
if p1 == p2 {
fmt.Printf("chongchong p1(%x) = p2(%x) value(%d): \n",p1,p2,*p1)
}
}
结果为:
chongchong p1(c82000a330) = p2(c82000a330) value()
Golang指针的更多相关文章
- TODO:Golang指针使用注意事项
TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...
- Golang指针与unsafe
前言 我们知道在golang中是存在指针这个概念的.对于指针很多人有点忌惮(可能是因为之前学习过C语言),因为它会导致很多异常的问题.但是很多人学习之后发现,golang中的指针很简单,没有C那么复杂 ...
- Golang - 指针与引用
Golang有指针 , 那么一切数据都是值传递吗 ? 都需要用户进行指针传递吗, 其实不然, 对于Go语言, 虽然有指针, 但是其也有引用传递. 是不是很绕, 因为引用传递就是指针传递哇 . 我们 ...
- Golang指针基本介绍及使用案例
一.指针的相关概念说明 变量:是基本类型,变量存的就是值,也叫值类型 地址:用于引用计算机的内存地址,可理解为内存地址的标签,通俗一点讲就是一间房在小区里的门牌号.如下图① 指针:指针变量存的是一个地 ...
- golang 指针在struct里的应用
type aa struct { b *int c string } func main() { var data int = 0 var ip *int /* 声明指针变量 */ ip = & ...
- Golang 指针理解
目录 0x00 指针地址和指针类型 0x01 从指针获取指针指向的值 0x02 使用指针修改值 0x03 返回函数中局部变量 0x04 使用 new() 创建指针 0x05 flag包的指针技术 0x ...
- golang 指针类型学习
对于指针类型不安全编程,通过指针值以及偏移量操作slice私有属性 // 通过指针值获取切片 func TestGetPrivate(t *testing.T) { s := []int{1, 2, ...
- golang指针接收者和值接收者方法调用笔记
初学go时很多同学会把 值接收者 和 指针接收者 的方法相互调用搞混淆,好多同学都只记得指针类型可以调用值接收者方法和指针接收者方法,而值类型只能调用值接收者方法,其实不然,在某些情况下,值类型也是可 ...
- golang指针函数
func main() { a := models.SmsVerify{} a.Id = 100 fmt.Println(a.Id) // 100 test111(a) fmt.Println(a.I ...
随机推荐
- Aho-Corasick自动机
在模式匹配问题中,如果模板有很多个,KMP算法就不太适合了.因为每次查找一个模板.都要遍历整个文本串.可不可以只遍历一次文本串呢?可以,方法是把所有模板组成一个大的状态转移图(称为$Aho-Coras ...
- Kafka 完全分布式集群环境搭建
思路: 先在主机s1上安装配置,然后远程复制到其它两台主机s2.s3上, 并分别修改配置文件server.properties中的broker.id属性. 1. 搭建前准备 示例共三台主机,主机IP映 ...
- nodejs个人博客系统
说明:本人目前还是一名C#程程序,在公司干过一年的前端(ps切图,html+css,js),二年的后台C#(b/s,c/s)的开发.因为想转型所以学习了nodejs这门感觉非常棒的一门语言.于是写了一 ...
- runtime实践之Method Swizzling
利用 Objective-C 的 Runtime 特性,我们可以给语言做扩展,帮助解决项目开发中的一些设计和技术问题.这一篇,我们来探索一些利用 Objective-C Runtime 的黑色技巧.这 ...
- 洛谷 P2717 寒假作业
https://www.luogu.org/problemnew/show/P2717 $n \le 1004枚举区间,挨个计算,判断,时间复杂度$O(n^3)$. $n \le 5000$,预处理出 ...
- 【最大流】bzoj1711: [Usaco2007 Open]Dining吃饭
正在网络流入门(原来这种题用网络流做) Description 农夫JOHN为牛们做了很好的食品,但是牛吃饭很挑食. 每一头牛只喜欢吃一些食品和饮料而别的一概不吃.虽然他不一定能把所有牛喂饱,他还是想 ...
- spring boot yaml 自定义配置 映射到 java POJO
只需要一个注解就ok: @ConfigurationProperties("user.other") “user.other” 这个值匹配的是user下的other对象 yaml ...
- LeetCode之Weekly Contest 92
第一题:转置矩阵 问题: 给定一个矩阵 A, 返回 A 的转置矩阵. 矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引. 示例 1: 输入:[[1,2,3],[4,5,6],[7,8,9] ...
- 中移物联网onenet入门学习笔记2:中移物联的通信格式
中移物联网硬件接入协议:LWM2M协议,EDP协议,MQTT协议,HTTP协议,TCP透传,MODBUS协议,JT/T808协议,RCMP协议 8种通信协议的区别在哪? 详细比较 EDP:OneNET ...
- leetcode-11-dfs
DFS算法: explore(G, v) visited(v) = trueprevisit(v) for each edge(v, u) in E: if not visited(u): explo ...