二維陣列動態分布空間

2021-07-05 04:53:28 字數 1170 閱讀 1706



下面三種定義形式怎麼理解?怎麼動態分配空間?

(1)、int **ptr;

(2)、int *ptr[ 5 ]; 我更喜歡寫成 int* prt[5];

(3)、int ( *ptr )[ 5 ];

此文引自網上,出處不詳,但是覺得非常好。略改了一點。

例子:c語言:

//動態分配二維陣列空間

//由此分配的二維陣列空間並非是連續的

//可以使用m_pptable[row][col]來給該二維陣列賦值

//其中 0<=row

//釋放所分配的記憶體空間

int **a;

a=(int **)calloc(sizeof(int *),n);

for (i=0;i   a[i]=(int *)calloc(sizeof(int),n);

這樣就可以了

使用的時候就和普通的二維陣列一樣

最後用for(i=0;i   cfree(a[i]);

cfree(a);釋放記憶體

就可以了

(2)、int *ptr[ 5 ]

這樣定義的話,編譯器已經為它分配了 5 個指標的空間,這相當

於(1)中的第一次記憶體分配。根據對(1)的討論可知,顯然要對其進行一次

記憶體分配的。否則就是"野"指標。

(3)、int ( *ptr )[ 5 ]

這種定義我覺得很費解,不是不懂,而是覺得理解起來特別吃力,

也許是我不太習慣這樣的定義吧。怎麼描述它呢?它的意義是"一群"

指標,每個指標都是指向乙個 5 個整數的陣列。如果想分配 k 個指標,

這樣寫: ptr = ( int ( * )[ 5 ] ) new int[ 5 * k ]。

這是一次性的記憶體分配。分配好以後,ptr 指向一片連續的位址空間,

其中 ptr[ 0 ] 指向第 0 個 5 個整數陣列的首位址,ptr[ 1 ] 指向第

1 個 5 個整數陣列的首位址。

綜上所述,我覺得可以這樣理解它們:

int ** ptr <==> int ptr[ x ][ y ];

int *ptr[ 5 ] <==> int ptr[ 5 ][ x ];

int ( *ptr )[ 5 ] <==> int ptr[ x ][ 5 ];

這裡 x 和 y 是表示若干的意思。

二維動態陣列

之前都是寫的小程式,一直用的靜態陣列,也沒出現問題。可是,最近碰到大型程式和工程,這時就要用動態陣列了。因為靜態陣列時儲存在棧中的,而動態陣列儲存在堆中。計算機的棧只有1m大小,而堆可以理論上達到計算機記憶體大小,可見當大型工程資料量非常大時,必須使用動態陣列了。c 的動態陣列的建立和刪除要用到ne...

動態建立二維陣列

c 中用new動態建立二維陣列的格式一般是這樣 type p n new type n 其中,type是某種型別,n是二維陣列的列數。採用這種格式,列數必須指出,而行數無需指定。在這裡,p的型別是type n 即是指向乙個有n列元素陣列的指標。還有一種方法,可以不指定陣列的列數 int p p ne...

動態開闢二維陣列

近日寫到乙個程式,用到了要動態開闢二維陣列,一想,自己就會兩種。一者 用new在堆上開闢 二者 用vector開闢。技巧沒有多少,但是確實是折騰了我半天!首先,大家去網上搜一下,動態開闢二維陣列的文章特別多,再加上我這篇就更多了,我本不想寫這篇博文的。但看了網上各位 大蝦 大牛 寫的,覺得還是有必要...