You are on page 1of 11

2-1 陣列及陣列位址的計算

 
宣告 int list[5];

如果每個元素大小為 len 個 bytes

list[0] 19 list[0] 的位址是 X


list[1] 21 list[1] 的位址是 X + 1  len
list[2] 5 list[2] 的位址是 X + 2  len
list[3] 115 :
list[4] 28 list[k] 的位址是 X + k  len

陣列的元素在記憶體中是連續的位置。
 
list[0] 是陣列 list 的頭一個元素。
list[1] 是編號 1 號元素,它緊接著 0 號元素。同樣
的, list[i+1] 的位置是緊接著 list[i] 的。
例 2.1 有一整數陣列 int A[60]; 則此陣列
共佔多少位元組(設
sizeof(int)=2 )?
若 A[0] 在記憶體中的位址為 A[0]
03C416 ,則元素 A[20] 的位址為何? A[1]
  A[2] 位

A 陣列共佔 60  2 = 120 (bytes) ﹋
﹋ ﹋
﹋ 量
A[20]
A[20] 的位址 = A[0] 的位址 + 位移量

﹋ ﹋

= 03C416 + (20 – 0 )  2 A[59]

= 03C416 + 2816

= 03EC16
 
 
二維陣列在邏輯上表示為平面 實體排列順序是線性的

以列為主 以行為主
0 1 2 3 4
(row major) (column major)
0        
1   19     (0,0) (0,0)
2         (0,1) (1,0)
3 25       (0,2) (2,0)
4         (0,3) (3,0)
5         (0,4) (4,0)
6 ×5 (1,0) (5,0)
(1,1) (0,1)
(1,1)
第 1 列第 2 行: List[1][2] 值
是 19 ﹋ ﹋ ﹋ ﹋
第 3 列第 1 行: List[3][1] 值 ﹋ ﹋ ﹋ ﹋
是 25 (5,3) (4,4)
(5,4) (5,4)

 
如果每個元素大小為 len 個 bytes ,而且 list[0][0] 的位址為 X ,則:

◎ list[0][3] 的位址是 X + (3 – 0)  len = X + 3  len

◎ list[4][3] 的位址是 X + ((4 - 0)  5 +(3 - 0))  len = X + (4  5 +3) 


len
因為 list[4][3] 之前有 4 整列(每列有 5 個元素),加 3 個元素
將其整理為通式,若有陣列 list[r][c] :
◎ 假設 list[0][0] 的位址是 X m  c : 整塊
n : 長條區域 矩形區域
則 list[m][n] 的位址

= X + ((m - 0)  c + (n - 0))  len


= X + (m  c + n)  len 0 … n-1 n … c-1
0
r c

× +
m-1
m n
m (m,n
)
m×c+n …
r-1
rc
例 2.3 假設有一宣告為 float A[8][10] 的浮點數陣列,則:
此陣列共佔多少位元組(設 sizeof(float) = 4 )?
若 A[0][0] 在記憶體中的位址為 03C416 ,
則元素 A[0][9] 的位址為何?元素 A[6][5] 的位址為何?
 
1. 陣列 A 共佔 8 10  4 = 320 (bytes)
2. A[0][9] 的位址 = A[0][0] 的位址 + 位移量
= 03C416 + (0  10 + 9 )  4
= 03C416 + 2416
= 03E816
 在 A[0][9] 之前有 9 個元素 ( A[0][0] ~ A[0][8] )
3. A[6][5] 的位址 = A[0][0] 的位址 + 位移量
= 03C416 + (610 + 5 ) 4
= 03C416 + 10416
= 04C816
 在 A[6][5] 之前有 6 整列加 5 個元素 = 610 + 5 = 65 個元
三維陣列 A[C1][C2][C3] ,我們可以想像三維陣列是由小方塊疊成的立方體:

  C3

C2 共有 C1 層
每層共有
C2 ×C3 個
 
  C1
 
 
 
 
  A[a][b][c] 的位址計算:在它之上有整整 a 層,同一層中在它之前有整整 b 列,
 
  而同列中在它之前有 c 個元素。因此 A[a][b][c] 拉成線性相當於距離 A[0][0]
 
  [0] 有 ( a × C2 × C3 + b × C3 + c ) 個元素
C1 C2 C3
× + ×
+
a b c

((a ×C2) + b) ×C3) + c = a × C2× C3 + b × C3 + c


Example 1
• 有一個三維陣列 A(-3:2, -2:3, 0:4) ,以 row-major 方式排列,
陣列的起始位址是 318 ,試求 A(1, 3, 3) 所在的位址。
– layer: 2 – (-3) + 1 = 6
– row: 3 – (-2) + 1 = 6
– column: 4 – (0) + 1 = 5
– i = 1-(-3)=4----layer
– j = 3-(-2)=5----row
– k =3-(0)=3-----col
– (i*row*col + k*row + j) * sizeof(datatype) =
– (4*6*5+3*6+5) * 4 =143*4=(572)10=(28C)16
– (318)16+(28C)16=(5A4)16

7
2-3 二維陣列及矩陣的儲存與運算

二維陣列可以用來儲存數學的矩陣及行列式,因此可以
用來解決諸如 “解連立方程組” 等線性代數問題

數學習慣表示法 資料結構示意圖
 
  4行
  a00 a01 a02 a03
a00 a01 a02 a03
  3列
a10 a11 a12 a13 a10 a11 a12 a13
 
  a20 a21 a22 a23 3 ×4 a20 a21 a22 a23
特徵: B[j][i] = A[i][j] ( 行列顛倒 )

a00 a01 . . a0(n-1) a00 a10 . . a (m-1)0


a10 a11 . . a1(n-1) a01 a11 . . a (m-1)1
A= ... B= At = ...
a(m-1)0 . . a(m-1)(n-1) a0(n-1) . . a(n-1)(m-1)
m×n n×m

1 2 3
1 4 7 10
A= 4 5 6
B= At = 2 5 8 11
7 8 9
3 6 9 12
10 11 12
3×4
4×3
特徵: C[i][j] = A[i][j] + B[i][j]

a00 a01 . . a0(n-1) b00 b01 . . b0(n-1)


a10 a11 . . a1(n-1) b10 b11 . . b1(n-1)
...
+ ...
a(m-1)0 . . a(m-1)(n-1) m×n b(m-1)0 . . b(m-1)(n-1) m×n

a00+b00 a01+ b01 . . a0(n-1)+ b0(n-1) a10+b10


= a11+ b101 . . a1(n-1)+ b1(n-1)
..
a(m-1)0+b(m-1)0 a(m-1)1+ b(m-1)1 ‧‧
a(m-1)(n-1)+b(m-1)(n-1)
m×n

1 2 3 0 1 2 1 3 5

4 5 6 3 4 5 7 9 11
+ =
7 8 9 6 7 8 13 15 17

10 11 12 9 10 11 19 21 23
4×3 4×3 4×3
Am×n × Bn×t = Cm×t

c00 是 A 矩陣的第 0 列向量乘上 B 矩陣的第 0 行向量

 
b t
c00 = [a00 a01 ‧‧‧ a0(n-1) ]  00
b10
  ‧‧‧

  b(n-1)0
 
= a00 × b00 + a01 × b10 + ‧‧‧ + a0(n-1) × b(n-1)0 (n 個乘法 )
n-1

= Σ a0k ×bk0
k=0

cij 是 A 矩陣的第 i 列向量乘上 B 矩陣的第 j 行向量

n-1
特徵: cij = Σ aik  bkj
k=0

You might also like