斯威夫特的指针

时间:2017-02-22 14:27:32

标签: swift pointers unsafe-pointers unsafemutablepointer

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

  1. UnsafePointer <T>是否等于const T * Pointer?并且UnsafeMutablePointer <T>等于C中的T * Pointer

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

  3. 为什么要编译

  4. 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 个答案:

答案 0 :(得分:4)

  
      
  1. UnsafePointer <T>是否等于const T * Pointer?并且UnsafeMutablePointer <T>等于C中的T * Pointer
  2.   

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

const int *myInt;
int *myOtherInt;

连接

var myInt: UnsafePointer<Int32>!
var myOtherInt: UnsafeMutablePointer<Int32>!
  
      
  1. Unsafe[Mutable]PointerUnsafeRaw[Mutable]Pointer之间的区别是什么?
  2.   

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

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

感谢Martin的有用评论,这种语法在Swift中永远不会有效,并且没有安全的方法来创建&#34;自由指针&#34;到Swift变量。