Swift中的指针

ema*_*cos 5 pointers unsafe-pointers swift unsafemutablepointer

我正在尝试了解Swift中指针的使用,尤其是:Unsafe[Mutable]PointerUnsafeRaw[Mutable]Pointer。关于这个问题,我有几个问题。

  1. UnsafePointer <T>等于const T * Pointer在?和UnsafeMutablePointer <T>等于T * Pointer在C 2

  2. Unsafe[Mutable]Pointer和之间有什么区别UnsafeRaw[Mutable]Pointer

  3. 为什么编译

func receive(pointer: UnsafePointer<Int> ) {
    print("param value is: \(pointer.pointee)")
}

var a: Int = 1
receive(pointer: &a) // prints 1
Run Code Online (Sandbox Code Playgroud)

但这给我一个错误?

var a: Int = 1
var pointer: UnsafePointer<Int> = &a // error : Cannot pass immutable value of type 'Int' as inout argument
Run Code Online (Sandbox Code Playgroud)

JAL*_*JAL 6

  1. 等于UnsafePointer <T>const T * Pointer? 并UnsafeMutablePointer <T>等于T * PointerC 中的?

那么,在 Swift 应用程序中使用桥接标头来查看 C 指针是如何桥接的:

const int *myInt;
int *myOtherInt;
Run Code Online (Sandbox Code Playgroud)

桥梁到

var myInt: UnsafePointer<Int32>!
var myOtherInt: UnsafeMutablePointer<Int32>!
Run Code Online (Sandbox Code Playgroud)
  1. Unsafe[Mutable]Pointer和 和有什么区别UnsafeRaw[Mutable]Pointer

Swift 3 添加了UnsafeRawPointer API来替换Unsafe[Mutable]Pointer<Void>类型。Swift 中不再允许不同类型的指针之间的转换。相反,API 提供接口(.assumingMemoryBound(to:).bindMemory(to:capacity:))将内存绑定到类型。

对于问题 3,& 符号表示变量是inout我不相信你可以将变量声明为,inout除非它被直接修改底层内存的函数使用,但我会让专家纠正我。相反,使用withUnsafePointer.

感谢 Martin 的有用评论,这种语法在 Swift 中永远无效,并且没有安全的方法来创建指向 Swift 变量的“自由指针”。

  • `var point: UnsafePointer&lt;Int&gt; = &amp;a` 从来都不是有效的,并且您的“解决方法”是不安全的:传递给 `withUnsafePointer` 闭包的指针仅在闭包执行期间有效。它不能传递到闭包的外部。– 你*不能*(安全地)自由地传递指向 Swift 变量的指针。 (2认同)