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

标签 swift unsafe-pointers

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/

相关文章:

ios - 使用 UIGraphicsImageRenderer 绘制图像时为什么要使用大量内存?

ios - 在日历 View 中禁用所有其他日期

memory - 为什么在使用不安全的 Rust 访问超出范围的变量时没有段错误?

swift3 - 将 NSUUID 转换为 UnsafePointer<UInt8>

swift - 如何在 Swift 3 中将 __NSMallocBlock__ 转换为其基础类型?

swift - 调度队列以在 ARKit 中为 SCNNode 设置动画

ios - UITableViewCells 中的复选标记显示不正确

ios - 快速无效计时器不起作用

c指针递减安全/不安全?

ios - 如何在 MPSImageDilate 中编写一个 float 类型的不安全指针