2016-09-17 68 views
0

有一個陣列[3] [4]和我們必須找到的一個[2] [2]使用行優先順序1001作爲基地址地址。我發現兩個公式找到了該地址:查找2D陣列單元存儲器位置

For any array a[M][N] Row Major Order: 

1) a[i][j] = Base Address+Datatype Size[(N*i)+j] 

2) a[i][j] = Base Address+Datatype Size[N*(i-1)+(j-1)] 

我試用過的公式,但第一個得到正確的結果,但沒有第二個。這裏是我發現了一個[2] [2]使用行優先順序的地址:

Using Formula 1: 

a[2][2] = 1001+2[(4*2)+2] 
     = 1001+2[10] 
     = 1001+20 
     = 1021 (correct answer) 

Using Formula 2: 

a[2][2] = 1001+2[4*(2-1)+(2-1)] 
     = 1001+2[4+1] 
     = 1001+2[5] 
     = 1001+10 
     = 1011 (Wrong Answer) 

有沒有在我的第二個公式的任何錯誤或有我做錯了使用第二個公式計算?爲什麼兩個答案都不一樣?

+2

的列數它們都如何能夠正確?他們嚴格**不同**! – Amit

+0

@確定,如果它們不同,那麼何時使用哪個公式? –

回答

1

爲阿米特說,該公式是不同的,所以他們不會給相同的結果。當曾經在關於這樣的問題,疑問,嘗試把一些數字的公式和嘗試出來的,所以如果我們試圖尺寸爲4的數組,在位置2,2

公式1:(N * I )+ J,(4 * 2)+ 2 = 10

方程2:N *(I - 1)+(j - 1)= 9

你可以看到,因爲它們不是相同的結果,這個問題是不是在你的代碼,但公式本身

如果你感覺勇敢,你也可以嘗試用歸納證明以及

要查找的內存地址數,你還需要知道一個整數多少內存空間佔用,以及。您可以使用sizeof(int);來完成此操作,該操作將輸出整數在系統上使用的字節數。

你還需要知道如何數組的數組在內存格式化。就像普通數組一樣,數組數組是連續的,這意味着數組元素之間在內存中沒有間隙。所以數組a [2] [2] {1,2},{3,4}將被格式化爲這樣。 1,2,3,4,

使用此你應該能夠用下面的方程式address location of array a[I][j] = B + W * [N * (I- Lr) + (J - Lc)]在哪裏可以找到的存儲器位置: B是基地址 我是你正在尋找的 元件的行標J是您正在查找的列元素 W是元素的大小 Lr是行的下限 - 如果未給出,則爲0 Lc是列的下限 - 如果未給出則爲0 M是數字矩陣 N中的行的是矩陣

+0

那麼什麼時候使用哪個公式?有什麼方法可以確定使用哪個方程式? –

+0

如果你想要一個數組位置,你還需要「廉政」類型的內存使用最多考慮,它可以在不同的系統有所不同的內存地址數量。生病編輯我的答案,包括更多關於這個 – Crimson

+0

信息再次編輯額外的信息和一個固定的方程 – Crimson