Mi

日常をさらさらと

Goのポインタがよくわかってないから、まとめてみる

Goは勉強のコストが低いから、誰でもやりやすい言語と言われている.

それは重々承知しているし、実際に書いていて、わかりやすい言語ではあると思う.

しかし、曖昧なまま進んでいくと、ぶち当たるだろう ポインタ , これがマジでよくわからない. 元々 CS とか出てる人は Cとかやってるのかもしれないけど、文学部のワイにはマジでよくわからない.

さぁ学んでみよう!!

Goの型

Go自体は、みんなご存知の通り、静的型ありの言語 型の種類は、 int, string ...etc その中に ポインタ型というのがあり、その名の通り、ポインタを扱うための型である.

これは、変数宣言の時に、型名の前に " * " をつけることで定義できる. 変数に"&"をつけると変数の アドレス を参照することができ、アドレスから変数の値を参照するには" * "を変数につける。

package main

import "fmt"

func main() {
      var p *int
      var n int
      
      n = 10
      p = &n

      fmt.Print(p)  // 0xc000094010
      fmt.Print(*p) // 10

変数 p は ポインタ型として定義されている. そこに int型の n( 10が代入されている ) のアドレスを代入.

出力しては、pのアドレスと代入された値の 10がでてくる

そこで1個疑問が出てきた

p と n のアドレスは同じなのか

package main

import "fmt"

func main() {
      var p *int
      var n int
      
      n = 10
      p = &n

      fmt.Print(&p)  // 0xc000094010
      fmt.Print(&n) // 0xc00009a000

よくよく考えれば、p は 別で変数宣言してるわけだし、中身を n のアドレスで上書きしても、元々のアドレスが変わるわけではない.

一度知識として、アウトプットすれば、こんなもんかって感じ