【问题标题】:Swift array address is not same as &array[0]Swift 数组地址与 &array[0] 不同
【发布时间】:2020-08-25 16:29:10
【问题描述】:

Document 说:

  • 一个包含可变变量、属性或 Type 类型下标引用的输入输出表达式,它作为指向左侧标识符地址的指针传递。
  • [Type] 值,作为指向数组开头的指针传递。

但是当我运行以下代码时:

func print<Type>(unsafePointer pointer: UnsafePointer<Type>) {
    print("\(pointer) ==> \(pointer.pointee) : \(Type.self)")
}

var array = [1, 2, 3, 4]
print(unsafePointer: array)
print(unsafePointer: &array[0])

我明白了

0x0000000104204240 ==> 1 : Int
0x00007ffeefbff440 ==> 1 : Int

为什么他们的地址不同?

【问题讨论】:

标签: swift unsafe-pointers


【解决方案1】:

这里

print(unsafePointer: array)

指向数组存储的第一个元素的指针被传递给函数。还有这里

print(unsafePointer: &array[0])

在数组上调用下标运算符(返回Int)并将那个(临时)整数的地址传递给函数,而不是存储原始数组元素的地址。

如果你调用函数两次,这会变得更加明显:

var array = [1, 2, 3, 4]

print(unsafePointer: array)     // 0x00007ffeefbff2e0
print(unsafePointer: array)     // 0x00007ffeefbff2e0, same as previous address

print(unsafePointer: &array[0]) // 0x00007ffeefbff320
print(unsafePointer: &array[0]) // 0x00007ffeefbff340, different from previous address

此外,将输入输出表达式传递给函数可以制作临时副本,例如Swift: always copies on inout?

【讨论】:

    【解决方案2】:

    Swift 中的数组具有值语义,而不是 C 或 Objective-C 中数组的引用语义。您看到不同地址(以及根本地址)的原因是,每次您将数组作为参数传递时,您实际上是在告诉 Swift 将您的 Array 结构桥接到 NSArray 的实例。

    【讨论】:

    • Array 如果你将它传递给一个带有 NSArray 参数的 Objective-C 函数,它就会被桥接到 NSArray。但这不是这里发生的事情。
    猜你喜欢
    • 1970-01-01
    • 2011-12-03
    • 2021-11-28
    • 2016-12-06
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多