我试图理解Swift中指针的使用,特别是:Unsafe[Mutable]Pointer
和UnsafeRaw[Mutable]Pointer
。关于这个问题,我有几个问题。
UnsafePointer <T>
是否等于const T * Pointer
?并且UnsafeMutablePointer <T>
等于C中的T * Pointer
Unsafe[Mutable]Pointer
和UnsafeRaw[Mutable]Pointer
有什么区别?
为什么要编译
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
答案 0 :(得分:4)
- 醇>
UnsafePointer <T>
是否等于const T * Pointer
?并且UnsafeMutablePointer <T>
等于C中的T * Pointer
好吧,在Swift应用程序中使用桥接头来查看C指针是如何桥接的:
const int *myInt;
int *myOtherInt;
连接
var myInt: UnsafePointer<Int32>!
var myOtherInt: UnsafeMutablePointer<Int32>!
- 醇>
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中永远不会有效,并且没有安全的方法来创建&#34;自由指针&#34;到Swift变量。