2012-10-10 108 views
1

我已經訓練/作業創建施加到C下面的公式:如何創建此公式?

如何計算地址到一個元素中的整數的矩陣,如果 基質的起始地址是已知的,其尺寸是已知的,並且行和列的元素是已知的。

說出矩陣是[B] [C]。 起始地址是a或等效地&a[0][0]

行數是b。

列數是c。

每個元素都應該有大小sizeof(int)這樣的話地址將a + b*sizeof(int) + a*sizeof(int)

是這個公式是否正確?

+1

所有你需要的驗證是一個矩陣是如何存儲在C.你的推理是完美的。 – keyser

+0

@Keyser事實上,似乎矩陣是按行存儲的,首先是整個第一行等等。感謝您的評論。 –

回答

1

假設你有int array[b][c],你需要找到元素array[i][j]的地址。

a + i * c * sizeof(int) + j * sizeof(int) 

其中,c * sizeof(int)似乎是一個行大小,所以對於這樣的通式是

array_start + i * row_size + j * item_size 
1

假設數組存儲行優先,這意味着,如果你有:

int array[N][M]; 

然後,首先你有Mint s對應於array[0],那麼你有Mint s對應array[1]等。

因此:

  • array[0][c]地址爲:(char *)array + 1 * M * sizeof(int) 因爲有M INT爲array[0](char *)array + c * sizeof(int)
  • array[1][0]地址由下式給出。的​​
  • 地址爲:(char *)array + 1 * M * sizeof(int) + c * sizeof(int)
  • array[2][0]地址爲:(char *)array + 2 * M * sizeof(int)
  • 你可以希望現在看到的模式。 array[r][c]的地址由(char *)array + r * M * sizeof(int) + c * sizeof(int)r * M給出,第一行爲r行,然後爲c列。

有關2D存儲器佈局的更多說明,您可以看到this answer。同樣的答案還包含動態數組的內存佈局。

1

這裏是另一種方式來想一想:

首先計算該元素的指標,用這個公式計算

i = c + r * w 

其中c爲列,r爲行和w是寬度基質/ 2D陣列(列數)

再乘上一個整數的大小,即讓您從存儲器基地址

012的元件的偏移

最後,添加基地址:

addr = base + offset 

這樣的公式是:

addr = base + (c+r*w) * sizeof(int)