基本介绍
区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针。
Go语言中的函数传参都是值拷贝,当我们想要修改某个变量的时候,我们可以创建一个指向该变量地址的指针变量。传递数据使用指针,而无须拷贝数据。类型指针不能进行偏移和运算。Go语言中的指针操作非常简单,只需要记住两个符号:&(取地址)和*(根据地址取值)。
指针地址
每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。Go语言中使用&字符放在变量前面对变量进行“取地址”操作。 Go语言中的值类型(int、float、bool、string、array、struct)都有对应的指针类型,如:*int、*int64、*string等。
比如:var i int,获取num的地址:&i.
package main
import "fmt"
func main(){
var i int = 10
// i的地址
fmt.Println("i的地址 =",&i)
}
基本数据类型在内存中的布局。
指针类型
指针变量存的是一个地址,这个地址指向的空间存的才是值。
package main
import "fmt"
func main(){
//基本数据类型在内存布局
var i int = 10
// i的地址
fmt.Println("i的地址 =",&i)
//ptr是一个指针变量
//ptr的类型是 *int
//ptr本身的值&i
var ptr *int = &i
fmt.Printf("ptr =%v\n",ptr)
}
运行结果:
内存布局图:
指针取值
在对普通变量使用&操作符取地址后会获得这个变量的指针,然后可以对指针使用*操作,也就是指针取值,代码如下。
package main
import "fmt"
func main(){
//指针取值
a := 10
//取变量a的地址,将指针保存到b中
ptr := &a
fmt.Printf("type of ptr: %T\n",ptr)
//指针取值(根据指针去内存取值)
c := *ptr
fmt.Printf("type of c:%T\n",c)
fmt.Printf("type of c:%v\n",c)
}
运行结果:
指针使用细节
- 值类型,都有对应的指针类型,形式为*数据累次那个,比如int的对应指针就是 * int,依次类推。
- 值类型包括:基本数据类型 int系列,float系列,bool,string,数组和结构体struct。
转载:https://blog.csdn.net/weixin_44736475/article/details/113920011
查看评论