LoginSignup
41
40

More than 3 years have passed since last update.

Goのポインタ・メモリ・アドレス

Last updated at Posted at 2019-06-11

メモリ

変数や関数をどんどん突っ込んでいくことができる大きな箱のようなものです。

func main() {
// 定義した変数はメモリに保管される
 memo := "メモです"
 date := 20190611
}

アドレス

メモリ空間の中にある一つ一つ番地ののことです。
それぞれの番地にある処理、データを読み込んで実行します。
その名のとおり、メモリ空間それぞれの住所のようなものです。

定義した変数のアドレスを見てみる

func main() {
// 定義した変数はメモリに保管される
 memo := "メモです"
 date := 20190611

// memoとdateが補完されているアドレスを表示する
 fmt.Println(&memo)
 fmt.Println(&date)
}

// memoのアドレス
0xc000092030 

// dateのアドレス
0xc000094000

ポインタ

アドレスを変数として保管することができるメモリを作成するのに使用します。

func main(){
 memo := "メモです"
 date := 20190611

// ポインタを使用することでメモリにmemoとdateのアドレスを保管することができる。
 var pointer *string = &memo
 var pointer2 *int = &date

 fmt.Println(pointer)
 fmt.Println(pointer2)

// memoのアドレス
0xc000092030 

// dateのアドレス
0xc000094000


// ポインタのアドレスも見てみる
 fmt.Println(&pointer)
 fmt.Println(&pointer2)

// pointerのアドレス
0xc00000e010

// pointer2のアドレス
0xc00000e018
}

pointerpoiner2アドレスを保管している変数なので、memo dateのアドレスとは違っていますね。

アドレスからメモリを参照する

func main(){
 memo := "メモです"
 date := 20190611

 var pointer *string = &memo
 var pointer2 *int = &date

 fmt.Println(*pointer)
 fmt.Println(*pointer2)
}
// fmt.Println(*pointer)の結果
 メモです

// fmt.Println(*pointer2)の結果
 20190611

pointer変数にはmemoのアドレスが格納されています。
そのため、 *pointerとしてあげることでアドレスに関連するメモリの中身を参照することができます。

41
40
1

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
41
40