🎯

ダーツを投げればポインタがわかる!?ポインタ入門【いらすとや図解】

2024/08/24に公開

はじめに

A Tour of Goのポインタで理解に時間がかかったのでイラストやを使って解説してみました。
メモリアドレスといった難しいワードを使わないようにしているので比較的わかりやすいかなと思っております。

https://go-tour-jp.appspot.com/moretypes/1

今回の実装コード

以下のコードを解説していきます。
16進数の値は状況に応じて変わる可能性があります。

package main

import "fmt"

func main() {
    blueArrow, redArrow := 42, 2701
	blueArrowMap := &blueArrow 

	// blueArrow: 42
	fmt.Println("blueArrow:", blueArrow)
	// &blueArrow: 0xc000104040
	fmt.Println("&blueArrow:", &blueArrow)
    // redArrow: 2701
	fmt.Println("redArrow:", redArrow)
	// &redArrow: 0xc000104048
	fmt.Println("&redArrow:", &redArrow)


	// blueArrowMap: xc000104040
	fmt.Println("blueArrowMap:", blueArrowMap)
	// &blueArrowMap: 0xc000108038
	fmt.Println("&blueArrowMap:", &blueArrowMap)
	// *blueArrowMap: 42
    fmt.Println("*blueArrowMap:", *blueArrowMap)

    *blueArrowMap = 21
	
	// blueArrow: 21
    fmt.Println("blueArrow:", blueArrow)
	// &blueArrow: 0xc000104040
	fmt.Println("&blueArrow:", &blueArrow)

    blueArrowMap = &redArrow
	
	// blueArrowMap: 0xc000104048
    fmt.Println("blueArrowMap:", blueArrowMap)
	// &blueArrowMap: 0xc000108038
	fmt.Println("&blueArrowMap:", &blueArrowMap)
	// *blueArrowMap: 2701
	fmt.Println("*blueArrowMap:", *blueArrowMap)
}

ステップ1:ダーツを投げる

1行目でダーツを投げました。
どちらのダーツの矢も値(ここではダーツの名前だと思ってください)を定義しただけなので位置は適当に決められます。

blueArrow, redArrow := 42, 2701

無題のプレゼンテーション (1).png

ステップ2:青いダーツの地図を書く

2行目で青い矢の位置を定義する変数を宣言します

blueArrowMap := &blueArrow

無題のプレゼンテーション (2).png

ステップ3:矢の情報を確認

&をつけることを場所を定義することができます

// blueArrow: 42
fmt.Println("blueArrow:", blueArrow)
// &をつけると場所が定義される。今回は場所を定義していないので適当な16進数が定義される
// &blueArrow: 0xc000104040
fmt.Println("&blueArrow:", &blueArrow)
// redArrow: 2701
fmt.Println("redArrow:", redArrow)
// &をつけると場所が定義される。今回は場所を定義していないので適当な16進数が定義される
// &redArrow: 0xc000104048
fmt.Println("&redArrow:", &redArrow)

無題のプレゼンテーション (3).png

ステップ4:青いダーツの地図の情報を確認

東京都にあるのは適当に決めました

// blueArrowMap自体は住所が定義されているので16進数が表示
// blueArrowMap: 0xc000104040
fmt.Println("blueArrowMap:", blueArrowMap)
// &をつけると場所が定義される。この地図自体の住所が定義されるので上記とは別になる
// &blueArrowMap: 0xc000108038
fmt.Println("&blueArrowMap:", &blueArrowMap)
// *をつけるとそこに刺さっているダーツのvalue(今回でいう名前)が表示
// *blueArrowMap: 42
fmt.Println("*blueArrowMap:", *blueArrowMap)

無題のプレゼンテーション (9).png

ステップ5:青いダーツの名前を変更

*blueArrowMap = 21

青いダーツの名前を地図から変えてしまった
無題のプレゼンテーション (5).png

ステップ6:命名変更された青いダーツの情報を確認

// value(今回でいう青いダーツ名)は変えられてしまった
// blueArrow: 21
fmt.Println("blueArrow:", blueArrow)
// 青いダーツの住所は変わっていないので引き続き同じ場所に刺さっている
// &blueArrow: 0xc000104040
fmt.Println("&blueArrow:", &blueArrow)

無題のプレゼンテーション (6).png

ステップ7:地図の対象を赤い矢に変更

blueArrowMap = &redArrow

無題のプレゼンテーション (7).png

ステップ8:対象が変わった赤いダーツの情報を確認

// 地図に書かれているのは赤い矢の住所に変更
// blueArrowMap: 0xc000104048
fmt.Println("blueArrowMap:", blueArrowMap)
// 地図の住所自体は変わらない
// &blueArrowMap: 0xc000108038
fmt.Println("&blueArrowMap:", &blueArrowMap)
// 赤いダーツのvalue(今回でいう名前)が表示
// *blueArrowMap: 2701
fmt.Println("*blueArrowMap:", *blueArrowMap)

無題のプレゼンテーション (8).png

終わりに

ポインタを住所を使って示すことでわかりやすくなったかなと思います。
この記事がポインタとメモリの操作が少しでも参考になれば幸いです。
最後までお読みいただきありがとうございます!

Discussion