Go语言【第十篇】:Go数据结构之:指针
Go语言指针
Go语言中指针是很容易学习的,Go语言中使用指针可以更简单的执行一些任务。我们都知道变量是一种使用方便的占位符,用于引用计算机内存地址。Go语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址,以下实例演示了变量在内存中地址:
package main
imoprt "fmt"
func main() {
var a int = 10
fmt.Printf("变量的地址:%x\n", &a)
}
以上实例执行的结果为:
变量的地址: 20818a220
什么是指针
一个指针变量指向了一个值的内存地址,类似于变量和常量,在使用指针前需要声明指针。指针声明格式如下:
var var_name *var-type
var-type为指针类型,var_name为指针变量,*用于指定变量是作为一个指针,以下是有效的指针声明:
var ip *int /* 指向整形 */
var fp *float32 /* 指向浮点型 */
如何使用指针
- 定义指针变量;
- 为指针变量赋值;
- 访问指针变量中指向地址的值;
在指针类型前面加上*号(前缀)来获取指针所指向的内容。
package main
import "fmt"
func main() {
var a int= 20 /* 声明实际变量 */
var ip *int /* 声明指针变量 */
ip = &a /* 指针变量的存储地址 */
fmt.Printf("a 变量的地址是: %x\n", &a )
/* 指针变量的存储地址 */
fmt.Printf("ip 变量储存的指针地址: %x\n", ip )
/* 使用指针访问值 */
fmt.Printf("*ip 变量的值: %d\n", *ip )
}
以上实例输出结果为:
a 变量的地址是: 20818a220
ip 变量储存的指针地址: 20818a220
*ip 变量的值: 20
Go空指针
当一个指针被定义后没有分配到任何变量时,它的值为nil。nil指针也称为空指针,nil在概念上和其他语言的null、None、nil、NULL一样,都指代零值或空值。一个指针变量通常缩写为ptr,如下实例代码所示:
package main
func main() {
var ptr *int
fmt.Printf("ptr 的值为 : %x\n", ptr )
}
以上实例输出结果为:
ptr 的值为 : 0
空指针判断:
if(ptr != nil) /* ptr 不是空指针 */
if(ptr == nil) /* ptr 是空指针 */
Go指针更多内容
接下来我们将介绍Go语言中更多的指针应用:
内容 | 描述 |
---|---|
Go指针数组 | 可以定义一个指针数组来存储地址 |
Go指向指针的指针 | Go支持指向指针的指针 |
Go向函数传递指针参数 | 通过引用或地址传参,在函数调用时可以改变其值 |
Go语言指针数组
在我们了解指针数组前,先看个实例,定义了长度为3的整形数组:
package main
import "fmt"
const MAX int = 3
func main() {
a := []int{10, 100, 200}
var i int
for i = 0; i < MAX; i++ {
fmt.Printf("a[%d] = %d\n", i, a[i])
}
}
以上代码执行输出结果为:
a[0] = 10
a[1] = 100
a[2] = 200
有一种情况,我们可能需要保存数组,这样我们就需要使用到指针,以下声明了整形指针数组:
vat ptr [MAX]*int
ptr为整形指针数组,英雌每个元素都指向了一个值,以下实例的三个整数将存储在指针数组中:
package main
import "fmt"
const MAX int = 3
func main() {
a := []int{10, 100, 200}
var i int
var ptr [MAX]*int
for i = 0; i < MAX; i++ {
ptr[i] = &a[i] /* 整数地址赋值给指针数组 */
}
for i = 0; i < MAX; i++ {
fmt.Printf("a[%d] = %d\n", i, *ptr[i])
}
}
以上代码输出结果为:
a[0] = 10
a[1] = 100
a[2] = 200
Go语言指向指针的指针
如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量;当定义一个指向指针的指针变量时,第一个指针存放第二个指针的地址,第二个指针存放变量的地址;如下图所示:
指向指针的指针变量声明格式如下:
var ptr **int
访问指向指针的指针变量值需要使用两个*号,如下所示:
package main
import "fmt"
func main() {
var a int
var ptr *int
var pptr **int
a = 3000
/* 指针ptr地址 */
ptr = &a
/* 指向指针ptr地址 */
pptr = &ptr
/* 获取pptr的值 * /
fmt.Printf("变量 a = %d\n", a)
fmt.Printf("指针变量 *ptr = %d\n", *ptr)
fmt.Printf("指向指针的指针变量 **pptr = %d\n", **pptr)
}
以上实例执行结果为:
变量 a = 3000
指针变量 *ptr = 3000
指向指针的指针变量 **pptr = 3000
Go语言指针作为函数参数
Go语言允许函数传递指针,只需要在函数定义的参数上设置为指针类型即可,以下实例演示了如何向函数传递指针,并在函数调用后修改函数内的值:
package main
import "fmt"
func main() {
/* 定义局部变量 */
var a int = 100
var b int= 200
fmt.Printf("交换前 a 的值 : %d\n", a )
fmt.Printf("交换前 b 的值 : %d\n", b )
/* 调用函数用于交换值
* &a 指向 a 变量的地址
* &b 指向 b 变量的地址
*/
swap(&a, &b);
fmt.Printf("交换后 a 的值 : %d\n", a )
fmt.Printf("交换后 b 的值 : %d\n", b )
}
func swap(x *int, y *int) {
var temp int
temp = *x /* 保存 x 地址的值 */
*x = *y /* 将 y 赋值给 x */
*y = temp /* 将 temp 赋值给 y */
}
以上实例运行结果为:
交换前 a 的值 : 100
交换前 b 的值 : 200
交换后 a 的值 : 200
交换后 b 的值 : 100
Go语言【第十篇】:Go数据结构之:指针的更多相关文章
- Python开发【第二十篇】:缓存
Python开发[第二十篇]:缓存redis&Memcache 点击这里 Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy ...
- Spring Cloud第十篇 | 分布式配置中心Config
本文是Spring Cloud专栏的第十篇文章,了解前九篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Clo ...
- Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇)
Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇) 目录 Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇) 1 Optimizing Storage Layout f ...
- 解剖SQLSERVER 第十篇 OrcaMDF Studio 发布+ 特性重温(译)
解剖SQLSERVER 第十篇 OrcaMDF Studio 发布+ 特性重温(译) http://improve.dk/orcamdf-studio-release-feature-recap/ ...
- 第十篇 SQL Server代理使用代理帐户
本篇文章是SQL Server代理系列的第十篇,详细内容请参考原文 在这一系列的上一篇,你查看了msdb库下用于授权访问SQL Server代理的安全角色.这些角色包括SQLAgentUserRole ...
- 第十篇 Replication:故障排除
本篇文章是SQL Server Replication系列的第十篇,详细内容请参考原文. 复制故障排除是一项艰巨的任务.在任何复制设置中,都涉及到很多移动部件,而可用的工具并不总是很容易识别问题.Th ...
- 第十篇 Integration Services:高级事件行为
本篇文章是Integration Services系列的第十篇,详细内容请参考原文. 简介在前一篇, we introduced fault tolerance by examining method ...
- 第十篇 SQL Server安全行级安全
本篇文章是SQL Server安全系列的第十篇,详细内容请参考原文. 不像一些其他industrial-strength数据库服务,SQL Server缺乏一个内置保护个别数据记录的机制,称为行级安全 ...
- shell基础二十篇 一些笔记
shell基础二十篇 转自 http://bbs.chinaunix.net/thread-452942-1-1.html 研讨:Bash 内建命令 read (read命令更具体的说明见博客收藏的一 ...
- [老老实实学WCF] 第十篇 消息通信模式(下) 双工
老老实实学WCF 第十篇 消息通信模式(下) 双工 在前一篇的学习中,我们了解了单向和请求/应答这两种消息通信模式.我们知道可以通过配置操作协定的IsOneWay属性来改变模式.在这一篇中我们来研究双 ...
随机推荐
- 广州Uber优步司机奖励政策(12月21日到12月27日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- elasticsearch集群整合elqsticsearch-sql插件
1.本来整合这个插件是比较简单易操作的,但是由于公司从AWS下载禁掉了,给安装带来一些麻烦, 采用离线安装,先FQ将elasticsearch-sql-5.1.2.0.zip下载下来: ./bin/e ...
- springBoot RabbitMq 转换json序列化
package com.alirm.redis_cache.config.RabbitMQ; import org.springframework.amqp.rabbit.core.RabbitTem ...
- cyclone4驱动LM75A温湿度传感器学习
1. LM75A第一次使用,I2C接口,8脚 2. 打开quartus工程,下面只要是看看代码结构,问题在于多个always语句,逻辑上不太好分清楚,主要看状态机 module I2C_READ( c ...
- 关于 Windows 10 字体安装目录的问题
不知从什么时候开始,本人台式机的Win10系统在安装字体的时候并不是安装到C:\Windows\Fonts目录中,而是安装到%USERPROFILE%\AppData\Local\Microsoft\ ...
- java对于Redis中jedis的操作
package com.answer.redis; import java.util.HashMap; import java.util.List; import java.util.Map; imp ...
- unity share current game screen
using UnityEngine; using System.Collections; using UnityEngine.UI; using System.IO; public class Tak ...
- Entity Framework Core 选择数据表的外键
entityTypeBuilder .HasOne<GeraeteArt>() .WithMany(p => p.Geraete) .HasForeignKey(b => b. ...
- hdu2199Can you solve this equation?(解方程+二分)
Can you solve this equation? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- 【转】巫师3:狂猎(The Witcher 3: Wild Hunt )的游戏事件工作流
转自腾讯游戏开发者平台(GAD) CDPROJEKT RED的主程序.Piotr Tomsinski 在GDC2016的最后一天18号,CDPROJEKT RED的主程Piotr Tomsinski, ...