golang 指针

说明

1,go语言中的指针不能进行偏移和运算

2,一个指针变量,可以指向任何一个值的内存地址,它指向那个值的内存地址,在 32 位机器上占用 4 个字节,在 64 位机器上占用 8 个字节,并且与它所指向的值的大小无关。

3,当一个指针被定义后没有分配到任何变量时,它的值为 nil。一个指针变量通常缩写为 ptr。

4,在go语言中,&:取地址,*:根据地址取值。

5,每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。

6,Go语言中的值类型(int、float、bool、string、array、struct)都有对应的指针类型,如:*int*int64*string等。

指针用法

指针用法,伪代码

ptr := &v    // v的类型为T

其中 v 代表被取地址的变量,被取地址的 v 使用 ptr 变量进行接收,

ptr 的类型就为*T,称做 T 的指针类型。*代表指针。

示例:

package main

import "fmt"

func main()  {
    var a int = 100
    var str string = "golang"
    fmt.Printf("&a = %p\n&str = %p", &a, &str)
    // &a = 0xc000074008
    // &str = 0xc00006c1c0
}

%p输出 cat 和 str 变量取地址后的指针值,指针值带有0x的十六进制前缀。

注意:变量、指针和地址三者的关系是:每个变量都拥有地址,指针的值就是地址。

从指针获取指针指向的值

在对普通变量使用&操作符取地址获得这个变量的指针后,可以对指针用*操作,也就是指针取值。

取地址操作符&和取值操作符*是一对互补操作符,&取出地址,*根据地址取出地址指向的值。

package main

import (
    "fmt"
)

func main() {

    // 准备一个字符串类型
    var house = "Malibu Point 10880, 90265"

    // 对字符串取地址, ptr类型为*string
    ptr := &house

    // 打印ptr的类型
    fmt.Printf("ptr type: %T\n", ptr)    // ptr type: *string

    // 打印ptr的指针地址,每次运行会出现不同的结果
    fmt.Printf("address: %p\n", ptr)    // address: 0xc00000e1e0

    // 对指针进行取值操作
    value := *ptr

    // 取值后的类型
    fmt.Printf("value type: %T\n", value)    // value type: string

    // 指针取值后就是指向变量的值
    fmt.Printf("value: %s\n", value)    // value: Malibu Point 10880, 90265

}

变量、指针地址、指针变量、取地址、取值的相互关系和特性如下:

  • 对变量进行取地址(&)操作,可以获得这个变量的指针变量。
  • 指针变量的值是指针地址。
  • 对指针变量进行取值(*)操作,可以获得指针变量指向的原变量的值。

指针修改值

指针不仅可以取值,也可以修改值。

package main

import "fmt"

// 交换函数
func swap(a, b *int) {

    // 取a指针的值, 赋给临时变量t
    t := *a

    // 取b指针的值, 赋给a指针指向的变量
    *a = *b

    // 将a指针的值赋给b指针指向的变量
    *b = t
}

func main() {

// 准备两个变量, 赋值1和2
    x, y := 1, 2

    // 交换变量值
    swap(&x, &y)

    // 输出变量值
    fmt.Println(x, y)    // 2 1
}

*操作符作为右值时,意义是取指针的值;作为左值时,也就是放在赋值操作符的左边时,表示 a 指向的变量。其实归纳起来,*操作符的根本意义就是操作指针指向的变量。当操作在右值时,就是取指向变量的值;当操作在左值时,就是将值设置给指向的变量。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值