下面三種定義形式怎麼理解?怎麼動態分配空間?
(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開闢。技巧沒有多少,但是確實是折騰了我半天!首先,大家去網上搜一下,動態開闢二維陣列的文章特別多,再加上我這篇就更多了,我本不想寫這篇博文的。但看了網上各位 大蝦 大牛 寫的,覺得還是有必要...