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 とやっていることは同じだとわかります。
##最後まで読んでいただきありがとうございます!
何かご指摘などございましたらコメント等いただけると嬉しいです!!