ポインタとは
ポインタとは、変数のアドレスを記憶する変数のこと。ポインタを使うことで、アドレス先の値を取得したり、変更することができる!
アドレスはバイト単位の一次元配列であることを強調するため、バイトアドレスとも呼ばれる。オブジェクトのアドレスを取得するには、オブジェクト名の前に&演算子(アドレス演算子)を付ける。
アドレス演算子
&オブジェクト名
オブジェクト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の違いがわからない方は下記を参考にしてみてください!
参考文献