Generic Structure

UnsafeMutablePointer

A pointer for accessing and manipulating data of a specific type. ある特定の型のデータにアクセスおよび操作するためのポインタ。

Declaration 宣言

@frozen struct UnsafeMutablePointer<Pointee>

Overview 概要

You use instances of the UnsafeMutablePointer type to access data of a specific type in memory. The type of data that a pointer can access is the pointer’s Pointee type. UnsafeMutablePointer provides no automated memory management or alignment guarantees. You are responsible for handling the life cycle of any memory you work with through unsafe pointers to avoid leaks or undefined behavior. あなたは、UnsafeMutablePointer型のインスタンスを使うことで、メモリにおいて特定の型のデータにアクセスします。ポインタがアクセス可能なデータの型は、ポインタのもつPointee型です。UnsafeMutablePointerは、自動メモリ管理またはアラインメント保証を提供しません。あなたはリークや未定義挙動を避けるために、あなたが安全でないポインタを通して扱うあらゆるメモリの生涯の処理に責任があります。

Memory that you manually manage can be either untyped or bound to a specific type. You use the UnsafeMutablePointer type to access and manage memory that has been bound to a specific type. あなたが手動で管理するメモリは、特定の型に対して型付けされないまたは束縛されるのいずれかが可能です。あなたは、UnsafeMutablePointer型を使うことで、特定の型に束縛されているメモリへのアクセスおよび管理を行います。

Understanding a Pointer’s Memory State あるポインタのメモリ状態を理解する

The memory referenced by an UnsafeMutablePointer instance can be in one of several states. Many pointer operations must only be applied to pointers with memory in a specific state—you must keep track of the state of the memory you are working with and understand the changes to that state that different operations perform. Memory can be untyped and uninitialized, bound to a type and uninitialized, or bound to a type and initialized to a value. Finally, memory that was allocated previously may have been deallocated, leaving existing pointers referencing unallocated memory. UnsafeMutablePointerインスタンスによって参照されるメモリは、いくつかの状態の1つであることが可能です。多くのポインタ演算はある特定の状態のメモリを持つポインタに適用されるだけであるべきです — あなたは、あなたが作業しているメモリの状態を見失わないようにして、異なる演算が実行するその状態の変更を理解していなければなりません。メモリは、型無しで未初期化、ある型に束縛されて未初期化、またはある型に束縛されてある値に初期化される可能性があります。結局、以前にアロケートされたメモリはデアロケートされるかもしれません、アロケートされないメモリを参照している既存のポインタはそのままです。

Uninitialized Memory 未初期化メモリ

Memory that has just been allocated through a typed pointer or has been deinitialized is in an uninitialized state. Uninitialized memory must be initialized before it can be accessed for reading. 型付ポインタを通して今しがたアロケートされる、または未初期化状態にデイニシャライズされるメモリ。未初期化メモリは、それが読み出しのためアクセスされる前に初期化される必要があります。

You can use methods like initialize(repeating:count:), initialize(from:count:), and moveInitialize(from:count:) to initialize the memory referenced by a pointer with a value or series of values.

Initialized Memory 初期化済みメモリ

Initialized memory has a value that can be read using a pointer’s pointee property or through subscript notation. In the following example, ptr is a pointer to memory initialized with a value of 23: 初期化済メモリは、pointeeプロパティまたは添え字表記法を使って読み出し可能な値を持ちます。以下の例において、ptr23の値で初期化されるメモリに対するポインタです。


let ptr: UnsafeMutablePointer<Int> = ...
// ptr.pointee == 23
// ptr[0] == 23

Accessing a Pointer’s Memory as a Different Type ポインタのもつメモリに異なる型としてアクセスする

When you access memory through an UnsafeMutablePointer instance, the Pointee type must be consistent with the bound type of the memory. If you do need to access memory that is bound to one type as a different type, Swift’s pointer types provide type-safe ways to temporarily or permanently change the bound type of the memory, or to load typed instances directly from raw memory. あなたがメモリにUnsafeMutablePointerインスタンスを通してアクセスする時、Pointee型はそのメモリの束縛される型と一致しなければなりません。あなたがある型に束縛されるメモリに異なる型としてアクセスする必要があるならば、Swiftのポインタ型は型安全な方法を提供することで、一時的にまたは永続的にメモリの束縛される型を変更します、または型付インスタンスを直接に生のメモリからロードします。

