[前言]c++的new操作符是該語言乙個非常好的語法特性,然而實際使用中卻發現new操作符有不少限制,為突出的一點便是用new操作符分配多維陣列空間時,不能讓陣列的每一維都動態可變。本文將對此提出乙個簡單直觀的解決方案,在乙個實際問題的簡化模型中加以說明,並以此釋清許多初學者對c++中new操作符與多維陣列的誤區。
1.問題的提出--多維可變陣列的實際用途
下面是實際程式設計中遇到問題的乙個簡化模型。chessboard是乙個棋盤類,其中的m_board是用來儲存棋盤上棋子資訊的二維陣列。dimension是棋盤的尺寸或者維數,因為要用於陣列宣告,所以它必須是乙個編譯期間可以確定其值的常量,這裡我們使用了無名列舉。對於不同種類棋的棋盤大小是不同的,對於黑白棋,dimension定義為8,對於五子棋,dimension應該為15,而圍棋呢,又得是19。對此這段**採用了條件編譯來確定dimension常量的值,以保證這段**具有較好的可重用性。
由於m_board必須是編譯期常量,於是在程式執行時刻m_board陣列的大小是不可改變的。如果程式中要同時實現黑白棋、五子棋和圍棋就不能這樣來做了--當然這樣有點誇張,不過就算光是圍棋也有9x9、13x13、19x19幾種棋盤,而且應當能讓使用者在程式執行時自由選擇。
class chessboard
;int m_board[dimension][dimension];
public:
/*其它成員函式
......*/}
對此我們必須用new操作符或者malloc函式在程式執行時刻為m_board動態分配空間,由於new支援更多的c++特性,因此我們的程式採用了new操作符。
2.msdn中用new申請多維陣列的說明--進一步認識new操作符
下面的**摘自msdn中的「new operator」,其中第二行在vc6.0中編譯將得到乙個錯誤資訊,對此msdn中的說明是new操作符返回的型別為float(*)[25][10],即指向float[25][10]的指標(去掉最左邊的一維)。正確**應當如3、4行所示。
1. float *fp;
2. fp = new float[10][25][10]; //錯
誤資訊:cannot convert from 'float (*)[25][10]' to 'float *'
3. float (*cp)[25][10];
4. cp = new float[10][25][10];
參考此**我們來考慮我們的棋盤問題,照葫蘆畫瓢我們可以得到如下**:
int (*m_board)[dimension]; //在類的成員變數中宣告
m_board = new int[changeable][dimension]; //根據使用者選擇來確定相應的changeable值
不難看出,由於仍然必須用編譯期常量dimension來宣告陣列,所以m_board陣列只能有一維可變,這種方法對我們的問題是毫無用處的。
3.解決方案
C 中的動態多維陣列
前言 c 的new操作符是該語言乙個非常好的語法特性,然而實際使用中卻發現new操作符有不少限制,為突出的一點便是用new操作符分配多維陣列空間時,不能讓陣列的每一維都動態可變。本文將對此提出乙個簡單直觀的解決方案,在乙個實際問題的簡化模型中加以說明,並以此釋清許多初學者對c 中new操作符與多維陣...
動態多維陣列
寫 的時候會碰到多維陣列的記憶體分配和釋放問題,在分配和釋放過程中很容易出現錯誤。下面貼上一些示例 以供參考。如果要給二維陣列 m n 分配空間,可以寫成下面 char a,i 先分配m個指標單元,注意是指標單元 所以每個單元的大小是sizeof char a char malloc m sizeo...
動態定義多維陣列
1.普通陣列的定義 維數 const unsigned int buf size 512,max files 20 int staff size 27 const unsigned sz get size char input buffer buf size ok,是const變數 string f...