开篇语

依稀记得大学必修课,C语言中的指针,简直是噩梦,指来指去,有没有晕乎乎的感觉,我在想是不是也因为如此,所以Java语言的开发者C才比C语言的多,Java正因为解决了C的痛点,所以今天才能变成语言排行榜占其首,Go作为后起之秀,又引入这么复杂难懂的概念,可见指针我们还是需要学习的,下面我们一起体验一下go的指针吧

指针的理解

我的理解指针(Point),一个变量指向内存中存储某个值的地址,那么这个变量是一个指针变量,个人是如此理解的,也就是说指针指的是地址,而不是值

百度百科的定义,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。

Go的指针

在Go中指针有两个概念,一个指针变量是可以指向任何一个值的内存地址,指针变量也是占用存储空间的,在32位系统中占用4个字节,在64位系统中占用8个字节,与这个地址存储的值的大小没有关系指针类型指针类型和指针变量一块出现,指的是这个指针变量的类型是什么,比如我们声明了一个temp int = 1 ,那么temp变量的这个类型是 int,同时指针变量也是有指针类型的,用 *T表示,T是type的意思,代表具体的类型,比如 pointTemp *int  = &temp, 代表 pointTemp这个变量是指针变量,类型是*int我们看下面一段代码

func PointStudy()  {   
// 每一个变量在运行时都有一个地址(这个地址存储着这个变量对应的值)  
var temp int = 1   
// go语言的取地址符, temp 变量,通过&符号来获取temp这个变量在内存中的地址,我们将获取到的地址赋值给一个指针变量 pointTemp ,类型*int   
var pointTemp *int= &temp
fmt.Println(temp)   
fmt.Println(pointTemp)
}
//输出结果
1
0xc00005a2d0

指针变量也是变量,变量、指针和地址三者的关系是:每一个变量都有自己地址,每一个指针的值就是地址(也就是这个指针通过fmt.Println输出后一个地址)

如何获取指针对应的地址的值,go语言中通过 &符号 获取变量地址,通过 * 来获取地址存储的值

func PointStudy()  {   
// 每一个变量在运行时都有一个地址(这个地址存储着这个变量对应的值)   
var temp int = 1   
// go语言获取地址符, temp 变量,通过&符号来获取temp这个变量在内存中的地址,我们将获取到的地址赋值给一个指针变量 pointTemp ,类型为 *int   
var pointTemp *int =temp   
fmt.Println(pointTemp)   
fmt.Println(*pointTemp)}
//输出结果0xc00005a2d01
// 思考一下这行代码输出什么
fmt.Println(*&temp)

值传递和指针传递

值传递和指针传递go语言函数调用时有两种传递方式一种是值传递

一种是值传递,看如下代码

func ValueTransmit(){  
temp := 1   
fmt.Println(";value transmit before:",temp)  
method1(temp)   
fmt.Println("value transmit after:",temp)
}
func method1(temp int)  {  
fmt.Println("method before:",temp)  
temp = 2   
fmt.Println("method after;",temp)
}
//结果
value transmit before: 1
method1 before: 1
method1 after 2
value transmit after: 1
//从上边代码可以看出值传递是一种copy的方式,temp从ValueTransmit传递到method1(),是把temp重新copy了一份,methd1中修改temp是不会影响ValueTransmit中的temp

一种是指针传递,看如下代码:

func PointTransmit(){   
var temp = 1  
fmt.Println("point transmit before:",temp)   
method2(&temp)  
fmt.Println("point transmit after",temp)
}
func method2(temp *int)  {  
fmt.Println("method2 before:",*temp)  
*temp = 2  
fmt.Println("method2 after:",*temp)
}
//结果
point transmit before: 1
method2 before: 1
method2 after 2
point transmit after: 2 //从上面的代码中可以看出指针传递后, 对指针所指向地址的值修改后,对其它方法是可见的

欢迎大家关注微信公众号:“技术人技术事”,更多精彩期待你的到来

