Go言語 / Basic / 変数 / ポインタ

Go言語 / Basic / 変数 / ポインタ

Go には C言語 と同じように「ポインタ」がある。 概念もほぼ同じである。このへんは C言語 からの移植性を高めるために存在しているという側面もあるっぽいので概念を継承しているっぽい。

基本

var hoge int = 42         // int型の変数 hoge を作って 42 を代入する
var piyo *int = &hoge     // intポインタ型の変数 piyo を作ってそこに変数 hoge のアドレスを格納する
fmt.Println(hoge)         // => 42
fmt.Println(piyo)         // => 0xc000014098 ※実際の値は実行する度に変わる
fmt.Println(*piyo)        // => 42   アドレス経由で hoge を参照する
hoge = 23                 // hoge の中身を 23 に書き換える
fmt.Println(piyo)         // => 0xc000014098 ※書き換えていないので当然同じ値
fmt.Println(*piyo)        // => 23   アドレス経由で hoge を参照しているのでさっきと変わっている
*piyo = 42                // => アドレス経由で hoge を書き換える
fmt.Println(hoge)         // => 42   直接書き換えて無いが書き換えられる

ポインタポインタ

ポインタのポインタという操作も可能。あんまり使う機会は無いと思うが。

var hoge int = 42
var piyo *int = &hoge
var fuga **int = &piyo
fmt.Println(**fuga)

ポインタ演算

アドレスを直接操作してアドレスを自由にジャンプしたりできない。格納するだけで演算はできない。

ポインタの種類

種類というのは特に無いのだが、考え方として Go言語には2種類のポインタがあると思うと理解が楽になる。 プログラマが明示的に確保した箱のポインタと、勝手に確保された箱のポインタ。

↑のほうで説明した変数を作ってその変数からアドレスを引き出すのは前者になる。これの動きは説明した通りになる。 Java にはそのような確保した変数のアドレスを操作するような操作は無い。

後者の勝手に確保されるというのは、Java の new するっぽい話。

Java の場合クラスを new してインスタンスを作った場合、メモリ上に勝手に(変数とか関係無く)箱が確保されてそこに対象のインスタンス作成され格納される。 そのアドレスを new の結果として掴む(変数に格納する)ことができる。逆に言うとその new のタイミング以外でそのアドレスを掴むことはできない。 なのでそのアドレスがそのインスタンスそのものと言っても間違いではない。

Go言語でもこれと同じ状況のモノそのものを指すポインタがある。

この2つがあるということがわからないと、ポインタって何だ?って話になる。

golang/basic/variable/pointer/start.txt · 最終更新: 2021-07-17 18:51 by ore