我在IBM Swift Sandbox上写了一些简短的代码,遇到了一个令人困惑的问题
我试图获取数组元素的地址:
func printMemory(ptr: UnsafePointer<Int>){
print("At memory:\(ptr)")
}
var arr: [[Int]] = [
[0,1,2,3,4],
[0,1,2],
[0]
]
printMemory(&arr[0][0])
printMemory(&arr[1][0])
此代码的输出具有相同的地址 通过改变&#34; UnsafePointer&#34; to&#34; UnsafeMutablePointer&#34;会解决这个问题,但我不知道为什么会发生这种情况 为什么我首先得到相同的地址以及占用该地址的是什么?
我遇到的另一个问题:
另外,如果我只将最后两行代码更改为:
printMemory(&arr[0])
printMemory(&arr[0][1])
编译将通过。
我预测我会得到一个错误,表示arr [0]的[Int]类型与UnsafePointer中的Int类型不匹配。但是没有警告
而且,这两个地址相距很远。我无法解释原因
通过使用&#34; UnsafeMutablePointer&#34;在printMemory()中会得到更近的地址
我想我需要解释为什么这个编译会通过,为什么地址就像这样
对不起,我的英语语法不好,谢谢你的回复!
答案 0 :(得分:-1)
回答你的第一个问题:
最有可能的是,编译器实现了这些数组之间共享的公共元素,并且只在内存中创建了一个数组[0,1,2,3,4]
,并且两个切片充当[0,1,2]
和[0]
而实际上不需要保留它们在内存中冗余。