Go

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


メモリ

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

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としてあげることでアドレスに関連するメモリの中身を参照することができます。


さいごに

次回はポインタ・メモリ・アドレスを使用して参照渡し・値渡しがどうなっているのかを紹介します!