Goで "間接参照された"ポインタ変数に整数を追加できないのはなぜですか

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 ++ でaの値を増やすことができるのはなぜですか?

2
ru de
b* int 型です。 * bint 型です。 * b + 1 は問題ありません(そして int を生成します)。問題は b への代入です。これは int ではなく * int です。 b = * b または b = 1 と書いても同じエラーになります。
追加された 著者 melpomene,
* b ++b = * b + 1 ではなく、 * b = * b + 1 を表します。
追加された 著者 eminlala,
使用しているGoのバージョンは何ですか?私はあなたが投稿したそのエラーを取得しません。代入で* b + 1(int型)を* int型として使用することはできません。これははるかに明確であり、おそらくこの場合あなたの混乱を避けていたでしょう。
追加された 著者 jecolon,

4 答え

最初から:

b := &a

ここで、 b* int 型で、 a の値が格納されているメモリ内の場所へのポインタです。 * b を実行すると、 b ポインタが指す場所から値にアクセスしていることになります。

* b ++ を実行すると、それは * b = * b + 1 を表し、 b ポインタが指す場所の値を増やしています。

b = *b + 1 is invalid because you are trying to add *b and 1, which are both type of int, to b, which is a pointer (type of *int).

1
追加された

* intint に追加しています。したがって、エラーです。 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
}

Try it here: https://play.golang.org/p/2RX1CWD-AQC

1
追加された

Goで「参照されていない」ポインタ変数に整数を追加できないのはなぜですか?

b is a pointer and dereferenced b is written as *b. b = *b + 1 is invalid because you're trying to convert an integer to a pointer, which is not possible even when explicitly typecasted. You'll need to instead modify the data that pointer is pointing to, not the pointer itself: *b = *b + 1.

Take a look at the Go spec here regarding why *b++ works: https://golang.org/ref/spec

演算子の優先順位

     

単項演算子は最高の優先順位を持ちます。 ++および - 演算子は式ではなく文を形成するので、それらは演算子階層の外側にあります。結果として、ステートメント* p ++は(* p)++と同じです。

1
追加された

参照されていない(整数)ポインタ変数に整数を追加することは可能で、あなたの場合は正しく働いています。しかし、この値をポインタ変数に代入することは、型安全上の理由からGoでは受け入れられません。そしてそれは通常必要ではありません(ただし、与えられたアドレスを参照する方法はあります)。これで明確になることを願っています。

0
追加された