zl程序教程

您现在的位置是:首页 >  后端

当前栏目

golang 指针总结(与C/C++区别不大,就是不可以p+1偏移)

C++Golang 总结 区别 可以 指针 就是 偏移
2023-09-14 09:13:27 时间

注意

老司机,都知道,可以在C/C ++中队指针做计算,但是golang就不支持那样做了。

package main

func main() {
    var x = 67
    var p = &x
    var p1 = p + 1 // Compiler Error: invalid operation
}

但是,golang中可以使用==运算符来比较两个相同类型的指针是否相等。

包主要

package main

import "fmt"
func main() {
    var a = 3014
    var p1 = &a
    var p2 = &a
    if p1 == p2 {
        fmt.Printf("chongchong p1(%x) = p2(%x) value(%d): \n",p1,p2,*p1)
    }
}

认识指针地址和指针类型

package main

import (
    "fmt"
)

func main() {
    var cat int = 1
    var str string = "banana"
    fmt.Printf("%p %p", &cat, &str)
}

运行结果:

0xc042052088 0xc0420461b0

代码说明如下:

  • 第 8 行,声明整型变量 cat。
  • 第 9 行,声明字符串变量 str。
  • 第 10 行,使用 fmt.Printf 的动词%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的指针地址
    fmt.Printf("address: %p\n", ptr)

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

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

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

}

运行结果:

ptr type: *string
address: 0xc0420401b0
value type: string
value: Malibu Point 10880, 90265

代码说明如下:

  • 第 10 行,准备一个字符串并赋值。
  • 第 13 行,对字符串取地址,将指针保存到变量 ptr 中。
  • 第 16 行,打印变量 ptr 的类型,其类型为 *string。
  • 第 19 行,打印 ptr 的指针地址,地址每次运行都会发生变化。
  • 第 22 行,对 ptr 指针变量进行取值操作,变量 value 的类型为 string。
  • 第 25 行,打印取值后 value 的类型。
  • 第 28 行,打印 value 的值。

使用指针修改值

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

代码说明如下:

  • 第 6 行,定义一个交换函数,参数为 a、b,类型都为 *int 指针类型。
  • 第 9 行,取指针 a 的值,并把值赋给变量 t,t 此时是 int 类型。
  • 第 12 行,取 b 的指针值,赋给指针 a 指向的变量。注意,此时*a的意思不是取 a 指针的值,而是“a 指向的变量”。
  • 第 15 行,将 t 的值赋给指针 b 指向的变量。
  • 第 21 行,准备 x、y 两个变量,分别赋值为 1 和 2,类型为 int。
  • 第 24 行,取出 x 和 y 的地址作为参数传给 swap() 函数进行调用。
  • 第 27 行,交换完毕时,输出 x 和 y 的值。

使用指针变量获取命令行的输入信息

package main

// 导入系统包
import (
    "flag"
    "fmt"
)

// 定义命令行参数
var mode = flag.String("mode", "", "process mode")

func main() {

    // 解析命令行参数
    flag.Parse()

    // 输出命令行参数
    fmt.Println(*mode)
}

将这段代码命名为 main.go,然后使用如下命令行运行:

go run main.go --mode=fast

命令行输出结果如下:

fast

代码说明如下:

  • 第 10 行,通过 flag.String,定义一个 mode 变量,这个变量的类型是 *string。后面 3 个参数分别如下:
    • 参数名称:在命令行输入参数时,使用这个名称。
    • 参数值的默认值:与 flag 所使用的函数创建变量类型对应,String 对应字符串、Int 对应整型、Bool 对应布尔型等。
    • 参数说明:使用 -help 时,会出现在说明中。
  • 第 15 行,解析命令行参数,并将结果写入到变量 mode 中。
  • 第 18 行,打印 mode 指针所指向的变量。

创建指针的另一种方法——new() 函数

Go语言还提供了另外一种方法来创建指针变量,格式如下:

new(类型)

一般这样写:

str := new(string)
*str = "Go语言教程"

fmt.Println(*str)