指针

2022-02-05 GoLang 大约 2 分钟

# 什么是指针

一个指针变量指向了一个值的内存地址。

go语言中使用指针前你需要声明指针。指针声明格式如下:

var var_name *var-type

// 声明一个变量是ptr,类型为指针类型
var ptr *int
1
2
3
4
  • var-type 为指针类型

    *号用于指定变量是作为一个指针类型

  • var_name 为指针变量名

# 使用指针

指针使用流程:

  • 定义指针变量。
  • 为指针变量赋值。
  • 访问指针变量。
package main

import "fmt"

func main() {
	var age int = 18
	// &符号+变量 就可以获取这个变量内存的地址
	fmt.Println(&age)

	// 定义一个指针变量
	// var 表示声明一个变量
	// ptr 指针变量的名字
	// ptr 对应的类型是:*int 是一个指针类型,(可以理解为指向int类型的指针)
	var ptr *int = &age
	fmt.Println(ptr)
	fmt.Println("ptr本身这个存储空间的地址为:", &ptr)

	// 想获取ptr这个指针或者这个地址指向的那个数据
	fmt.Printf("ptr指向的数值为:%v", *ptr)
}

// 打印结果
// 0xc0000120a8
// 0xc0000120a8                              
// ptr本身这个存储空间的地址为: 0xc000006030
// ptr指向的数值为:18 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

相关信息

最重要的两个符号:

  • & 取内存地址
  • *根据地址取值

# 四个细节

  1. 可以通过指针改变变量的值。

    func main() {
    	var age int = 18
    	fmt.Println(age) // 18
    
    	var ptr *int = &age
    	*ptr = 20
    	fmt.Println(age) // 20
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
  2. 指针变量接收的一定是地址值。

    func main() {
    	var age int = 18
      // 如果把 & 符号去掉,则会编译错误
      // cannot use age (type int) as type *int in assignment
    	var ptr *int = age
    	*ptr = 20
    }
    
    1
    2
    3
    4
    5
    6
    7
  3. 指针变量的地址不可以匹配。

    func main() {
    	var age int = 18
    	// 此处如果把 *int 改为 *float 则会编译错误
      // cannot use &age (type *int) as type *float64 in assignment
    	var ptr *float64 = &age
    	*ptr = 20
    }
    
    1
    2
    3
    4
    5
    6
    7

    因为*float64意味着这个指针指向的是float32类型的数据,但是&age对应的是Int类型的。

  4. 基本数据类型(又叫值类型),都有对应的指针类型,形式为*数据类型。

    func main() {
    	var ptr1 *int
    	var ptr2 *string
    	var ptr3 *byte
      ...
    }
    
    1
    2
    3
    4
    5
    6
上次编辑于: 2023年7月4日 09:36