我已經訓練/作業創建施加到C下面的公式:如何創建此公式?
如何計算地址到一個元素中的整數的矩陣,如果 基質的起始地址是已知的,其尺寸是已知的,並且行和列的元素是已知的。
說出矩陣是[B] [C]。 起始地址是a
或等效地&a[0][0]
行數是b。
列數是c。
每個元素都應該有大小sizeof(int)
這樣的話地址將a + b*sizeof(int) + a*sizeof(int)
是這個公式是否正確?
我已經訓練/作業創建施加到C下面的公式:如何創建此公式?
如何計算地址到一個元素中的整數的矩陣,如果 基質的起始地址是已知的,其尺寸是已知的,並且行和列的元素是已知的。
說出矩陣是[B] [C]。 起始地址是a
或等效地&a[0][0]
行數是b。
列數是c。
每個元素都應該有大小sizeof(int)
這樣的話地址將a + b*sizeof(int) + a*sizeof(int)
是這個公式是否正確?
假設你有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
假設數組存儲行優先,這意味着,如果你有:
int array[N][M];
然後,首先你有M
int
s對應於array[0]
,那麼你有M
int
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。同樣的答案還包含動態數組的內存佈局。
這裏是另一種方式來想一想:
首先計算該元素的指標,用這個公式計算
i = c + r * w
其中c爲列,r爲行和w是寬度基質/ 2D陣列(列數)
再乘上一個整數的大小,即讓您從存儲器基地址
012的元件的偏移最後,添加基地址:
addr = base + offset
這樣的公式是:
addr = base + (c+r*w) * sizeof(int)
所有你需要的驗證是一個矩陣是如何存儲在C.你的推理是完美的。 – keyser
@Keyser事實上,似乎矩陣是按行存儲的,首先是整個第一行等等。感謝您的評論。 –