Swift 数组地址与 &array[0] 不同

Swift array address is not same as &array[0]

Document 说:

但是当我运行下面的代码时:

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 中的数组具有值语义,而不是 C 或 Objective-C 中数组的引用语义。你看到不同地址(和所有地址)的原因是每次你将数组作为参数传递时,你实际上是在告诉 Swift 将你的 Array 结构桥接到 NSArray.

这里

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

此外,将 in-out 表达式传递给函数 可以 制作临时副本,例如 .