为什么不能在Go中的“dereferenced”指针变量中添加整数?

问题描述 投票:2回答:4

来自Python,我正在学习Go并尝试围绕指针。

我写了这段代码是为了理解这个概念:

a := 1
b := &a
fmt.Println(b) // Shows the memory address of a
fmt.Println(*b) // Shows the value 1
*b++
fmt.Println(a) // Shows the value 2 (as expected)

我尝试使用此代码来提高我的理解力。但是,以下内容不起作用:

a := 1
b := &a
fmt.Println(b) // Shows the memory address of a
fmt.Println(*b) // Shows the value 1
b = *b + 1 // Compile error: invalid operation: b * +1 (mismatched types *int and int)
fmt.Println(a)

显然,*b的类型为*int,而值1(显然)类型为int。但是,为什么有可能在第一个例子中用*b++in增加a的值?

pointers go types
4个回答
1
投票

从最开始:

b := &a

这里,b*int类型,指向存储器中存储a值的位置的指针。当您执行*b时,您正在访问b指针指向的位置的值。

当你做*b++时,它代表*b = *b + 1,你在b指针指向的位置递增一个值。

b = *b + 1是无效的,因为你试图将*b1这两种类型的int添加到b,这是一个指针(*int的类型)。


1
投票

为什么不能在Go中的“dereferenced”指针变量中添加整数?

b是一个指针和解除引用的b被写为*bb = *b + 1无效,因为您尝试将整数转换为指针,即使明确进行类型转换也无法实现。您需要修改指针指向的数据,而不是指针本身:*b = *b + 1

看看这里的Go规范有关*b++的工作原理:https://golang.org/ref/spec

运算符优先级

一元运算符具有最高优先级。由于++和 - 运算符形成语句而不是表达式,因此它们不属于运算符层次结构。因此,语句* p ++与(* p)++相同。


1
投票

您正在向*int添加int。因此,错误。由于b是指向整数的指针,要对该整数(读或写)执行任何操作,您需要取消引用它。下面的代码将按预期工作。这就是*b++内部所做的事情。

package main

import (
    "fmt"
)

func main() {
    a := 1
    b := &a
    fmt.Println(b)  // Shows the memory address of a
    fmt.Println(*b) // Shows the value 1
    *b = *b + 1     // No Compile error
    fmt.Println(a)  // Shows the value 2
}

试试吧:https://play.golang.org/p/2RX1CWD-AQC


0
投票

向取消引用(整数)指针变量添加整数是可能的,并且正确地适用于您的情况。但是,出于类型安全原因,在Go中不能接受将此值赋给指针变量。通常不需要(但有一种方法可以引用任何给定的地址)。希望这能澄清它。

© www.soinside.com 2019 - 2024. All rights reserved.