动态定义数组
首先:為什么需要?jiǎng)討B(tài)定義數(shù)組呢?
? 這是因?yàn)?#xff0c;很多情況下,在預(yù)編譯過程階段,數(shù)組的長度是不能預(yù)先知道的,必須在程序運(yùn)行時(shí)動(dòng)態(tài)的給出
? 但是問題是,c++要求定義數(shù)組時(shí),必須明確給定數(shù)組的大小,要不然編譯通不過?
?
? 如: int Array[5];正確
?????? int i=5;
?????? int Array[i]; 錯(cuò)誤 因?yàn)樵诰幾g階段,編譯器并不知道 i 的值是多少
?? 那么,我們?cè)撊绾谓鉀Q定義長度未知的數(shù)組呢?
?? 答案是:new 動(dòng)態(tài)定義數(shù)組?
?? 因?yàn)閚ew 就是用來動(dòng)態(tài)開辟空間的,所以當(dāng)然可以用來開辟一個(gè)數(shù)組空間
???
?? 這樣,下面的語句:
??? int size=50;
??? int *p=new int[size]; 是正確的
?
?? 但是二維動(dòng)態(tài)數(shù)組能不能也這樣定義呢
???
? int size=50,Column=50;
? int (*p)[Column]=new int [size][Column]
? 這樣的語句,編譯器通不過,為什么呢?
? 首先 new int[size][Column] 就是動(dòng)態(tài)生成時(shí)確定的,所以它沒有錯(cuò)
? 那么就是 int(*p)[Column],這句有問題了,這句為什么不對(duì)呢, 那是因?yàn)?#xff0c;這是一個(gè)定義語句,而定義語句先經(jīng)過編譯器進(jìn)行編譯,當(dāng)編譯器運(yùn)行到此處時(shí),發(fā)現(xiàn)Column 不是常數(shù),因此不能通過編譯。 而之所以編譯器認(rèn)為Column 不是常數(shù),是因?yàn)榫幾g階段,編譯器起的作用是查語法錯(cuò)誤,和預(yù)分配空間,它并不執(zhí)行程序,因此,沒有執(zhí)行那個(gè)賦值語句(只是對(duì)這個(gè)語句檢查錯(cuò)誤,和分配空間),因此編譯階段,它將認(rèn)為column 是個(gè)變量。所以上面的二維數(shù)組定義是錯(cuò)誤的, 它不能通過編譯。
? 改成這樣:
? int size=50
? int (*p)[50]=new int [size][50]
? 便正確了。
?? 由此可見,這種動(dòng)態(tài)分配數(shù)組,僅對(duì)一維數(shù)組空間是真正動(dòng)態(tài)分配的。
?? 但是如何真正的動(dòng)態(tài)分配二維數(shù)組呢,即如果Column 也不能預(yù)先知道的話,該如何處理呢?
???
?? 上面的動(dòng)態(tài)分配已經(jīng)不能滿足我們的要求,因?yàn)樯厦鎰?dòng)態(tài)分配只對(duì)一維數(shù)組是真正動(dòng)態(tài)的,對(duì)二維數(shù)組的話,必須編譯之前預(yù)先知道二維數(shù)組每一列的長度,而這個(gè)長度在很多情況下是不能預(yù)先知道的,所以我們得結(jié)合其他方法來解決這個(gè)問題。
???
?? 既然一維是真正的動(dòng)態(tài)分配的話,那我們利用這一特性定義一個(gè)指針數(shù)組。
???
?? int **p= new int*[size];//定義指針數(shù)組?
?? int *p[5];//? 假若知道二維數(shù)組的行數(shù)為5
?? 然后對(duì)指針數(shù)組中的每一個(gè)指針分配一個(gè)一維數(shù)組空間,這樣便動(dòng)態(tài)定義了二維數(shù)組
??
?? 事實(shí)上,我認(rèn)為指針數(shù)組的主要用途,就在于動(dòng)態(tài)定義多維數(shù)組
????
??? for(int i=0;i<size;i++)
?? {
???? p[i]=new int[Column];
?? }
???
?? 運(yùn)行完畢后,一個(gè)二維數(shù)組便被動(dòng)態(tài)的成功建立
-----------------------------------
?
例子:
?
?? size =6;
?
?? column =5
?
?? int **p=new int*[size];
?
??? for(int i=0;i<size;i++)
?? {
???? p[i]=new int[Column];
?? }
?
?
?
所生成的動(dòng)態(tài)數(shù)組如下圖所示:
?
?
?
???
? 最后 ,因?yàn)檎{(diào)用了new, 千萬千萬別忘記在用完之后,將其所占資源 delete 掉
?
? 下面是delete方法:
?
?
?
??? for(int i=0;i<size;i++)
?? {
???????????delete []??p[i];?? // 要在指針前加[]?, 否則的話 只釋放p[i]所指的第一個(gè)單元所占的空間
?? }
?
?? delete [] p;???? //最后不要忘掉 釋放掉開辟的指針數(shù)組? :》
轉(zhuǎn)載于:https://www.cnblogs.com/yyxayz/p/4110872.html
總結(jié)
- 上一篇: GeoPoint与LocationDat
- 下一篇: 设计模式(17) 访问者模式(VISIT