3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

VolareAdvent Calendar 2019

Day 11

Golangにおけるポインタについて

Posted at

ポインタって?

まず、ポインタという言葉の前にメモリについて理解をすることが必要です。


n := 200

変数nが定義された時に、200を一時的に保存する場所が メモリです。

メモリは、複数存在しそれぞれのメモリに番号が振られています。

この番号を アドレス と呼びます。

実際にアドレスを確認してみます。
Goでは、&を定義した変数の前につけることでメモリを確認することができます。


func main() {
	n := 200
	fmt.Println(&n)
    // -> 0xc000084000

つまり、アドレス0xc000084000に変数nの200が保存されていることになります。

アドレスとメモリについて理解したところで、ポインタについて考えていきます。

ポインタを調べると、このようにまとめらていました。

  • メモリのアドレス情報のこと
  • アドレス情報を格納するための変数のこと

もう少しこの2つを詳細に見ていきます。

Golangには、 ポインタ型ポインタ変数

ポインタ型は、stringやintなどの方に*をつけることで定義します。

下では、nがポインタ変数にあたり、*intがポインタ型になります。

func main() {
	var pointer *int
	n := 100

	// 1.
	pointer = &n

	// 2.
	fmt.Println("pointerの中身:", *pointer)
}

  1. &nを使うことで、nのアドレスの番地をpointerに格納している
  2. pointer型から値を取得するためには、*をつけることで値を表示することができる

実際にポインタ型を使う時

ポインタ型は、参照渡しを行う時に用います。

Swiftでは、inoutを使いますね。

func main() {
	a, b := 100, 100

	checker(a, &b)
	fmt.Println(a, &b)
        // -> 100 101
}

//1
func checker(a int, b *int) {
	a++
	*b++

}

  1. 参照渡しを行うことで、呼び出しもとのbの値が変更される。

まとめ

多言語からGolangを始める方、初心者の方はこのポインタ型におそらく苦労されると思います。(自分がそうだった)

そこで、実際に手を動かして書くことで少し理解が深まると思います!

ぜひ、この記事を読みながら実際にパソコンでも手を動かして欲しいなと思います。

3
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?