Help us understand the problem. What is going on with this article?

今日から始めるGolang【ポインタ】

More than 1 year has passed since last update.

Goってシンプルな言語仕様で書き方もRubyみたいにシンプルだしで取っ付きやすいですね。
その一方で、難解とされているのがポインタの概念ではないかと思います。

今回はそんなGoのポインタについてまとめました。

ポインタとは

スターティングGo言語によるとポインタとは、

「値型」に分類されるデータ構造(基本型や参照型、構造体など)のメモリ上のアドレスと型の情報です。Goではこれを使ってデータ構造を間接的に参照・操作できます

とのこと。

...メモリ?アドレス?

こちらによると、メモリとは

データを記憶する部品のことです。英語でmemoryとは記憶を意味します。
データやプログラムを 一時的に記憶する部品

要は、一時記憶装置です。
変数などを定義した場合に、その情報が一時的に保存されている場所がメモリです。

メモリは横一列に並んだロッカーのような構造をしており、左端から1バイト単位で区切られていてそれぞれに対して番号が振られています。
この、それぞれのロッカーに割り振られた番号のことをアドレスと言います。

プログラムで宣言した変数は、このメモリ上に番号付きで記憶されています。

アドレス1 アドレス2 アドレス3
変数 hoge 変数 fuga 変数 piyo

なお、アドレスは0xc420014098のような16進数の値で管理されているので人間にとっては区別が非常に難しいです。
そのため我々エンジニアが実際にコードを書く際には、hoge := 10 のような変数をつけるようになっています。
ただしプログラムを実行ファイルにコンパイルすると、変数名は番号(アドレス)に変換されます。

要するに、全ての変数はメモリに作られており、その中のアドレスによって区別しているのです。

ポインタとは、このようにデータが実際に保存されている場所を意味します。

ポインタを使う目的

端的にいうと、値型のデータに対してデータの操作を実施するための手段を提供することが目的です。

Go言語において、int型、string型、構造体、interfaceなどは値型です。
値型のデータを関数の引数に使うなどした場合、関数の中では引数で渡された元のデータをコピーしたデータが使用される(いわゆる値渡し)ため、引数で渡された元のデータに対して直接影響を与える(値を書き換えるなど)ことができません。

定義元のデータに対して操作を行うためには、定義元のデータのアドレスを参照する必要があり、そのためにポインタを利用するという感じです。

デリファレンス

Goでは演算子&(アドレス演算子)を使うことで任意の型からその型のポインタ型を生成できます。
ポインタ型の変数から値を参照するには、演算子*をポインタ型の変数の手前に置くことで実現できます。
このように、ポインタ型が保持するメモリ上のアドレスを経由してデータ本体を参照することをでリファレンスと言います。

package main

import (
    "fmt"
)

func main() {
    var i int
    p := &i // int型変数iに対するポインタ型の変数pを定義
    i = 10

    fmt.Println(i)
    // => 10
    fmt.Println(*p) // 変数iと同じアドレスにアクセスしている
    // => 10

    *p = 100
    fmt.Println(i) // 参照先の値が変わった
    // => 100
    fmt.Println(*p)
    // => 100
}

このように、ポインタの性質を利用することで関数の引数へ値型データの参照渡しを実現できます。

まとめ

  • ポインタとは、データが実際にメモリ上に格納されている場所(アドレス)のこと
  • Goにおける構造体などは値型であるため、そのままではデータ本体を操作することはできない(コピーができてしまうだけ)
  • ポインタを利用してデータが実際に格納されている場所にアクセスすることで、値型の参照渡しが可能になる

合わせて読みたい

参考

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
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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