ポインタがどういうものなのか分からなかったので調べた。
今回はGoで書いた。
pointer_practice.go
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
x := 2
/* 変数xのアドレス(変数xが保存されているメモリの位置)を格納 */
/* ある変数のアドレスが格納された変数のことをポインタ変数という */
x_pointer := &x
fmt.Println(x)
fmt.Println(x_pointer)
/* ポインタ変数x_pointerに格納されたアドレスに存在する値を取得 */
/* メモリをjsのオブジェクト、アドレスをオブジェクトのキーと考えると メモリ[アドレス(x_pointer)] = 2 というイメージ */
fmt.Println(*x_pointer)
arg := 0
arg_pointer := &arg
test_pointer(arg_pointer)
/* 同じ結果になる */
fmt.Println(arg)
fmt.Println(*arg_pointer)
/* 値は書き換えられない(関数内では書き換えられるが、引数として設定した変数の値に影響はない) */
/* returnで関数内での書き換え結果を取得する */
test_val(arg)
fmt.Println(arg)
}
/* ポインタ変数を引数として受け取る関数(ポインタ渡し) */
func test_pointer(val_pointer *int) {
/* 時間を用いてseed(乱数のもと?)を作成 Seedがないと毎回同じ値を取得してしまう */
rand.Seed(time.Now().UnixNano())
/* ポインタ変数に格納されたアドレスを取得 -> 値の書き換えを行うメモリの位置をアドレスで指定 -> 指定したメモリの位置に保存されている値を0~999のランダムな数字に書き換える */
*val_pointer = rand.Intn(1000)
}
/* 値渡しの関数(いつもの) */
func test_val(val int) {
rand.Seed(time.Now().UnixNano())
val = rand.Intn(1000)
}
値渡し(変数の値を受け取る)の関数とポインタ渡し(変数のアドレスを受け取る)の関数とでは、引数の型の設定方法が異なる。
/* 値渡しの関数 */
func(引数 引数の型) { /* 関数の処理 */ }
/* ポインタ渡しの関数 型名の前に「*」が付く*/
func(引数 *引数の型) { /* 関数の処理 */ }