An UnsafeMutablePointer<UInt8> instance allocated with eight bytes of memory, uint8Pointer, will be used for the examples below. 8バイトのメモリデアロケートされるUnsafeMutablePointer<UInt8>インスタンス、uint8Pointerは、下の例で使われます。


var bytes: [UInt8] = [39, 77, 111, 111, 102, 33, 39, 0]
let uint8Pointer = UnsafeMutablePointer<UInt8>.allocate(capacity: 8)
uint8Pointer.initialize(from: &bytes, count: 8)

When you only need to temporarily access a pointer’s memory as a different type, use the withMemoryRebound(to:capacity:) method. For example, you can use this method to call an API that expects a pointer to a different type that is layout compatible with your pointer’s Pointee. The following code temporarily rebinds the memory that uint8Pointer references from UInt8 to Int8 to call the imported C strlen function. あなたがポインタのもつメモリに異なる型として一時的にアクセスする必要があるだけならば、withMemoryRebound(to:capacity:)メソッドを使ってください。例えば、あなたはこのメソッドを使うことで、異なる型へのポインタを期待するもので、あなたのポインタのもつPointeeと互換のレイアウトである、あるAPIを呼び出すことができます。以下のコードは、一時的にuint8Pointerが参照するメモリをUInt8からInt8へと再束縛することで、インポートされたC strlen関数を呼び出します。


// Imported from C
func strlen(_ __s: UnsafePointer<Int8>!) -> UInt


let length = uint8Pointer.withMemoryRebound(to: Int8.self, capacity: 8) {
    return strlen($0)
}
// length == 7

When you need to permanently rebind memory to a different type, first obtain a raw pointer to the memory and then call the bindMemory(to:capacity:) method on the raw pointer. The following example binds the memory referenced by uint8Pointer to one instance of the UInt64 type: あなたが永続的にメモリを異なる型へ再束縛する必要があるならば、まずメモリに対する生のポインタを取得して、それからbindMemory(to:capacity:)メソッドを生のポインタ上で呼び出してください。以下の例は、uint8Pointerによって参照されるメモリをUInt64型のあるインスタンスに束縛します:


let uint64Pointer = UnsafeMutableRawPointer(uint8Pointer)
                          .bindMemory(to: UInt64.self, capacity: 1)

After rebinding the memory referenced by uint8Pointer to UInt64, accessing that pointer’s referenced memory as a UInt8 instance is undefined. uint8Pointerによって参照されるメモリをUInt64に再束縛する後、そのポインタの参照したメモリにUInt8インスタンスとしてアクセスすることは未定義です。


var fullInteger = uint64Pointer.pointee          // OK
var firstByte = uint8Pointer.pointee             // undefined

Alternatively, you can access the same memory as a different type without rebinding through untyped memory access, so long as the bound type and the destination type are trivial types. Convert your pointer to an UnsafeMutableRawPointer instance and then use the raw pointer’s load(fromByteOffset:as:) and storeBytes(of:toByteOffset:as:) methods to read and write values. その代わりに、あなたは同じメモリに異なる型として再束縛することなしにアクセスすることが型なしメモリアクセスを通して可能です、束縛される型と行き先の型が自明型である限りは。あなたのポインタをUnsafeMutableRawPointerインスタンスに変換して、それから生のポインタのもつload(fromByteOffset:as:)storeBytes(of:toByteOffset:as:)メソッドを使って値を読み書きしてください。


let rawPointer = UnsafeMutableRawPointer(uint64Pointer)
let fullInteger = rawPointer.load(as: UInt64.self)   // OK
let firstByte = rawPointer.load(as: UInt8.self)      // OK

Performing Typed Pointer Arithmetic 型付ポインタ算術を実行する

