Array and pointer
固定大小的array宣告:
例如:
float A[11];
const int n = 22;
int B[n];
離開scope就自動消失.
Pointer(指針)的宣告
例如:
n
float* A; // A是一個
float pointer
n
float *A; // 或解釋成: A所指的值是一個 float
n
float * A; // 這樣也可以
但
n
float *A, B; // B是 float,不是 float pointer
n
float* A, B; // 還是的, B是 float,不是 float pointer
*: referencing operator
&: address-of operator
若 ptr 是一個 pointer, *ptr 就是 ptr所在位置的內容.
例如:
float a = 6.13;
float *p = &a; // p is the
address of a
cout << “Address: “ <<
p << “Content:” << *p << endl;
你就會看到十六進位的位址及內容.
Dynamic
Memory Allocation(動態記憶分配)
例如:
int n;
// n 的值(>0)在某處得到
n float *A = new float [n];
或
n
float
*A;
A = new float [n];
解釋成: A 是一個指著n個float的pointer.
new 出來的東西,不用時一定要 delete掉!
delete [] A;
或
double* b = new double;
// ..... b 不用了
delete b;
否則,所佔用的空間將一直被佔用著,直到程式終結!
練習: n為奇數.
生成 n
x
n Magic Square
(元素為 1,2,3,...,n^2 的方陣,其 任一行、任一列的總合 皆等於各斜對角的總合)
這裡有一個現成的規則:
從第一列的中間開始(設為1),下一個值(即2)放在緊鄰的右上方 - 不過,因為超出列界限,故放在最後一列.
依此規則 (將下一個值放在緊鄰的右上方) 繼續:
n 若此位置未超出行列界限:
若此位置尚未填入,則將下一個值放置於此,否則置於正下方
n 若此位置僅超出列界限,則置於同行最後一列
n 若此位置僅超出行界限,則置於同列最前一行
n 若此位置同時超出行與列界限,則放在正下方.