1 指针相关概念指针核心概念 - 指针不能进行偏移和运算,是安全指针。
- 切片,由指向起始元素的原始指针、元素数量和容量组成。
我们都知道Java有堆内存和栈内存,堆内存里是实际的对象,栈内存中的变量指向了对象,这里的指向,其实就是指针了。那么指向的是什么?有没有人曾经思考过这个问题,在内存中,如何快速的寻找一个值? 答案自然是地址,只有用地址访问是最快的
要学习Go语言中的指针需要先知道3个概念:指针地址、指针类型和指针取值。 2 Go语言中的指针Go语言中的函数传参都是值拷贝,当我们想要修改某个变量的时候,我们可以创建一个指向该变量地址的指针变量。传递数据使用指针,而无须拷贝数据。类型指针不能进行偏移和运算。Go语言中的指针操作非常简单,只需要记住两个符号:& (取地址)和* (根据地址取值)。
2.1 指针地址和指针类型每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。Go语言中使用& 字符放在变量前面对变量进行“取地址”操作。 Go语言中的值类型(int 、float 、bool 、string 、array 、struct )都有对应的指针类型,如:*int 、*int64 、*string 等。
- v:代表被取地址的变量,类型为T
- ptr:用于接收地址的变量,ptr的类型就为*T,称做T的指针类型。*代表指针
2.2 举例如下func main() {
a := 10
b := &a
fmt.Printf("a:%d ptr:%p\n", a, &a)
fmt.Printf("b:%p type:%T\n", b, b)
fmt.Println(&b)
}
复制
1 2 3 4 5 6 7
b := &a的图示说明如下: 3 指针取值在对普通变量使用& 操作符取地址后会获得这个变量的指针,然后可以对指针使用* 操作,也就是指针取值,代码如下。
func main() {
a := 10
b := &a
fmt.Printf("type of b:%T\n", b)
c := *b
fmt.Printf("type of c:%T\n", c)
fmt.Printf("value of c:%v\n", c)
}
复制
1 2 3 4 5 6 7 8 9 如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。 当定义一个指向指针的指针变量时,第一个指针存放第二个指针的地址,第二个指针存放变量的地址:
举例如下: var a int
var ptr *int
var pptr **int
a = 3000
ptr = &a
pptr = &ptr
fmt.Printf("变量 a = %d\n", a)
fmt.Printf("指针ptr= %v\n", ptr)
fmt.Printf("取指针变量ptr的值 *ptr= %d\n", *ptr)
fmt.Printf("指向指针的指针变量 **pptr = %d\n", **pptr)
fmt.Printf("变量的内存地址 a = %v\n", ptr)
fmt.Printf("指针ptr取的内存地址为 &ptr = %v\n", &ptr)
fmt.Printf("第一个指针变量的内存地址 *ptr = %v\n", pptr)
复制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|