12、Go 基础数据类型 - 指针

作者: 温新

分类: 【Go基础】

阅读: 501

时间: 2023-07-30 15:58:14

hi,我是温新

在 Go 语言的学习中,指针是必须要了解的。不要恐惧指针,一起来学习。

什么是指针

当一个变量被声明时,会在内存中分配一块空间,而数据就保存在这个空间中。好比变量是钥匙,分配的内存空间是门牌号(也就是地址),拿着钥匙找到对应的门牌号后就可以取出数据了。

用了大白话进行理解,那么什么是指针?指针是一个变量,其值是另一个变量的内存地址。简单的说,**指针 就是保存内存地址的特殊变量。**在 Go 语言中,通过 & 符号取出变量的内存地址。

package main

import "fmt"

func main() {
	name := "自如初"
	fmt.Printf("内存地址为 %p", &name) // 内存地址为 0xc00005e270
}

Go 中的指针

在 Go 语言中,指针有两个核心概念:

  • 1、类型指针:允许对该指针的类型进行修改。传递数据使用指针时,无需拷贝数据,只地址引用地址值。类型指针不进行便宜或运算;
  • 2、切片:由起始元素的原始指针、元素数量、容量组件。(目前暂不介绍,相关章节继续关系)。

**指针的含义:**创建地址引用,以后使用时根据地址获取值。

指针的 & 与 *

关于指针变量的声明与使用,一定要记住 &* 这两个符号,其含义如下:

  • &:取址符(也就是变量在内存中的地址,称为指针)。指针也是赋值;
  • *:指针值。用于返回一个指针变量的具体值。

指针的声明与使用

声明指针变量

指针变量类型的声明形式:var name *type

使用指针变量

package main

import "fmt"

func main() {
    var name *string
    // name = "meili" 赋值会报错
    fmt.Println(name)	// nil
}

赋值为什么会报错?指针变量是一个类型,而它存储的是内存地址,直接赋值会报错。

取址与使用

package main

import "fmt"

func main() {
    // 1、声明一个 string 类型变量
    name := "王美丽"
    fmt.Printf("name 的内存地址%p\n", &name) // 0xc000088240

    // 2、声明一个指针变量
    var p1 *string
    // 3、将变量 name 的内存地址赋值给变量 p1,
    p1 = &name
    fmt.Println("指针类型的地址", p1) // 0xc000088240

    // 使用 * 对地址取值
    fmt.Println("p1 的值是", *p1) // p1 的值是 王美丽

    // 4、通过指针修改 name 的值
    *p1 = "郝帅"
    // 5、输出结果
    fmt.Println("p1 修改后的值", *p1)	// 郝帅
    fmt.Println("name 的值", name)	// 郝帅
}

1、声明一个 string 类型的变量,其名为 name 并赋值为 王美丽,其内存地址为 0xc000088240

2、声明一个 string 类型的指针变量,其名为 p1,此时它的值为 nil;

3、使用 & 符号取出变量 name 的内存地址,赋值给字符串类型的指针变量 p1,此时,p1 存储的值是 0xc000088240

4、使用 * 根据内存地址获取到变量 name 的值,并将其修改为 郝帅;

5、*p1name 的值都是 郝帅,原因是 p1 的内存地址的值指向了变量name 的内存地址,因此修改会影响到变量 name,所以值也就一样了。

指针在函数中的应用

package main

import "fmt"

func main() {
    name := "王美丽"

    ChanveValue(&name)
    fmt.Println("我叫 ", name) // 我叫王美丽
}

func ChanveValue(name *string) {
    *name = "我美丽"
    fmt.Println("我叫", *name) // 我叫王美丽
}

通过指针,可以使用某个修改结果相互影响。

请登录后再评论