Swift 中的指针

2024-03-14

我试图了解 Swift 中指针的使用,特别是:Unsafe[Mutable]Pointer and UnsafeRaw[Mutable]Pointer。我对这个问题有几个问题。

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

  2. 有什么区别Unsafe[Mutable]Pointer and UnsafeRaw[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>等于const T * Pointer在 ?和UnsafeMutablePointer <T>等于T * Pointer in C?

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

const int *myInt;
int *myOtherInt;

桥梁到

var myInt: UnsafePointer<Int32>!
var myOtherInt: UnsafeMutablePointer<Int32>!
  1. 有什么区别Unsafe[Mutable]Pointer and UnsafeRaw[Mutable]Pointer?

Swift 3 添加了一个不安全RawPointer API https://github.com/apple/swift-evolution/blob/master/proposals/0107-unsaferawpointer.md来替换Unsafe[Mutable]Pointer<Void>类型。 Swift 中不再允许不同类型的指针之间的转换。相反,API 提供了接口(.assumingMemoryBound(to:) or .bindMemory(to:capacity:)) 将内存绑定到类型。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 中的指针 的相关文章

随机推荐