定义

所谓指针其实你可以把它想像成一个箭头,这个箭头指向(存储)一个变量的地址

因为这个箭头本身也需要变量来存储,所以也叫做指针变量。

Go的指针不支持那些乱七八糟的指针移位它就表示一个变量的地址。看看这个例子:

package main
import (
"fmt"
)
func main() {
var x int
var x_ptr *int
x =
x_ptr = &x
fmt.Println(x)
fmt.Println(x_ptr)
fmt.Println(*x_ptr)
}

上面例子输出x的值x的地址通过指针变量输出x的值,而x_ptr就是一个指针变量

0xc084000038

认真理清楚这两个符号的意思。

取一个变量的地址

取一个指针变量所指向的地址的值

考你一下,上面的例子中,如何输出x_ptr的地址呢?

package main
import (
"fmt"
)
func main() {
var x int
var x_ptr *int
x =
x_ptr = &x
fmt.Println(&x_ptr)
}

此例看懂,指针就懂了。

永远记住一句话,所谓指针就是一个指向(存储)特定变量地址的变量。没有其他的特别之处。

再变态一下,看看这个:

package main
import (
"fmt"
)
func main() {
var x int
var x_ptr *int
x =
x_ptr = &x
fmt.Println(*&x_ptr)
}
  1. x_ptr 是一个指针变量,它指向(存储)x的地址
  2. &x_ptr 是取这个指针变量x_ptr的地址,这里可以设想有另一个指针变量x_ptr_ptr(指向)存储这个x_ptr指针的地址
  3. &x_ptr 等价于`x_ptr_ptr就是取这个x_ptr_ptr指针变量指向(存储)地址所对应的变量的值,也就是x_ptr的值,也就是指针变量x_ptr指向(存储)的地址,也就是x的地址。 这里可以看到,其实*&`这两个运算符在一起就相互抵消作用了。

用途

指针的一大用途就是可以将变量的指针作为实参传递给函数,从而在函数内部能够直接修改实参所指向的变量值。

Go的变量传递都是值传递。

package main
import (
"fmt"
)
func change(x int) {
x =
}
func main() {
var x int =
fmt.Println(x)
change(x)
fmt.Println(x)
}

上面的例子输出结果为


很显然,change函数改变的仅仅是内部变量x,而不会改变传递进去的实参。其实,也就是说Go的函数一般关心的是输出结果,而输入参数就相当于信使跑到函数门口大叫,你们这个参数是什么值,那个是什么值,然后就跑了。你函数根本就不能修改它的值。不过如果是传递的实参是指针变量,那么函数一看,小子这次你地址我都知道了,哪里跑。那么就是下面的例子:

package main
import (
"fmt"
)
func change(x *int) {
*x =
}
func main() {
var x int =
fmt.Println(x)
change(&x)
fmt.Println(x)
}

上面的例子中,change函数的虚参为整型指针变量,所以在main中调用的时候传递的是x的地址。然后在change里面使用*x=200修改了这个x的地址的值。所以x的值就变了。这个输出是:


new

new这个函数挺神奇,因为它的用处太多了。这里还可以通过new来初始化一个指针。上面说过指针指向(存储)的是一个变量的地址,但是指针本身也需要地址存储。先看个例子:

package main
import (
"fmt"
)
func set_value(x_ptr *int) {
*x_ptr =
}
func main() {
x_ptr := new(int)
set_value(x_ptr)
//x_ptr指向的地址
fmt.Println(x_ptr)
//x_ptr本身的地址
fmt.Println(&x_ptr)
//x_ptr指向的地址值
fmt.Println(*x_ptr)
}

上面我们定义了一个x_ptr变量,然后用new申请了一个存储整型数据的内存地址,然后将这个地址赋值x_ptr指针变量,也就是说x_ptr指向(存储)的是一个可以存储整型数据的地址,然后用set_value函数将这个地址中存储的值赋值为100。所以第一个输出是x_ptr指向的地址,第二个则是x_ptr本身的地址,而*x_ptr则是x_ptr指向的地址中存储的整型数据的值

0xc084000040
0xc084000038

小结

好了,现在用个例子再来回顾一下指针。

交换两个变量的值。

package main
import (
"fmt"
)
func swap(x, y *int) {
*x, *y = *y, *x
}
func main() {
x_val :=
y_val :=
swap(&x_val, &y_val)
fmt.Println(x_val)
fmt.Println(y_val)
}

很简单吧,这里利用了Go提供的交叉赋值的功能,另外由于是使用了指针作为参数,所以在swap函数内,x_val和y_val的值就被交换了。


												

最新文章

  1. Servlet学习一
  2. OC第二节 —— NSString和NSMutableString
  3. TypeHandler的简单实例
  4. Notification封装(没做从网络下载)
  5. Spring总结_04_容器和bean
  6. 初写Python
  7. Node.js/Vue环境搭配安装
  8. python实现编写windows服务
  9. Layui treeGrid
  10. VMwear安装Centos7超详细过程
  11. shell test条件判断
  12. Mysql select语句设置默认值
  13. Markdown 轻量级标记语言
  14. 关于Unity中FPS第一人称射击类游戏制作(专题十)
  15. 每天一个linux命令:pwd命令
  16. mysql bin-logrow模式,base64转正常sql
  17. 大数据入门第二天——基础部分之zookeeper(上)
  18. vc 找到一个或多个多重定义的符号
  19. ref:Manual SQL injection discovery tips
  20. Java中split的用法

热门文章

  1. 第08组 Beta冲刺(2/4)
  2. R3300L按reset键无法进入USB Burning模式的问题分析
  3. Feign进行文件上传+表单调用
  4. layui中的table中toolbar自定义过程
  5. ocketMQ概念模型
  6. leetcode 968. Binary Tree Cameras
  7. IDEA强制清除Maven缓存
  8. 【APM】Pinpoint 监控告警(三)
  9. DataTable 数字排序问题
  10. Nginx - 根据IP分配不同的访问后端