int arr [] = {69, 1, 12, 10, 20, 113};
Run Code Online (Sandbox Code Playgroud)
当我做的时候会发生什么
int x = a[3];
Run Code Online (Sandbox Code Playgroud)
????
我总是觉得这a[3]意味着:
“ 从内存地址开始arr。向前走3个内存地址。获取该内存地址表示的整数。 ”
但是后来我对哈希表如何工作感到困惑。因为如果将哈希表实现为“存储桶”的数组(如教授在本讲座中所说:https : //www.youtube.com/watch?v= UPo- M8bzRrc),那么您仍然必须走到存储桶你需要; 因此,它们的访问效率不比数组高。
有人可以帮我清理一下吗?
将内存想象成一个大的两列表表:
+---------+-------+
| ADDRESS | VALUE |
+---------+-------+
| ... | ... |
+---------+-------+
| 100 | 69 | <-- &arr[0] is 100
+---------+-------+
| 101 | 1 |
+---------+-------+
| 102 | 12 |
+---------+-------+
| 103 | 10 | <-- &arr[3] is 103
+---------+-------+
| 104 | 20 |
+---------+-------+
| 105 | 113 |
+---------+-------+
| ... | ... |
+---------+-------+
Run Code Online (Sandbox Code Playgroud)
我想强调的是,这是一个高度简化的模型,但它应该能让您了解正在发生的事情。您的计算机知道您的数组从地址 100开始。而且,由于给定数组中的所有元素大小相同,因此您可以通过在起始地址上添加 +3 来轻松访问数组的第三个元素。计算机不需要“走到”数组的第三个元素,它只是获取存储在内存地址100 + 3处的值。
如果您想查看实际的示例,请编译并运行以下代码:
#include <iostream>
using namespace std;
int main() {
int a[] = { 1, 2, 3 };
cout << "Address of a:\t\t" << &a[0] << endl;
cout << "Address of a[2]:\t" << &a[2] << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
记下a的地址。假设您的计算机使用 32 位整数,您应该看到a[2]的地址只是a + 2*4的地址。它添加 2*4 而不仅仅是 2 的原因是因为每个整数实际上使用 4 个字节的内存(即单个值将跨越 4 个地址)。