LoginSignup
1
2

More than 3 years have passed since last update.

【Golang】Go言語の基礎 結局ポインタって何なの??

Last updated at Posted at 2020-09-21

Go言語やC言語を学ぶ上で避けては通れないのがポインタです。
プログラミング初学者の入門言語であるRubyやPHPにはポインタという概念がありません。
Rubyから入った僕にはいろんな記事を読んでも???でした!そんな方にもわかるようにここでは解説いたします!

ポインタとは?

プログラムというのは、メモリの中で読み込まれ、CPUで処理されます。また、僕たちが普段プログラムで使っている変数というのはメモリの中に配置されます。CPUによってメモリの中に配置されている変数の値を処理しているのです。
ポインタというのは、変数がメモリのどこに配置されているか?という情報(変数の住所)を格納する変数のことです。

早速コードを書いてみる


package main

import "fmt"

func main() {
    var n int = 10
    fmt.Println(n) // => 10

    //アンパサンドを付けることで変数を入れたメモリの住所(正式にはアドレスといいます。)が表示できる。
    fmt.Println(&n) // => 0xc00002c008

    //* を付けることでintgerのポインタ型の変数p(変数nのアドレスを入れる箱)を用意できる。
    var p *int = &n 

    fmt.Println(p) // => 0xc00002c008

    //変数pの値を表示したいときは*pとすると、値を表示できる。
    fmt.Println(*p) // => 10

}

var 変数名 データ型 とすることで、変数のアドレスを格納する変数を宣言することができます。
ここに変数のアドレスを入れるためには &変数名とするとその変数のアドレスを格納できます。
格納したアドレスの値を表示したい場合、
変数名とすることによって値を表示することができます。

もう少し書いてみる。


package main

import "fmt"

func one(x int) {
    x = 1
}

func main() {
    var n int = 10
    one(n)
    fmt.Println(n) // => 10

}

↑に書いたコードはone関数の引数に値しか渡していないので、最初にmain関数で宣言したxに影響はありません。

実際にxの値を更新するにはxのアドレスを引数に渡す必要があります。このようなことをしたいときにポインタが使われます↓


package main

import "fmt"

func one(x *int) {
    *x = 1
}

func main() {
    var n int = 10
    one(&n)
    fmt.Println(n) // => 1

}

one関数の引数に&nとしてnのアドレスを渡しています。その際引数はポインタ型でなければアドレスを受け取ることができないので x *int としてポインタ型の引数を定義しています。
これはやっていることとしては最初にやった var p *int = &n とやっていることは同じだとわかります。

最後まで読んでいただきありがとうございます!

何かご指摘などございましたらコメント等いただけると嬉しいです!!

1
2
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
1
2