侧边栏壁纸
博主头像
秋码记录

一个游离于山间之上的Java爱好者 | A Java lover living in the mountains

  • 累计撰写 137 篇文章
  • 累计创建 297 个标签
  • 累计创建 45 个分类

Go 语言中的指针(Let's Go 九)

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

说到指针,想必很多人会谈虎色变吧,在c/c++语言中那晦涩难懂的指针,曾几何时,让人望而却步!

虽说,指针操作效率是相当的快,可一旦把握不好,就会造成可怕的错误。

c/c++语言不同的是,在Go中是不允许进行指针运算的。

1、声明指针

类型 *T 是指向 T 类型值的指针。其默认值为 nil

var name *type
var p *int

其实,每个变量在运行时,在内存都有属于自己的内存地址,而这个地址就是代表着变量在内存的位置。

c/c++语言一样,要想获取变量在内存的地址,只需在变量前面加个&即可。

func main() {
    v := "https://qiucode.cn"
    ptr := &v
}

其中,&v表示取变量v的内存地址,而变量 v 的内存地址又赋值给变量ptr,此时变量ptr类型为*string,称作string的指针类型,*代表指针。

package main

import "fmt"

func main() {

    var age int = 4

    v := "https://qiucode.cn"
    ptr := &v

    fmt.Printf("%p %p", &age, ptr)
}
  • 指针的值是带有0x十六进制前缀的一组数据。

img

2、获取指针指向的值

当我们使用&操作符对普通变量取地址,在得到变量的指针后,接着使用*操作符对普通变量进行取值,也就是指针取值

package main

import "fmt"

func main() {
    // 准备一个字符串类型
    var webSite = "https://qiucode.cn"
    // 对字符串取地址, ptr类型为*string
    ptr := &webSite
    // 打印ptr的类型
    fmt.Printf("ptr 的类型: %T\n", ptr)
    // 打印ptr的指针地址
    fmt.Printf("ptr 指针地址: %p\n", ptr)
    // 对指针进行取值操作
    value := *ptr
    // 取值后的类型
    fmt.Printf("value 类型: %T\n", value)
    // 指针取值后就是指向变量的值
    fmt.Printf("value 指向变量的值: %s\n", value)
}

img

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

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

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

3、指针修改值

指针不仅可以取值,还可以修改值

package main

import "fmt"

// 交换函数
func swap(a, b *string) {
    // 取a指针的值, 赋给临时变量t
    t := *a
    // 取b指针的值, 赋给a指针指向的变量
    *a = *b
    // 将a指针的值赋给b指针指向的变量
    *b = t
}
func main() {
    // 准备两个变量, 赋值1和2
    siteName, webSite := "秋码记录", "https://qiucode.cn"
    // 交换变量值
    swap(&siteName, &webSite)
    // 输出变量值
    fmt.Println(siteName, webSite)
}

img

代码说明如下:

  • 第 6 行,定义一个交换函数,参数为 a、b,类型都为*string 指针类型
  • 第 8 行,取指针 a的值,并把值赋给变量 t,t 此时是 string 类型。
  • 第 10 行,取 b 的指针值,赋给指针 a 指向的变量。注意,此时*a的意思不是取 a 指针的值,而是 a 指向的变量
  • 第 12 行,将t 的值赋给指针 b 指向的变量
  • 第 16 行,准备 siteNamewebSite 两个变量,分别赋值为 秋码记录https://qiucode.cn,类型为 string
  • 第 18 行,取出 siteNamewebSite地址作为参数传给 swap() 函数进行调用。
  • 第 20 行,交换完毕时,输出 siteNamewebSite 的值。

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

Go 语言中的关键字与标识符(Let's Go 八)
« 上一篇 2022-09-24
Go 语言中的类型定义与类型别名(Let's Go 十)
下一篇 » 2022-09-25

相关推荐