linuxea:go指针简述(11)


通常而言,在go中,元素赋值一个变量A后,A变量如果在赋值给另外一个变量B,相当于一次复制。对于底层内存地址来讲,对于二次赋值的变量B修改元素,是不会修改到A变量的值,这是因为变量B的内存地址以及发生改变,如果需要修改到变量A,A就需要使用指针调用来赋值给B,大致意思是A和B使用同一个内存地址。

认识指针

通常变量存储在内存空间,如下图

A存储在2,而后赋值B=A

此刻,设置B赋值3,那么赋值是否对A有影响

package main
import "fmt"
func main(){
    A := 2
    B := A
    B = 3
    fmt.Printf("A:%d B:%d",A,B)
}

运行

[root@marksugar /opt/Golang]# go run zhizhen.go
A:2 B:3

上述A是2,B是3,说明赋值给B的3是没有影响到A的值,B是单独的一个值,如下:

如果我一定要通过赋值修改A的值,就可以使用指针来进行修改。

如上述中。假如,A赋值的2存储在内存中的地址编号是0DSA6W3,此刻要修改就需要使用A存储的的内存地址进行修改。如下:

定义指针

使用&符号取变量地址,而这个类型也是*int,这个类型就是指针类型。

!!! 如果是一个字符串就是*string,如果是bool就是*bool,如果是浮点数就是*float64.

我们定义一个C的指针

var C *int

简短声明

    A := 2
    B := A
    B = 3
    fmt.Printf("A:%d B:%d\n",A,B)

    C := &A
    fmt.Printf("%T",C)

运行

[root@marksugar /opt/Golang]# go run zhizhen.go 
A:2 B:3
*int

获取指针值

如果要获取指针的值就需要使用*变量。如:\*c

A := 2
C := &A
fmt.Printf("%T %p",C,*C)
[root@marksugar /opt/Golang]# go run zhizhen.go 
A:2 B:3
*int 2

修改指针值

    A := 2
    C := &A
    *C = 666
    fmt.Print(*C)
[root@marksugar /opt/Golang]# go run zhizhen.go
666

golang中的指针没有复杂的运算,相对来讲是安全的。

指针的应用

使用指针

package main
import "fmt"
func main(){
    var name string
    var age int
    var height float64
    fmt.Print("请输入你的名字: ")
    fmt.Scan(&name)
    fmt.Print("请输入你的年龄: ")
    fmt.Scan(&age)
    fmt.Print("请输入你的身高: ")
    fmt.Scan(&height)
    fmt.Printf("你输入的是名字是: [%s]\n输入的年龄是: [%d]\n输入的身高是: [%f]",name,age,height)
}

运行后输入:

[root@marksugar /opt/Golang]# go run zhizhen2.go 
请输入你的名字: mark
请输入你的年龄: 18
请输入你的身高: 1.7
你输入的是名字是: [mark]
输入的年龄是: [18]
输入的身高是: [1.700000]

现在你必须按照类型输入。

!!! Warning

指针的空值是nil
0 分享

您可以选择一种方式赞助本站

支付宝扫码赞助

支付宝扫码赞助

日期: 2019-10-15分类: Golang

标签: Golang

发表评论