【GO语言学习 基础篇】07 指针和地址

源代码

go语言基础


这还是蛮重要的知识点,带不带星号有啥区别?这里还涉及到结构体的知识,建议和下一章节一起食用!!!

指针和地址

每个变量都有地址,在学习 c 语言的时候讲过,在新建一个变量的时候,
内存中会开辟一个新的空间用于储存数据,这个空间有个地址。
当然也不是所有的语言在新建的时候就开辟空间,有的是没有数据,不开辟空间。

指针改变原始值的值,就好像顺着网线找到你家里。

还有一些用法,比如指针传参,指针数组之类的,请自行探索。

  • 指针

    package main
    
    import "fmt"
    
    func pointer() {
        /*
                指针不能指向一个具体的值
                    var a int
                    a = 123
                    // b是一个地址值
                    var b *int
                    b = a  这样是不行的
                    // & 代表了取a的地址
                    b = &a 这个时候 b指向了a的地址
                    // *b 根据地址找到值
                    *b = 999  这个时候 a = 999
        */
        // 通过自定义普通变量获取指针
        x := "go"
        // 获取地址
        ptr := &x
        fmt.Println("x=", x)
        fmt.Println("ptr=", ptr)
        fmt.Println("&x=", &x)
        fmt.Println("*ptr=", *ptr)
        fmt.Println("---------------------------------")
    
        // new是先创建好指针并分配内存,再写入指针的值
        ptr2 := new(string)
        *ptr2 = "c"
        fmt.Println(ptr2)
        fmt.Println(*ptr2)
    
        // 先声明一个指针变量,再从其他变量获取内存地址指针变量
        x2 := 1
        var p *int = &x2 // *int 因为 x2 是int类型的
        fmt.Println(p)
        fmt.Println(*p)
    
        // & 可以通过变量获取该变量的地址
        // * 赋在值的左边(*p) 指该指针指向的变量(p是变量地址)
    }
    
    func pointerType() {
        myStr := "go"
        myInt := 1
        myBool := false
        myFloat := 3.2
        fmt.Printf("type of &myStr is:%T\n", &myStr)
        fmt.Printf("type of &myInt is:%T\n", &myInt)
        fmt.Printf("type of &myBool is:%T\n", &myBool)
        fmt.Printf("type of &myFloat is:%T\n", &myFloat)
    }
    
    func zeroPointer() {
        x := "go"
        var ptr *string
        fmt.Println("ptr is ", ptr)
        // 声明但是没有初始化
        ptr = &x
        fmt.Println("ptr is ", ptr)
    
    }
    
    func changeByPointer(value *int) {
        // value是地址 *value是值
        *value = 200
    }
    
    func test01() {
        x3 := 99
        p3 := &x3
        fmt.Println("执行changeByPointer函数之前*p3是", *p3)
        fmt.Println("执行changeByPointer函数之前p3是", p3)
        changeByPointer(p3)
        fmt.Println("执行changeByPointer函数之后*p3是", *p3)
        fmt.Println("执行changeByPointer函数之后p3是", p3)
    }
    
    func changeSlice(value []int) {
        // 这里是传递的值进来
        value[0] = 200
    }
    
    func changeArray(value *[3]int) {
        // 这里是传递的地址
        (*value)[1] = 200
    }
    
    func test02() {
        x4 := [3]int{10, 20, 30}
        changeSlice(x4[:])
        fmt.Println(x4)
        changeArray(&x4)
        fmt.Println(x4)
    }
    
    func main() {
        // go语言中不支持指针运算
        pointer()
        fmt.Println("---------------------------------")
        pointerType()
        fmt.Println("---------------------------------")
        zeroPointer()
        fmt.Println("---------------------------------")
        test01()
        fmt.Println("---------------------------------")
        test02()
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值