LoginSignup
3
1

More than 5 years have passed since last update.

【Golang】ポインタの基礎をアドレス演算子を使っみ触ってみた

Posted at

ここ数日、いろいろと挙動を確認しながらGolangのポインタを勉強しています。

ブログや本などを色々読み漁っていましたが、アドレス演算子を触っいる時、少ししっくりきた部分があったので備忘録として残しておこうと思います。

基礎中の基礎で、かなりシンプルな内容です。

アドレス演算子

アドレス演算子とは、変数の格納アドレスを確認することができる演算子です。

var i int
i = 5

fmt.Println(i)  // => 5

fmt.Println(&i) // => 0xc000014078

&iで出力すると変数 i の格納アドレスのみが出力されました。
&を付けると格納アドレスだけ表示されます。

次はpに代入

var i int
i = 5
p := &i

fmt.Println(p)  // => 0xc000014078

当たり前のようですが、 変数pも格納アドレスだけ寄越してきました。
これは格納アドレスをpに渡しているから、こう表現されるのでしょう。

それぞれの変数の中身(型、アドレス)がどうなっているのか確認してみました

var i int
i = 5
p := &i

fmt.Printf("type=%T, address=%p, int=%d\n", i, i)
// => type=int, address=%!p(int=5)

fmt.Printf("type=%T, address=%p, int=%d\n", &i, &i)
// => type=*int, address=0xc000098000

fmt.Printf("type=%T, address=%p, int=%d\n", p, p)
// => type=*int, address=0xc000098000

アドレス演算子&を付けると型も特殊な*int型になります。
型が違うのでint型と*int型は計算はできません。

var i int
i = 5
p := &i

q := p + 5
// invalid operation: p + 5 (mismatched types *int and int)

肝心のpの値を利用したいときには変数に*を付けます

var i int
i = 5
p := &i

fmt.Println(*p)  // => 5

処理を行うときにも忘れずに。

var i int
i = 5
p := &i

q := *p + 5

fmt.Println(q) // => 10

ポインタはGo言語で重要な概念で、構造体を利用する際に必ず利用します。
構造体は他言語でいうクラスみたいなものですが、値型と参照型と言う点で性質が違います。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1