A(m,n)橫向為行,縱向為列。
給予兩個已知位置,求A[i, j]之位址,須自行判斷出Row或Column-major
Row-Major時,列數較大的元素 ⇒ 位址必較大
Row-Major時,列數較小的元素 ⇒ 位址必較小
Column-Major時,行數大的元素 ⇒ 位址必較大
Column-Major時,行數小的元素 ⇒ 位址必較小
以列為主 |
左右 在前 |
A[i,j] = Lo + (i * n + j) * d |
以行為主 |
上下 在後 |
A[i,j] = Lo + (i + j * m )* d |
A[0, 2]的位址是 98,A[2, 0]的位址為 108,每一元素大小為 1,第一個元素為 A[0, 0],請問 A[3, 2]的位址為何?
L+0*n+2=98=>L=96
L+2*n+0=108=>96+2n=108 =>n=6
96+3*6+2=96+18+2=116
2. 在程式中,宣告一個陣列(array)為int k[m][n],假設陣列k的每個元素所佔記憶體空間為4個單位,陣列k的第一個元素為k[0][0],若k[2][4]及k[4][2]的記憶體位址分別為302和238,請問k[0][0]的記憶體位址為 150
38.(B)設陣列a是一個大小為20的一維陣列,且陣列a在記憶體之起始位置為100,且每個元素都需要4個位元組的儲存空間。則陣列元素a[21]的記憶體位置為何?(A) 180 (B) 184 (C) 186 (D) 188
ANS
0-21=>22 =>(22-1)*4=84=>84+100=184(這題比較有問題)
在C語言中,宣告一個二維陣列int A[2][2],該陣列的第1個元素為0x4D12,則其最後一個元素的位址為何: 【答:0x4D1E 】
ANS
配置的記憶體長度在不同編譯器上各不相同,可容納的大小各不相同,例如,在 64 位元 Ubuntu 16.04 中的 gcc 編譯器下,int 與 long 為 8 位元組,在 Windows 10 使用 MinGW-w64,GNU 編譯器版本是 8.1.0 型態的話,int 與 long 為 4 位元組,長度越長,表示可表示的整數值範圍越大。
用手算即可
4D12+4 =>4D16+4=>4D1A+4=>4D1E
=====
三維陣列
8. 一個三維陣列A[0~3,0~6,0~4]用來存放整數,假設每一個陣列元素包含兩個記憶體位置,以row-major排列,若A[2][4][0]開始於記憶體位置1100,請問A[1][5][2]開始於記憶體位置?___1044_______ ANS 1100-(25+3)*2=1100-56=1044
68.(C) 假設A[1…5,1…6,1…6]為三維陣列(3-dimensional array),其中每個元素是以列為優先(row-major)的排列方式連續地儲存在電腦的記憶體中。若A的每個元素佔1個記憶體位置,且已知A[4, 6, 6]儲存位址為300,則此陣列中的元素A[2, 5, 3]會被存放在那個位址?
(A)157 (B)177 (C)219 (D)244
ANS : 36(黄)+6*6(紅)+5+4(綠)=81 =>300-81=219