学过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指针的更多相关文章

  1. TODO:Golang指针使用注意事项

    TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...

  2. Golang指针与unsafe

    前言 我们知道在golang中是存在指针这个概念的.对于指针很多人有点忌惮(可能是因为之前学习过C语言),因为它会导致很多异常的问题.但是很多人学习之后发现,golang中的指针很简单,没有C那么复杂 ...

  3. Golang - 指针与引用

    ​ Golang有指针 , 那么一切数据都是值传递吗 ? 都需要用户进行指针传递吗, 其实不然, 对于Go语言, 虽然有指针, 但是其也有引用传递. 是不是很绕, 因为引用传递就是指针传递哇 . 我们 ...

  4. Golang指针基本介绍及使用案例

    一.指针的相关概念说明 变量:是基本类型,变量存的就是值,也叫值类型 地址:用于引用计算机的内存地址,可理解为内存地址的标签,通俗一点讲就是一间房在小区里的门牌号.如下图① 指针:指针变量存的是一个地 ...

  5. golang 指针在struct里的应用

    type aa struct { b *int c string } func main() { var data int = 0 var ip *int /* 声明指针变量 */ ip = & ...

  6. Golang 指针理解

    目录 0x00 指针地址和指针类型 0x01 从指针获取指针指向的值 0x02 使用指针修改值 0x03 返回函数中局部变量 0x04 使用 new() 创建指针 0x05 flag包的指针技术 0x ...

  7. golang 指针类型学习

    对于指针类型不安全编程,通过指针值以及偏移量操作slice私有属性 // 通过指针值获取切片 func TestGetPrivate(t *testing.T) { s := []int{1, 2, ...

  8. golang指针接收者和值接收者方法调用笔记

    初学go时很多同学会把 值接收者 和 指针接收者 的方法相互调用搞混淆,好多同学都只记得指针类型可以调用值接收者方法和指针接收者方法,而值类型只能调用值接收者方法,其实不然,在某些情况下,值类型也是可 ...

  9. golang指针函数

    func main() { a := models.SmsVerify{} a.Id = 100 fmt.Println(a.Id) // 100 test111(a) fmt.Println(a.I ...

随机推荐

  1. [Tracking] KCF + KalmanFilter目标跟踪

    基于KCF和MobileNet V2以及KalmanFilter的摄像头监测系统 简介 这是一次作业.Tracking这一块落后Detection很多年了,一般认为Detection做好了,那么只要能 ...

  2. 毛毛虫组【Beta】Scrum Meeting 1

    第一天 日期:2019/6/23 前言 第一次会议: 时间:6月20日 地点:教9-C404机房 内容:此次会议主要确定组内成员具体分工,并对目标进行了初步的确定. 1.1 今日完成任务情况以及遇到的 ...

  3. VMware9虚拟机安装MAC OS X Mountain Lion 10.8.2详细图文教程

    VMware虚拟机安装Mac OS X Mountain Lion 10.8.2所需文件:1.Vmware 9.01版下载:点击进入2.Vmware 9.01版汉化文件:点击进入3.VMware Wo ...

  4. java利用SuffixFileFilter统计目录下特定后缀名文件的数目

    /** * 文件处理类 * @author zhangcd * @date 2017年1月3日 */ public class FileUtil { /** * 得到所有后缀的数目 * * @para ...

  5. 01_5_Struts_ActionMethod_DMI_动态方法调用

    01_5_Struts_ActionMethod_DMI_动态方法调用 1. ActionMethod_DMI_动态方法调用 Action执行的时候并不一定要执行execute()方法 可以在配置文件 ...

  6. 关于C与C++的区别

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...

  7. 02Vs2013常用路径配置

    1.设置头文件路径 项目 -> xxx属性页 -> 配置属性 -> C/C++ -> 常规 -> 附加包含目录. 2.包含 x.lib 库路径 项目 -> xxx属 ...

  8. jCarousel,jQuery下的滚动切换传送插件

    转自:http://www.zhangxinxu.com/jq/jcarousel_zh/#Examples 介绍 jCarousel是一款 jQuery 插件, 用来控制水平或垂直排列的列表项. 这 ...

  9. jquery图片切换插件jquery.cycle.js参数详解

    转自:国人的力量 blog.163.com/xz551@126/blog/static/821257972012101541835491/ 自从使用了jquery.cycle.js,我觉得再也不用自己 ...

  10. 嵌入式入门学习笔记3:[转]编译linux

    摘自:https://blog.csdn.net/baidu_24256693/article/details/80115354 编译Linux是什么意思? Linux内核是Linux操作系统的核心, ...