学过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. wxWidgets:处理wxEVT

    我们仍然以继承于wxFrame的MyFrame作为例子. MyFrame.h: class MyFrame : public wxFrame { ...... private: ...... void ...

  2. 关于"动态语言" "静态语言" "静态类型语言" "动态类型语言"的区别

    参考链接:关于“编译型”“解释型”“动态语言”“静态语言”“动态类型语言”“静态类型语言”的区分以及优缺点(汇总整理) 很多人把这两类混为一谈,但是这是完全不同的两个概念!!! 动态和静态语言主要看的 ...

  3. Python 消息框的处理

    在实际系统中,在完成某些操作时会弹出对话框来提示,主要分为"警告消息框","确认消息框","提示消息对话"三种类型的对话框. 1.警告消息框 ...

  4. 函数的扩展——箭头函数this的使用

    箭头函数中的this指向的是定义时的this,而不是执行时的的this . 举例: 案例中,我们的obj对象中有一个属性x和一个属性show( )方法,show( )通过this打印出x的值,结果是u ...

  5. Yii2应用的运行过程

    每一个框架都有一个入口脚本,Yii2也不例外.一般来说,对于Web应用的入口脚本是YiiBasePath/frontend/web目录下的index.php. 先观察这个文件: <?php de ...

  6. 字节跳动后端开发实习生面试(Python)

    一面: 1.自我介绍. 2.介绍“工大小美”项目相关. 3.Python中的GIL(全局解释器锁),以及哪种情况下使用python的多线程性能有较大的提升. 4.项目中用到了SQLite数据库,如果有 ...

  7. phpstorm 工具使用技巧(持续补充中。。。)

    phpstorm 工具使用技巧(持续补充中...) 一.phpstorm大小写切换 1.选择要转换的目标字符串: //普通商家,普通折扣默认值'COMMON_DISCOUNT'=>10.00, ...

  8. 怎么删除服务中的mysql服务

    可以进WINDOWS的管理里查看MYSQL的服务,把它停止或以DOS下用命令停止1.如果要卸载MYSQL执行下面命令:DOS下>mysqld -remove mysql2.启动MYSQL: DO ...

  9. python日记整理

    都是自己的学习总结,要是总结的有问题大佬麻烦评价一下我好修改,谢谢 python插件插件+pycharm基本用法+markdown文本编写+jupyter notebook的基本操作汇总 一.计算机基 ...

  10. vijos--繁华的都市

    描述 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉路口之间最多有一条道路 ...