1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Go言語(Golang)のポインタとメモリアドレス

Posted at

1. 変数の宣言とメモリアドレスの表示

var ui1 uint16
fmt.Printf("memory address of ui1: %p\n", &ui1)

var ui2 uint16
fmt.Printf("memory address of ui2: %p\n", &ui2)
  • ui1ui2は、uint16型の変数です。
  • &ui1のように「&」を使うことで、変数のメモリアドレスを取得できます。%pフォーマット指定子を使って、ポインタとして出力します。

2. ポインタの宣言と初期化

var p1 *uint16
fmt.Printf("value of p1: %v\n", p1)

p1 = &ui1
fmt.Printf("value of p1: %v\n", p1)
  • p1uint16型のポインタです。初期状態ではnil(何も指していない状態)です。
  • p1 = &ui1によって、ui1のメモリアドレスをp1に代入します。これにより、p1ui1を指すようになります。

3. ポインタのサイズとメモリアドレス

fmt.Printf("size of p1: %d[bytes]\n", unsafe.Sizeof(p1))
fmt.Printf("memory address of p1: %p\n", &p1)
  • unsafe.Sizeof(p1)は、ポインタのサイズをバイト単位で返します。通常、ポインタのサイズはシステムによって異なります(32ビットシステムでは4バイト、64ビットシステムでは8バイト)。
  • &p1p1のメモリアドレスを出力します。

4. ポインタの間接参照

fmt.Printf("value of ui1(dereference): %v\n", *p1)

*p1 = 1
fmt.Printf("value of ui1: %v\n", ui1)
  • *p1を使うことで、ポインタが指している変数(この場合はui1)の値を取得します。この操作を「間接参照」と呼びます。
  • *p1 = 1により、ui1の値を1に設定します。この時点で、ui1の値が変更されます。

5. 二重ポインタの使用

var pp1 **uint16 = &p1
fmt.Printf("value of pp1: %v\n", pp1)

fmt.Printf("memory address of pp1: %p\n", &pp1)
fmt.Printf("size of pp1: %d[bytes]\n", unsafe.Sizeof(pp1))
  • pp1p1のポインタであり、二重ポインタです。これにより、ポインタのポインタを扱うことができます。
  • &p1p1のアドレスをpp1に代入します。

6. 二重ポインタを通じた間接参照

fmt.Printf("value of p1(dereference): %v\n", *pp1)
fmt.Printf("value of ui1(dereference): %v\n", **pp1)

**pp1 = 10
fmt.Printf("value of ui1: %v\n", ui1)
  • *pp1p1を指し、**pp1ui1の値を直接参照します。
  • **pp1 = 10により、ui1の値を10に設定します。
1
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?