1. C語言動態分配二維數組(1)已知第二維Code-1
char (*a)[N];//指向數組的指標a = (char (*)[N])malloc(sizeof(char *) * m);printf("%d/n", sizeof(a));//4,指標printf("%d/n", sizeof(a[0]));//N,一維數組free(a);
(2)已知第一維Code-2
char* a[M];//指標的數組int i;for(i=0; i<M; i++)a[i] = (char *)malloc(sizeof(char) * n);printf("%d/n", sizeof(a));//4*M,指標數組printf("%d/n", sizeof(a[0]));//4,指標for(i=0; i<M; i++) free(a[i]);
(3)已知第一維,一次分配記憶體(保證記憶體的連續性)Code-3
char* a[M];//指標的數組int i;a[0] = (char *)malloc(sizeof(char) * M * n);for(i=1; i<M; i++)a[i] = a[i-1] + n;printf("%d/n", sizeof(a));//4*M,指標數組printf("%d/n", sizeof(a[0]));//4,指標free(a[0]);
(4)兩維都未知Code-4
char **a;int i;a = (char **)malloc(sizeof(char *) * m);//分配指標數組for(i=0; i<m; i++){a[i] = (char *)malloc(sizeof(char) * n);//分配每個指標所指向的數組}printf("%d/n", sizeof(a));//4,指標printf("%d/n", sizeof(a[0]));//4,指標for(i=0; i<m; i++){free(a[i]);}free(a);
(5)兩維都未知,一次分配記憶體(保證記憶體的連續性)Code-5
char **a;int i;a = (char **)malloc(sizeof(char *) * m);//分配指標數組a[0] = (char *)malloc(sizeof(char) * m * n);//一次性分配所有空間for(i=1; i<m; i++){a[i] = a[i-1] + n;}printf("%d/n", sizeof(a));//4,指標printf("%d/n", sizeof(a[0]));//4,指標free(a[0]);free(a);
2.C++動態分配二維數組(1)已知第二維Code-6
char (*a)[N];//指向數組的指標a = new char[m][N];printf("%d/n", sizeof(a));//4,指標printf("%d/n", sizeof(a[0]));//N,一維數組delete[] a;
(2)已知第一維Code-7
char* a[M];//指標的數組for(int i=0; i<M; i++) a[i] = new char[n];printf("%d/n", sizeof(a));//4*M,指標數組printf("%d/n", sizeof(a[0]));//4,指標for(i=0; i<M; i++) delete[] a[i];
(3)已知第一維,一次分配記憶體(保證記憶體的連續性)Code-8
char* a[M];//指標的數組a[0] = new char[M*n];for(int i=1; i<M; i++)a[i] = a[i-1] + n;printf("%d/n", sizeof(a));//4*M,指標數組printf("%d/n", sizeof(a[0]));//4,指標delete[] a[0];
(4)兩維都未知Code-9
char **a;a = new char* [m];//分配指標數組for(int i=0; i<m; i++){a[i] = new char[n];//分配每個指標所指向的數組}printf("%d/n", sizeof(a));//4,指標printf("%d/n", sizeof(a[0]));//4,指標for(i=0; i<m; i++)delete[] a[i];delete[] a;
(5)兩維都未知,一次分配記憶體(保證記憶體的連續性)Code-10
char **a;a = new char* [m];a[0] = new char[m * n];//一次性分配所有空間for(int i=1; i<m; i++){a[i] = a[i-1] + n;//分配每個指標所指向的數組}printf("%d/n", sizeof(a));//4,指標printf("%d/n", sizeof(a[0]));//4,指標delete[] a[0];delete[] a;
多說一句:new和delete要注意配對使用,即有多少個new就有多少個delete,這樣才可以避免記憶體流失!
3.靜態二維數組作為函數參數傳遞如果採用上述幾種方法動態分配二維數組,那麼將對應的資料類型作為函數參數就可以了。這裡討論靜態二維數組作為函數參數傳遞,即按照以下的調用方式:int a[2][3];func(a);C語言中將靜態二維數組作為參數傳遞比較麻煩,一般需要指明第二維的長度,如果不給定第二維長度,則只能先將其作為一維指標傳遞,然後利用二維數組的線性儲存特性,在函數體內轉化為對指定元素的訪問。首先寫好測試代碼,以驗證參數傳遞的正確性:(1)給定第二維長度Code-11
void func(int a[][N]){printf("%d/n", a[1][2]);}
(2)不給定第二維長度Code-12
void func(int* a){printf("%d/n", a[1 * N + 2]);//計算元素位置}
注意:使用該函數時需要將二維數組首地址強制轉換為一維指標,即func((int*)a); 總結:(一)二維都不知——c語言 int **p;
int i;
//申請空間
p = (int**)malloc(sizeof(int*)*M);
for (i=0; i<M; i++)
p[i] = (int*)malloc(sizeof(int)*N);
//釋放空間
for (i=0; i<M; i++)
free(p[i]);
free(p);