Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

メモリ

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away