如何解决Swift阵列地址与&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
为什么他们的地址不同?
解决方法
这里
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表达式传递给函数 可以创建临时副本,例如参见Swift: always copies on inout?。
,Swift中的数组具有值语义,而不是C或Objective-C中数组的引用语义。之所以看到不同的地址(和地址),是因为每次将数组作为参数传递时,实际上是在告诉Swift将Array结构桥接到NSArray实例。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。