Swift 中的指针

Pointers in Swift

我试图理解指针在 Swift 中的使用,特别是:Unsafe[Mutable]PointerUnsafeRaw[Mutable]Pointer。我有几个关于这个问题的问题。

  1. UnsafePointer <T>等于const T * Pointer吗? UnsafeMutablePointer <T> 等于 C 中的 T * Pointer?

  2. Unsafe[Mutable]PointerUnsafeRaw[Mutable]Pointer有什么区别?

  3. 为什么这样编译

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

var a: Int = 1
receive(pointer: &a) // prints 1

但这给了我一个错误?

var a: Int = 1
var pointer: UnsafePointer<Int> = &a // error : Cannot pass immutable value of type 'Int' as inout argument
  1. Is UnsafePointer <T> equal to const T * Pointer in ? and UnsafeMutablePointer <T> is equal to T * Pointer in C?

好吧,在 Swift 应用程序中使用桥接 header 看看 C 指针是如何桥接的:

const int *myInt;
int *myOtherInt;

连接到

var myInt: UnsafePointer<Int32>!
var myOtherInt: UnsafeMutablePointer<Int32>!
  1. What is the difference between Unsafe[Mutable]Pointer and UnsafeRaw[Mutable]Pointer?

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

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

感谢 Martin 的帮助评论,此语法在 Swift 中从未有效,并且没有安全的方法来创建 "free pointers" 到 Swift 变量。