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
为什么他们的地址不同?
最佳答案
这里
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? .
关于Swift 数组地址与 &array[0] 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63583244/