文章永久连接:https://tech.souyunku.com/?p=5308
我们前面学习过,每一个变量都有一个内存位置,每一个内存位置都可使用取址运算符(&) 来访问的地址,它表示了在内存中的一个地址。
Go 语言支持指针,但只支持指针的取址运算符(&) 和解址运算符(*),不支持指针的算术运算
因此 Go 语言中指针是很容易学习的,Go 语言中使用指针可以更简单的执行一些任务
下面的范例输出了变量 a 在内存中的地址
/**
* file: main.go
* author: 搜云库技术团队(tech.souyunku.com)
* Copyright © 2015-2065 tech.souyunku.com. All rights reserved.
*/
package main
import "fmt"
func main() {
var a int = 10
fmt.Printf("变量的地址: %x\n", &a )
}
编译运行以上 Go 语言范例,输出结果如下
$ go run main.go
变量的地址: c420014158
什么是指针
一个指针变量可以指向任何一个值的内存地址它指向那个值的内存地址
指针类似于变量和常量,在使用指针前需要声明指针
语法
声明一个指针的语法格式如下
var var_name *var-type
- var-type 为指针类型
- var_name 为指针变量名
*
号用于指定变量是作为一个指针
一个指针变量通常缩写为 ptr
下面这些都是有效的指针声明
var ip *int /* 指向整型*/
var fp *float32 /* 指向浮点型 */
这些指针都是指向 int 或 float32 的指针
如何使用指针
Go 语言中的指针不支持算术运算,只支持简单的赋值和取值操作
在指针类型前面加上 * 号(前缀)来获取指针所指向的内容
Go 语言指针使用流程如下
1、 定义指针变量
2、 为指针变量赋值
3、 访问指针变量中指向地址的值。
范例
/**
* file: main.go
* author: 搜云库技术团队(tech.souyunku.com)
* Copyright © 2015-2065 tech.souyunku.com. All rights reserved.
*/
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 )
}
编译运行以上 Go 语言范例,输出结果如下
$ go run main.go
a 变量的地址是: 20818a220
ip 变量储存的指针地址: 20818a220
*ip 变量的值: 20
Go 空指针
当一个指针被声明后又没有初始化(赋值)时,它的值为 nil
值为 nil 的指针也称为空指针
nil 在概念上和其它语言的 null、None、nil、NULL 一样,都指代零值或空值
范例
/**
* file: main.go
* author: 搜云库技术团队(tech.souyunku.com)
* Copyright © 2015-2065 tech.souyunku.com. All rights reserved.
*/
package main
import "fmt"
func main() {
var ptr *int
fmt.Printf("ptr 的值为 : %x\n", ptr )
}
编译运行以上 Go 语言范例,输出结果如下
$ go run main.go
ptr 的值为 : 0
判断是否为空指针
if(ptr != nil) /* ptr 不是空指针 */
if(ptr == nil) /* ptr 是空指针 */
Go 指针更多内容
下面这些内容是 Go 语言指针的应用范例
内容 | 描述 |
---|---|
Go 指针数组 | 你可以定义一个指针数组来存储地址 |
Go 指向指针的指针 | Go 支持指向指针的指针 |
Go 向函数传递指针参数 | 通过引用或地址传参,在函数调用时可以改变其值 |
干货推荐
附录:GOlang 教程:系列文章
- 一、Go 语言基础教程
- 二、Go 语言 – 简介
- 三、Go 语言环境配置
- 四、Go 语言结构
- 五、Go 语言基础语法
- 六、Go 语言数据类型
- 七、Go 语言变量
- 八、Go 语言常量
- 九、Go 语言运算符
- 十、Go 语言条件语句
- 十一、Go 语言循环语句
- 十二、Go 语言函数
- 十三、Go 语言 – 变量作用域
- 十四、Go 语言 – 数组
- 十五、Go 语言 – 字符串
- 【当前读到】十六、Go 语言 – 指针
- 十七、Go 语言 – 结构体
- 十八、Go 语言 – 数据类型 interface
- 十九、Go 语言 – 切片(slice)
- 二十、Go 语言 – 哈希表(map)
- 二十一、Go 语言 – range 关键字
- 二十二、Go 语言 – 关键字 delete
- 二十三、Go 语言递归函数
- 二十四、Go 语言 – 类型转换
- 二十五、Go 语言 – 错误处理
- 二十六、Go 语言 – 开发工具
- 二十七、Go 语言 for 循环语句
- 二十八、Go 语言 – 多维数组
- 二十九、Go 语言 break 语句
- 三十、Go 语言 – 指向指针的指针
- 三十一、Go 语言 – 指针作为函数参数
- 三十二、Go 语言 goto 语句
- 三十三、Go 语言 if 语句
- 三十四、Go 语言函数值传递调用
- 三十五、Go 语言 for 循环嵌套
- 三十六、Go 语言 – 向函数传递数组
- 三十七、Go 语言 – 函数 – 引用传值
- 三十八、Go 语言 select 语句
- 三十九、Go 语言 if…else 语句
- 四十、Go 语言 switch 语句
- 四十一、Go 语言 – 闭包函数
- 四十二、Go 语言指针数组
- 四十三、Go 语言 if 语句嵌套
- 四十四、Go 语言 – 函数作为值
- 四十五、Go 语言函数方法
- 四十六、Go 语言 continue 语句