版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/boyun58/article/details/88852163
Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址
什么是指针
一个指针变量指向了一个值的内存地址。
声明格式
var var_name *var-type
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 变量储存的指针地址: c0000100a0
ip 变量储存的指针地址: c0000100a0
ip的值是20
Go 空指针
当一个指针被定义后没有分配到任何变量时,它的值为 nil。
nil 指针也称为空指针。
nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。
package main
import "fmt"
func main(){
var ptr *int
fmt.Printf("ptr 的 值为:%x\n", ptr)
}
-------------------------------------------
ptr 的 值为:0
Go 语言指针数组
package main
import "fmt"
const MAX int = 3
func main(){
a := []int{100, 200, 300}
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] = 100
a[1] = 200
a[2] = 300
Go 语言指向指针的指针
如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。
当定义一个指向指针的指针变量时,第一个指针存放第二个指针的地址,第二个指针存放变量的地址
放大图片
package main
import "fmt"
func main(){
var a int
var ptr *int
var pptr **int
a = 3000
ptr = &a
pptr = &ptr
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)
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 = *y
*y = temp
}
-------------------------------------------------
交换前 a 的值100
交换前 b 的值200
交换后 a 的值200
交换后 b 的值100