Go_023_指针类型

2023-05-15  本文已影响0人  为宇绸缪

指针的基本使用

计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用 4 个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。

我们将内存中字节的编号称为地址(Address)或指针(Pointer)。地址从 0 开始依次增加,对于 32 位环境,程序能够使用的内存为 4GB,最小的地址为 0,最大的地址为 0XFFFFFFFF。

数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量

Go语言中使用对于指针存在两种操作: 取址取值。(Go语言中的指针只有两个操作权限)

符号 名称 作用
&变量 取址符 返回变量所在的地址
*指针变量 取值符 返回指针指地址存储的值
package main

import "fmt"

func main() {
    // &变量:获取变量地址
    var x = 10
    fmt.Printf("重新赋值之前x的对应地址: %p\n", &x)
    x = 100
    fmt.Printf("重新赋值之后x的对应地址: %p\n", &x)
}

/*
赋值之前x的对应地址: 0xc000122008
赋值之后x的对应地址: 0xc000122008
*/

指针变量用来接收地址的值。指针类型存储地址值

var p *int  // p 是一个整型指针类型
p = &x
fmt.Println(p)

取地址操作、地址赋值、取值操作

package main

import (
    "fmt"
    "reflect"
)

func main() {
    // (1) 获取地址:&变量
    // &变量:获取变量地址
    var x = 10
    fmt.Printf("赋值之前x的对应地址: %p\n", &x)
    x = 100
    fmt.Printf("赋值之后x的对应地址: %p\n", &x)

    // (2) 地址赋值: 指针类型或地址类型
    // 可以写成 var p = &x,但刚开始的时候不建议这么写
    var p *int // p 是一个整型指针类型
    p = &x
    fmt.Println(p)

    
    // (3) 取值操作:*指针变量
    // *p就是拿到地址当中的数据,与原有的数据类型一致,不是什么地址类型
    fmt.Println(*p, reflect.TypeOf(*p))
    *p = 101
    fmt.Println(x)
}
上一篇下一篇

猜你喜欢

热点阅读