2015-09-23 98 views
1

首先,這是一個我不太確定的作業問題。給出的下列:在內存中計算二維數組

const int TABLES = 10; 
const int SEATS = 4; 
Order diningRoom[TABLES][SEATS]; 

假設陣列餐室開始於存儲器位置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,但我只是想提出之前,我提交。

+1

是,d是正確的。 – deviantfan

回答

1

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,但其實是錯誤的,因爲它沒有保持到the array stride,即SEATS*sizeof(Order)

0

解決方案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] 

的正是這種內存:

[0][0] [0][1] [0][2] [0][3] [1][0] [1][1] [1][2] [1][3] 

現在,應該是很容易明白爲什麼d是正確的。
對於元素[X] [Y],X滿 「行」 必須被跳過,
和每行有4個元素(在我的例子)