Swift 数组地址与 &array[0] 不同
Swift array address is not same as &array[0]
Document 说:
- 包含可变变量 属性 或类型 Type 的下标引用的 in-out 表达式,它作为指向左侧标识符地址的指针传递。
- 一个
[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 中的数组具有值语义,而不是 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 表达式传递给函数 可以 制作临时副本,例如 .
Document 说:
- 包含可变变量 属性 或类型 Type 的下标引用的 in-out 表达式,它作为指向左侧标识符地址的指针传递。
- 一个
[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 中的数组具有值语义,而不是 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 表达式传递给函数 可以 制作临时副本,例如