C語言中動態數組的創建及引用
動態數組是相對於靜態數組而言的,靜態數組的長度是預定義好的,在整個程序中,一旦給定了數組大小后就無法改變,
,而動態數組則不然,它可以根據程序需要重新指定數組的大小。動態數組的內存空間是由堆動態分配的,通過執行代碼為其
分配儲存空間,只有程序執行到分配語句時,才為其分配儲存空間。
對於動態數組,其創建比靜態數組更麻煩一些,使用完必須由程序員自己釋放,否則將引起內存泄漏,但是其使用非常靈活,能根據程序需要動態分配大小,因此相對於靜態數組來說,使用動態數組的自由度更大。
對於動態數組的創建和引用我們尤其需要注意的便是它的創建原則。
動態數組的創建原則:從外層項里層創建,從里層向外層逐漸釋放。
下面通過代碼實例來看看:
一:一維動態數組
創建一維動態數組的一般格式:
類型說明符 * 數組名 = (類型說明符 * )malloc(數組長度 * sizeof(類型說明符));
代碼實例:
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main(void) 4 { 5 int n,i; 6 int *arr; 7 printf("請輸入所要創建的一維動態數組的長度:"); 8 scanf("%d",&n); 9 if((arr=(int *)malloc(n*sizeof(int)))==NULL) 10 { 11 printf("分配內存空間失敗,程序退出!"); 12 return 0; 13 } 14 for(i=0;i<n;i++) /*向申請成功的數組中賦值*/ 15 { 16 arr[i]=i+1; 17 printf("%d\t",arr[i]); 18 if(0==(i+1)%4) 19 printf("\n"); /*一行打印四個元素*/ 20 } 21 free(arr); /*切記!使用完后記得要釋放所申請的空間*/ 22 return 0; 23 }
該代碼的運行結果為:
請輸入所要創建的一維動態數組的長度:12 1 2 3 4 5 6 7 8 9 10 11 12
點評:程序先使用了malloc()函數向系統動態申請分配了sizeof(int)*n個字節的內存空間,然后將申請的內存空間視為一個
一維數組進行操作,當然,一維數組的申請並沒有體現動態數組的分配原則。請看下面的實例。
二:二維動態數組
創建二維動態數組的一般格式:
類型說明符 ** 數組名 = (類型說明符 ** )malloc (第一維長度*sizeof(類型說明符 * ));
例如:
arr=(int **)malloc(n1*sizeof(int *));
for(i=0;i<第一維長度;i++)
{
數組名[i] = (類型說明符 * )malloc(第二維長度*sizeof(類型說明符));
}
代碼實例:
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main(void) 4 { 5 int n1,n2,i,j; 6 int **arr; 7 printf("請輸入所要創建的動態數組的第一維長度:"); 8 scanf("%d",&n1); 9 printf("請輸入所要創建的動態數組的第二維長度:"); 10 scanf("%d",&n2); 11 if((arr=(int **)malloc(n1*sizeof(int *)))==NULL) /*第一維的創建*/ 12 { 13 printf("分配內存空間失敗,程序退出!"); 14 return 0; 15 } 16 for(i=0;i<n1;i++) /*創建第二維*/ 17 { 18 if((arr[i]=(int *)malloc(n2*sizeof(int)))==NULL) 19 { 20 printf("分配內存空間失敗,程序退出!"); 21 return 0; 22 } 23 } 24 for(i=0;i<n1;i++) 25 { 26 for(j=0;j<n2;j++) 27 { 28 arr[i][j]=i*n2+j+1; /*為申請成功的數組中賦值*/ 29 printf("%d\t",arr[i][j]); 30 } 31 printf("\n"); 32 } 33 for(i=0;i<n1;i++) 34 { 35 free(arr[i]); /*先釋放第二維*/ 36 } 37 free(arr); /*最后釋放第一維*/ 38 return 0; 39 }
該代碼的運行結果為:
請輸入所要創建的動態數組的第一維長度:4 請輸入所要創建的動態數組的第二維長度:3 1 2 3 4 5 6 7 8 9 10 11 12
總結:對動態數組的使用要有始有終,要牢記使用完后要及時釋放所申請的內存空間,避免造成內存泄漏。
在創建和釋放內存空間時要遵守原則:從外層向里層逐層創建,從里層向外層逐層釋放。
三:三維動態數組
通過前面一維和二維動態數組的創建實例學習,相信大家已經可以准確推測出三維動態數組的一般創建格式了,
沒錯,就是形如如下的形式:
類型說明符 *** 數組名 = (類型說明符 *** )malloc(第一維長度*sizeof(類型說明符 **));
例如:
arr=(int ***)malloc(n1*sizeof(int **));
for(i=0;i<第二維長度;i++)
{
數組名[i]=(類型說明符 **)malloc(第二維長度*sizeof(類型說明符 *));
for(j=0;j<第三維長度;j++)
{
數組名[i][j]=(類型說明符 *)malloc(第三維長度*sizeof(類型說明符));
}
}
代碼實例:
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main(void) 4 { 5 int n1,n2,n3,i,j,k; 6 int ***arr; 7 8 printf("請輸入所要創建的動態數組的第一維長度:"); 9 scanf("%d",&n1); 10 printf("請輸入所要創建的動態數組的第二維長度:"); 11 scanf("%d",&n2); 12 printf("請輸入所要創建的動態數組的第三維長度:"); 13 scanf("%d",&n3); 14 15 if((arr = (int ***)malloc(n1*sizeof(int **)))==NULL) /*第一維的創建*/ 16 { 17 printf("分配內存空間失敗,程序退出!"); 18 return 0; 19 } 20 for(i=0;i<n1;i++) 21 { 22 if((arr[i] = (int **)malloc(n2*sizeof(int *))) == NULL) /*第二維的創建*/ 23 { 24 printf("分配內存空間失敗,程序退出!"); 25 return 0; 26 } 27 for(j=0;j<n2;j++) 28 { 29 if((arr[i][j] = (int *)malloc(n3*sizeof(int))) == NULL) /*第三維的創建*/ 30 { 31 printf("分配內存空間失敗,程序退出!"); 32 return 0; 33 } 34 } 35 } 36 for(i=0;i<n1;i++) /*為申請成功的數組中賦值*/ 37 { 38 for(j=0;j<n2;j++) 39 { 40 for(k=0;k<n3;k++) 41 { 42 arr[i][j][k]= i * n1 + j * n2 + k ; 43 printf("%d\t",arr[i][j][k]); 44 } 45 printf("\n"); 46 } 47 printf("\n"); 48 } 49 /*內存的釋放*/ 50 51 for(i=0;i<n1;i++) 52 { 53 for(j=0;j<n2;j++) 54 { 55 free(arr[i][j]); /*釋放第三維*/ 56 } 57 } 58 59 for(i=0;i<n1;i++) 60 free(arr[i]); /*釋放第二維*/ 61 62 free(arr); /*釋放第一維*/ 63 64 return 0; 65 }
請輸入所要創建的動態數組的第一維長度:3 請輸入所要創建的動態數組的第二維長度:3 請輸入所要創建的動態數組的第三維長度:3 0 1 2 3 4 5 6 7 8 3 4 5 6 7 8 9 10 11 6 7 8 9 10 11 12 13 14
總結:可以看出,動態三維數組的創建與釋放與前面的一維和二維相類似,同樣要注意創建的原則。
大家可以看到,前面所說的一維,二維,三維動態數組都是一次性創建好的,如果在使用過程中要對數組進行擴展或者刪減該怎么辦呢?
那就要用到這個--可擴展動態數組。關於可擴展動態數組,我將在后續的文章中闡述。