在内存中计算二维数组
Computing two dimensional arrays in memory
首先,这是一个我不太确定的家庭作业问题。
const int TABLES = 10;
const int SEATS = 4;
Order diningRoom[TABLES][SEATS];
假设数组diningRoom从内存位置8000开始。如何用字节手工计算元素diningRoom[5][2]
的地址?
A. 8000 + TABLES * 5 + 2
B. 8000 + sizeof(Order * TABLES * 2 + 5)
C. 8000 + sizeof(Order) * 5 * 2
D. 8000 + sizeof(Order) * (SEATS * 5 + 2)
我想答案是D,但我只是想在提交之前问一下SO。
D是正确答案
数组在内存中是连续排列的所以你的数组在内存中会显示为
Order diningRoom[10][4] == Order diningRoom[40]
0) Order | Order | Order | Order
1) Order | Order | Order | Order
2) Order | Order | Order | Order
3) Order | Order | Order | Order
4) Order | Order | Order | Order
5) Order | Order | Order | Order
6) Order | Order | Order | Order
7) Order | Order | Order | Order
8) Order | Order | Order | Order
9) Order | Order | Order | Order
因为你对diningRoom[5][2]
感兴趣你实际上是在问diningRoom[SEATS*5 + 2]
0) Order | Order | Order | Order
1) Order | Order | Order | Order
2) Order | Order | Order | Order
3) Order | Order | Order | Order
4) Order | Order | Order | Order
5) Order | Order |[Order]| Order
6) Order | Order | Order | Order
7) Order | Order | Order | Order
8) Order | Order | Order | Order
9) Order | Order | Order | Order
答案可能更类似于正确的解决方案是C,但这实际上是错误的,因为它没有考虑到数组跨步,即SEATS*sizeof(Order)
解决方案A不包含任何Order
对象的大小。
=>是错误的。
sizeof(Order * TABLES * 2 + 5)
在溶液B中没有意义。
首先,类Order
不能与整数相乘…
=>是错误的。
如果C是正确的,diningRoom[1][2]
和diningRoom[2][1]
在相同的内存位置。
=>是错误的。
所以是d
如果我们将Order diningRoom[2][4];
想象为
[0][0] [0][1] [0][2] [0][3]
[1][0] [1][1] [1][2] [1][3]
it's this in memory:
[0][0] [0][1] [0][2] [0][3] [1][0] [1][1] [1][2] [1][3]
现在应该很容易看出为什么D是正确的。
对于元素[x][y],必须跳过x个完整的"行",
每行有4个元素(在我的例子中)
相关文章:
- 将值从二维数组输出到文本文件
- 在二维数组中查找最小值和最大值?
- 移动二维数组中的字符
- 如何正确填充在堆上分配的二维数组?
- 传递二维数组时出现问题
- 具有随机数的二维数组不会更改
- 如何在C++中获取二维数组中最少的一列数?
- 如何使用用户输入变量制作二维数组?
- C++ 中动态二维数组的访问冲突
- 遍历二维数组的所有子数组
- 将二维数组的所有元素插入到一维数组中
- 在函数中传递二维数组
- 如何使用二维数组来计算和存储来自其他数组的值的频率
- 二维数组:计算行的总和和列的乘积
- 二维数组计算公式
- 从导入的二维数组计算平均值
- 在内存中计算二维数组
- 通过二维数组计算文件中的特定记录
- 二维数组,计算并存储6个随机连接点
- 如何在c++中输出二维数组的偶数列索引并对其进行计算