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  若此位置同時超出行與列界限,則放在正下方.

可執行範例