Pointer arithmetic with a typed pointer is counted in strides of the pointer’s Pointee type. When you add to or subtract from an UnsafeMutablePointer instance, the result is a new pointer of the same type, offset by that number of instances of the Pointee type. 型付ポインタでのポインタ算術は、ポインタのもつPointee型のストライドで勘定されます。あなたがUnsafeMutablePointerインスタンスに加えたりそれから引いたりする場合、結果は同じ型の新しいポインタです、Pointee型のインスタンスの数によってオフセットします。


// 'intPointer' points to memory initialized with [10, 20, 30, 40]
let intPointer: UnsafeMutablePointer<Int> = ...


// Load the first value in memory
let x = intPointer.pointee
// x == 10


// Load the third value in memory
let offsetPointer = intPointer + 2
let y = offsetPointer.pointee
// y == 30

You can also use subscript notation to access the value in memory at a specific offset. あなたはまた、添え字表記法を使ってメモリ中の値に特定のオフセットでアクセスできます。


let z = intPointer[2]
// z == 30

Implicit Casting and Bridging 暗黙的なキャストとブリッジ

When calling a function or method with an UnsafeMutablePointer parameter, you can pass an instance of that specific pointer type or use Swift’s implicit bridging to pass a compatible pointer. 関数やメソッドをUnsafeMutablePointerパラメータとともに呼び出すとき、あなたはその特定のポインタ型のインスタンスを渡すか、またはSwiftの暗黙的ブリッジを使って互換ポインタを渡すことが可能です。

For example, the printInt(atAddress:) function in the following code sample expects an UnsafeMutablePointer<Int> instance as its first parameter: 例えば、printInt(atAddress:)関数は以下のコード例において、UnsafeMutablePointer<Int>インスタンスをそれの最初のパラメータとして期待します。


func printInt(atAddress p: UnsafeMutablePointer<Int>) {
    print(p.pointee)
}

As is typical in Swift, you can call the printInt(atAddress:) function with an UnsafeMutablePointer instance. This example passes intPointer, a mutable pointer to an Int value, to print(address:). Swiftでは普通であるように、あなたはprintInt(atAddress:)関数をUnsafeMutablePointerインスタンスとともに呼び出せます。この例はintPointerInt値への可変ポインタをprint(address:)に渡します。


printInt(atAddress: intPointer)
// Prints "42"

Alternatively, you can use Swift’s implicit bridging to pass a pointer to an instance or to the elements of an array. The following example passes a pointer to the value variable by using inout syntax: あるいはまた、あなたはSwiftの暗黙的ブリッジを使ってポインタをインスタンスへまたは配列の要素へと渡せます。以下の例は、value変数へのポインタをinout構文を使って渡します:


var value: Int = 23
printInt(atAddress: &value)
// Prints "23"

A mutable pointer to the elements of an array is implicitly created when you pass the array using inout syntax. This example uses implicit bridging to pass a pointer to the elements of numbers when calling printInt(atAddress:). 配列の要素への可変ポインタは、あなたが配列をinout構文を使って渡す時に暗黙的に作成されます。この例は、暗黙的ブリッジを使ってポインタをnumbersの要素へと、printInt(atAddress:)を呼び出す時に渡します。


var numbers = [5, 10, 15, 20]
printInt(atAddress: &numbers)
// Prints "5"

No matter which way you call printInt(atAddress:), Swift’s type safety guarantees that you can only pass a pointer to the type required by the function—in this case, a pointer to an Int. あなたがprintInt(atAddress:)を呼び出す方法は問題ではありません、Swiftの型安全は、あなたが関数によって要求される型へのポインタを渡すことだけが可能であるのを保証します — この場合、Intへのポインタ。

Topics 話題

Type Aliases 型エイリアス

Initializers イニシャライザ

Instance Properties 様々なインスタンスプロパティ

Instance Methods インスタンスメソッド

Type Methods 型メソッド

Subscripts 添え字

Operator Functions 演算子関数

Relationships 関係

Conforms To 次に準拠

See Also 参照

Typed Pointers 型付ポインタ