3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

iOSAdvent Calendar 2023

Day 20

UnsafePointerでメモリのアドレスを見てみよう!

Last updated at Posted at 2023-12-24

ポインタとは

ポインタとは、変数のアドレスを記憶する変数のこと。ポインタを使うことで、アドレス先の値を取得したり、変更することができる!
アドレスはバイト単位の一次元配列であることを強調するため、バイトアドレスとも呼ばれる。オブジェクトのアドレスを取得するには、オブジェクト名の前に&演算子(アドレス演算子)を付ける。

アドレス演算子

&オブジェクト名

オブジェクトaのアドレス

&a

UnsafePointerを使用し、アドレスを見てみよう!

UnsafePointerを使用して構造体のアドレス先の値を取得してみよう!

UnsafePointerとは

特定のタイプのデータにアクセスするためのポインタ
UnsafePointer<Int>に変換し、アドレス先の値を取得することができる。

UnsafePointerの使用例

Playgroundで使用してみよう!

UnsafePointerのInt型の使用例

var a = 10
var b = a
func action(a: UnsafePointer<Int>, b: UnsafePointer<Int>) {
    print(a)
    print(b)
}
action(a: &a, b: &b)

値型であるaオブジェクトとbオブジェクトのアドレスを&をつけることで表すことができ、IntからUnsafePointer<Int>に変換できる!

出力結果は下記のようになる

0x0000000102a04120
0x0000000102a04128

値型の構造体は、bは代入時点のaのコピーであり、aとbは別々の実体を示すので、aとbのメモリのアドレスも異なる。
8バイト数ずらしたアドレスにbは割り当てられている。

UnsafePointerの構造体型の使用例

class VC1 {
    var info: Info
    init(info: Info) {
        self.info = info
    }
}

func action(a: UnsafePointer<Info>) {
    print(a)
}
var value1 = Info()
var value2 = value1
value1.count = 10
value1.count //10
action(a: &value1)
value2.count //0
action(a: &value2)

出力結果は下記のようになる

0x00000001022e4340
0x00000001022e4348

aとbは別々の実体を示すので、aとbのメモリのアドレスも異なるため、value1を変更しても、valuewに値の変更が共有されないということです。

※構造体とclassの違いがわからない方は下記を参考にしてみてください!

参考文献

3
1
2

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?