C 用new建立二維陣列的方法

2021-08-14 18:22:28 字數 1690 閱讀 5734

問題**

在c++中,陣列可以被視為一種型別——但是,不存在『二維陣列』這種型別。二維陣列本身會被解釋成乙個一維陣列:這個陣列的元素型別為另一種一維陣列。比如int[2][3]這個二維陣列,它會被編譯器視作乙個元素型別為『int[3]』的一維陣列。並且,『int[3]』和'int[4]'會被當成不同的資料型別。

假設a, b為兩個int型變數,如果你希望這樣生成乙個二維陣列:new int[a][b],是不會得到編譯器允許的——因為你沒有指定這個陣列的元素型別。由於b的大小未知,編譯器無法確定『int[b]』到底是乙個什麼型別。所以,要用new建立乙個二維陣列,這其中有講究。

方法一:使用常量

接上:如果將b指定為乙個常量,例如new int[a][5],其實質與new int[a]建立乙個動態陣列並無多大區別——只是元素型別由int變為了'int[5]'而已。

示例**:

[cpp]view plain

copy

void

testfunc_(unsigned 

intn)  

}  // **方法和普通動態陣列相同,使用'delete'即可

delete

array2d;  

}  用這個方法來建立二維陣列,比較直觀、易用,但它最大的限制在於:你必須在編譯時確定b的大小。

方法二:使用指標間接引用

首先建立若干個大小一致的動態陣列,然後將這些陣列的首位址(轉化為指標)按順序儲存到乙個動態陣列中,就相當於模擬了乙個二維動態陣列。

示例**:

[cpp]view plain

copy

void

testfunc_pointer(unsigned 

intheight, unsigned 

intwidth)  

// 訪問.

for(i=0; i

}  // 首先**低一級的動態陣列.

for(i=0; i

// 然後**高一級的動態陣列.

delete

array2d;  

}  這個方法實現了兩個維度的動態建立,訪問也比較方便。但是有乙個缺點:由於低一級的陣列是分開建立的,所以整個二維陣列的記憶體不連續——類似『array2d[i * width + j]』這樣的訪問就不要使用了,容易造成訪問越界。

方法三:使用vector

借助stl中的vector,我們可以很直觀的建立乙個二維陣列,而不需要用到基本陣列的概念。

示例**:

[cpp]view plain

copy

void

testfunc_vector(unsigned 

intheight, unsigned 

intwidth)  

for(i=0; i

}  delete

parray2d;  

}  可以看到,在vector這個『更高階』的陣列幫助下,我們能夠很輕易的建立二維陣列。稍微美中不足的是由於引入了stl,程式會變得更大一些——但基本不影響執行速度。

*************************=end*************************===

C 用new建立二維陣列的方法

方法一 使用常量 接上 如果將b 即列數 指定為乙個常量,例如new int a 3 其實質與new int a 建立乙個動態陣列並無多大區別 只是元素型別由int變為了 int 3 而已。示例 用這個方法來建立二維陣列,比較直觀 易用,但它最大的限制在於 你必須在編譯時確定b的大小 int mai...

new動態建立二維陣列的方法

1.a ga n new a m n delete ga 缺點 n 必須是已知 優點 呼叫直觀,連續儲存,程式簡潔 經過測試,析構函式能正確呼叫 2.a ga new a m for int i 0 i m i ga i new a n for int i 0 i m i delete ga i d...

C 使用new建立二維陣列

include using namespace std void main 以上是一般的程式,需要注意的是,記憶體空間的劃分是5行10列,但是p的維度是按照列,而不是按照行宣告的。在自己編寫benchmark,執行在cpu上時,預期是宣告16 128的陣列,這樣每行是128 4 因為int 4byt...