![](https://img2018.cnblogs.com/blog/706455/201908/706455-20190821134036181-1278659291.jpg)

Go指针,如此轻松掌握,希望有收获的更多相关文章

  1. C语言指针详解

    前言 这不是我第一次写关于C指针的文章了,只是因为指针对于C来说太重要,而且随着自己编程经历越多,对指针的理解越多,因此有了本文. 为什么需要指针? 指针解决了一些编程中基本的问题. 第一,指针的使用 ...

  2. 【M28】智能指针

    1.什么是智能指针? 所谓智能指针就是,看起来,用起来,感觉起来都像原始指针,但是提供了更多功能. 2.使用智能指针取代原始指针,可以获得更多的控制权.如下: a.在构造和析构的时候,可以做一些事. ...

  3. 【三支火把】---C指针总结

    好久没写博客了,重新学习C语言了的基础课程,发现很多东西都忘记的差不多了,闲来无事,总结一下关于指针的知识,希望能帮到像我一样的菜鸟们: 指针,众所周知是C语言的精华所在,不懂指针的话,你就不要说你学 ...

  4. Delphi下使用指针的简单总结(指针的赋值,数组和指针的转换,函数指针的使用)

    由于最近公司太忙,好久没有更新我的BLOG了.原来想着写写关于HOOK驱动的文章,可是最后想想好久已经没有做驱动的东西了,怕写出来有错误,于是作罢.开发游戏也有一段时间了,发现使用DELPHI来开发网 ...

  5. Delphi下使用指针的简单总结

    由于最近公司太忙,好久没有更新我的BLOG了.原来想着写写关于HOOK驱动的文章,可是最后想想好久已经没有做驱动的东西了,怕写出来有错误,于是作罢.开发游戏也有一段时间了,发现使用DELPHI来开发网 ...

  6. C/C++心得-理解指针

    上一篇笔者用自己那不是怎么好理解的逻辑介绍了内存和C中的基本数据类型,现在笔者再根据自己重新所学来说说C语言中的指针. 理解指针才能真正的算C语言入门.也许是我大学期间太关注前端UE,也许是当初开始学 ...

  7. 【C_Language】---最全面的C指针总结,初级程序员必备

    好久没写博客了,重新学习C语言了的基础课程,发现很多东西都忘记的差不多了,闲来无事,总结一下关于指针的知识,希望能帮到像我一样的菜鸟们: 指针,众所周知是C语言的精华所在,不懂指针的话,你就不要说你学 ...

  8. Go合集,gRPC源码分析,算法合集

    年初时,朋友圈见到的最多的就是新的一年新的FlAG,年末时朋友圈最多的也是xxxx就要过去了,你的FLAG实现了吗? 这个公众号2016就已经创建了,但截至今年之前从来没发表过文章,现在想想以前很忙, ...

  9. MS17-010 漏洞研究——免考课题 20155104 赵文昊

    免考实验与研究--MS17-010漏洞研究 研究内容 ·MS17-010漏洞的来源 ·MS17-010漏洞的攻击实例 ·MS17-010漏洞原理分析 ·MS17-010代码分析 写在前面:这次对一个漏 ...

随机推荐

  1. redis 清除缓存

  2. iptables智能DNS

    1. echo 1 > /proc/sys/net/ipv4/ip_forward 2. 在NAT服务器上添加以下规则: 在PREROUTING链中添加目的地址转换规则: iptables -t ...

  3. BraveOS正式版发布,希望大家下载使用

    废话不多说,直接贴图才是王道 这里是DOS系统+默认官方(Platform系统) 下载地址:http://pan.baidu.com/s/1eQINwx8 (引导进Platform系统后,默认管理员帐 ...

  4. hihocoder 1272 买零食

    #1272 : 买零食 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho很喜欢在课间去小卖部买零食.然而不幸的是,这个学期他又有在一教的课,而一教的小卖部姐姐以冷若冰 ...

  5. iptables一个包过滤防火墙实例

    环境:redhat9 加载了string time等模块 eth0 接外网──ppp0 eth1 接内网──192.168.0.0/24 #!/bin/sh # modprobe ipt_MASQUE ...

  6. laravel post提交数据时显示异常

    post提交数据时候显示如下: The page has expired due to inactivity. Please refresh and try again 这是由于在laravel框架中 ...

  7. html(二)登陆页面

    今天开始正常上课学习HTML+CSS+JSP  嗯 前两个没讲直接上手! 老师也是很认同我们的呢~ 这是第一个案例 做一个登陆页面,并利用post提交表单 传值到另一个界面接收值. 1.设置值: &l ...

  8. java 多线程之synchronized wait/notify解决买票问题

    一.Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 就绪状态(Runnable):当调用线程对象的st ...

  9. 2018-3-31-C#-谁改了我的代码

    title author date CreateTime categories C# 谁改了我的代码 lindexi 2018-3-31 21:15:3 +0800 2018-2-13 17:23:3 ...

  10. linux初始化和关停

    如已提到的, 模块初始化函数注册模块提供的任何功能. 这些功能, 我们指的是新功能, 可以由应用程序存取的或者一整个驱动或者一个新软件抽象. 实际的初始化函数定义常常 如: static int   ...