動態配置陣列&二維陣列

好啦我知道第一篇是這個很超過XD,但不打會忘記…。我有空再把基礎補完…
談到動態配置陣列不得不談到指標和陣列的真正關係,很多人都認為C++裡面的指標可有可無,那是在小程式的時候,想要sort直接用函數中的qsort,根本不知道qsort也就是快速搜尋法是由指標來實作的。說了那麼多,只是想強調一下指標的重要!

陣列其實就是指標的應用!

宣告一個陣列其實是一個指標,看一下接下來的範例

//宣告一個擁有4個integer的陣列,分別是10,11,12,13
int data[4]={10,11,12,13};
for(int i=0;i<4;i++)
    cout << data[i] <<  ;
cout << endl;

輸出會得到 10 11 12 13,但如果我們直接呼叫data呢?

cout << data << endl;

將會得到一個記憶體位址(如0x22ff74)這樣的字串,代表著其實data這個陣列名稱本身是一個存放位址的「指標常數」,它指向陣列的位址。所以事實上陣列是由指向某組單元記憶體的指標加上該記憶體組成的。

動態配置陣列的原理是先定一個新的指標(須符合陣列的類型),再將陣列實作,以下是範例

int *data;
cin >> n; //輸入n
data=new int[n];   //向系統申請n個int大小(4bytes)的記憶體位置
for(int i=0;i<n;i++)  //使用方法跟一般陣列一樣,直接呼叫data即可
cout << data[i] <<   ; //印出陣列內容
delete data; //最後記得要釋放所申請的空間

而動態二維陣列其實和一維差不多,只是使用時腦袋要轉一下才會,以下範例

int **num;
int width,height;
cin >> width;  //輸入width
num=new int *[width];
//上面的*[width]是指向一塊4*width*4bytes的地方
//(簡單說是指向一個一維陣列,和二維陣列本身設計一樣)
for(int i=0;i<width;i++)
{
cin >> height; 
//輸入width指向的陣列的height,也就是說每個height的size可以不同!
num[i]=new int [height]; 
//向系統申請height個int大小(4bytes)的記憶體位置
}
for(int i=0;i<width;i++)
delete num[i]; //先釋放每個width指向的陣列
int data[n]; //最後再釋放儲存width本身的陣列

動態配置陣列在考題中常常出現喔!在之前我還不會動態配置時(主因還是不想動指標…)

cin >> n;
int data[n];

這樣的確可以解決一維動態配置問題,但二維的處理就一定需要動態配置了,還是說有其他方法但我不知道的?歡迎討論喔!而二維最近我碰到的問題即是:NTUCSIE 2008第3題
我是用動態配置將牌堆全部讀進來後再處理的,不知道有沒有更好的Algorithm?