C語言中動態(tài)分配二維數(shù)組_第1頁
C語言中動態(tài)分配二維數(shù)組_第2頁
C語言中動態(tài)分配二維數(shù)組_第3頁
C語言中動態(tài)分配二維數(shù)組_第4頁
C語言中動態(tài)分配二維數(shù)組_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、C語言中動態(tài)分配二維數(shù)組在C中動態(tài)分配內(nèi)存的,對于單個變量,字符串,一維數(shù)組等,都是很容易的。C中動態(tài)分配二維數(shù)組的方法,很少有C語言書中描述,我查找了有的C語言書中提到了一個方法:假定二維數(shù)組的維數(shù)為MN分配是可以這樣:     int   *ptr=new   int*M; /這是先動態(tài)分配一個包含有M個指針的數(shù)組,即指先分配一個針數(shù)組  /指針數(shù)組的首地址保存在ptr中  for(int   i=0;i<M;i+)         &

2、#160;   ptri=new   intN; /為指針數(shù)組的每個元素賦一個地址,/這個地址是指向一維數(shù)組的地址,也即是為針元數(shù)組的每個元素分配一個數(shù)組    一個源代碼的例子為: int *pMatrix = new int*row; for(int i = 0; i < row; i+)      pMatrixi  = new intcolumn;    for(int j = 0; j < co

3、lumn; j+)            pMatrixij = (i+j); /簡單的初始化      這樣創(chuàng)建一個數(shù)組有個嚴(yán)重的問題,就是它的內(nèi)存不連續(xù),行與行之間的內(nèi)存不連續(xù),雖然可以用ij下標(biāo)訪問,無法滿足用指向二維數(shù)組元素型別的指針變量來訪問整個數(shù)組的要求. 例如不能如下訪問每個二維數(shù)組元素:  int * p = NULL; for(p = pMatrix0; p  < pMatrix0+colum

4、n * row; p+)      int fff = *(pme); 而這種訪問方式對于真正的二維數(shù)組是完全可以的。出現(xiàn)這種原因就是因為行與行之間的內(nèi)存不連續(xù)造成的。所以,這中方式創(chuàng)建的動態(tài)二維數(shù)組,不是真正意義上的二維數(shù)組。那么什么是真正的二維數(shù)組呢?C語言中的二維數(shù)組在內(nèi)存組織形式是按行存儲的連續(xù)的內(nèi)存區(qū)域。所以,必須保證數(shù)組元素是按行存儲的,而且也是最重要的是內(nèi)存要連續(xù)。所以,我寫出了如下的一個方法:假定二維數(shù)組的元素變量類型是MyType;可以是C語言接受的除void之外的任何類型,因為編譯器不曉得void類型的大??;例如i

5、nt,float,double等等類型; int row = 2; /暫假定行數(shù)是2,這個可以在運行時刻決定; int column = 3;/暫假定列數(shù)是2,這個可以在運行時刻決定;   void *ptdhead = NULL; /在后面說明為什么要用void*類型   void *ptdBody = NULL;/在后面說明為什么要用void*類型   ptdhead = (void *)malloc(sizeof(void*)*row + sizeof(MyType)*row*column

6、);   if(!ptdhead)    return FALSE;   ptdBody = ptdhead + row ;       for(int ncount = 0; ncount < row; ncount+)         ptdheadncount = ptdBody + ncount * column* sizeof(MyType)/sizeof(void*);

7、   MyType*ptdheadRealse;   ptdheadRealse = (MyType*)ptdhead;/強制轉(zhuǎn)換為自己程序需要的二維數(shù)組元素類型的指針   ptdhead = NULL;   for(int i = 0; i < row; i+ )        for(int j = 0; j< column; j+)          

8、0;  ptdheadRealseij = i+j;  /進行簡單的初始化;        這樣的一種方法動態(tài)分配的二維數(shù)組,內(nèi)存是連續(xù)的,是真正意義的C語言二維數(shù)組,滿足所有二維數(shù)組訪問的方法,而且內(nèi)存利用效率高,程序性能好。這樣一種分配方法要理解的是一下一點概念:體會,只要是指針都可以帶,不管使直接指針,還是間接指針,都可以用下標(biāo),只要使指針就可以了,這個很關(guān)鍵;另外就是要明白void*的指針是不能夠用于加減法的,因為系統(tǒng)不曉得一個void型的大小,但是void*指針卻是可以進行加減法,進行

9、指針偏移的,因為void*型大小使知道的,所以,編譯器使可以計算出偏移地址的。由于void型,系統(tǒng)不曉得大小,所以,void *p = (void*)malloc(3); 編譯器無法通過如 void *q = p+3;我們知道假設(shè)一個整型變量nCont在32位機器上是4個字節(jié),q是指向nCont的指針變量,q的值,也就是nCont的地址是0x00032ec0,那么q+1的值為0x0x00032ec0+1*4,這是C語言中計算指針表達(dá)式值的方法。即q+1的值為q+1*sizeof(int);從這里,我們可以理解為什么我們用void*作為動態(tài)分配內(nèi)存函數(shù)返回的類型,因為,如果返回的是void*類型

10、,我們無法計算地址的偏移量,即無法計算出數(shù)組首元素的地址,也就是數(shù)組的地址。當(dāng)然,我們可以不用void*,可以用除了void*的任何C中內(nèi)嵌的簡單類型,不過如果考慮使用起來簡單,方便,那么我覺得還是懸著用void*,或者char*;選擇char*類型方便的是,char類型的大小是1,那么元素的個數(shù),即等于地址的偏移量。構(gòu)建實例一維#include <stdio.h> #include <stdlib.h> int main() int n1,i; int *array; puts("輸入一維長度:"); scanf("%d",&a

11、mp;n1); array=(int*)malloc(n1*sizeof(int);/第一維 for(i=0;i<n1;i+) arrayi=i+1; printf("%dt",arrayi); free(array);/釋放第一維指針 return 0; 二維#include <stdlib.h> #include <stdio.h> int main() int n1,n2; int *array,i,j; puts("輸入一維長度:"); scanf("%d",&n1); puts(&quo

12、t;輸入二維長度:"); scanf("%d",&n2); array=(int*)malloc(n1*sizeof(int*); /第一維 for(i=0;i<n1; i+) arrayi=(int*)malloc(n2* sizeof(int);/第二維 for(j=0;j<n2;j+) arrayij=i+j+1; printf("%dt",arrayij); puts(""); for(i=0;i<n1;i+) free(arrayi);/釋放第二維指針 free(array);/釋放第一維

13、指針 return 0; 三維#include <stdlib.h> #include <stdio.h> int main() int n1,n2,n3; int *array; int i,j,k; puts("輸入一維長度:"); scanf("%d",&n1); puts("輸入二維長度:"); scanf("%d",&n2); puts("輸入三維長度:"); scanf("%d",&n3); array=(int*)

14、malloc(n1*sizeof(int*);/第一維 for(i=0; i<n1; i+) arrayi=(int*)malloc(n2*sizeof(int*); /第二維 for(j=0;j<n2;j+) arrayij=(int*)malloc(n3*sizeof(int); /第三維 for(k=0;k<n3;k+) arrayijk=i+j+k+1;printf("%dt",arrayijk); puts(""); puts(""); for(i=0;i<n1;i+) for(j=0;j<n2

15、;j+) free(arrayij);/釋放第三維指針 for(i=0;i<n1;i+) free(arrayi);/釋放第二維指針 free(array);/釋放第一維指針 return 0; 四維#include <stdlib.h> #include <stdio.h> int main() int n1,n2,n3,n4; int *array; int i,j,k,m; puts("輸入一維長度:"); scanf("%d",&n1); puts("輸入二維長度:"); scanf(&q

16、uot;%d",&n2); puts("輸入三維長度:"); scanf("%d",&n3); puts("輸入四維長度:"); scanf("%d",&n4); array=(int*)malloc(n1*sizeof(int*);/第一維for(i=0; i<n1; i+) arrayi=(int*)malloc(n2*sizeof(int*); /第二維 for(j=0;j<n2;j+) arrayij=(int*)malloc(n3*sizeof(int*);

17、/第三維 for(k=0;k<n3;k+) arrayijk=(int*)malloc(n4*sizeof(int);/第四維 for(m=0;m<n4;m+) arrayijkm=i+j+k+m+1; printf("%dt",arrayijkm); puts(""); puts(""); puts(""); for(i=0;i<n1;i+) for(j=0;j<n2;j+) for(k=0;k<n3;k+) free(arrayijk);/釋放第四維指針 for(i=0;i<

18、n1;i+) for(j=0;j<n2;j+) free(arrayij);/釋放第三維指針 for(i=0;i<n1;i+) free(arrayi);/釋放第二維指針 free(array);/釋放第一維指針 return 0; 以三維整型數(shù)組arrayn1n2n3為例。 先遵循從外層到里層,逐層申請的原則: 最外層指針是array,它是個三維指針,所指向的是array,其為二維指針。所以給array(三維指針) 申請內(nèi)存應(yīng): array=(int*)calloc(n1,sizeof(int*); 次層指針是array,它是個二維指針,所指向的是array,其為一維指針。所以給array(二維指針)申請內(nèi)存應(yīng): for(i=0;i<n1;i+) arrayi=(int*)calloc(n2,sizeof(int*); 最內(nèi)層指針是array,它是個一維指針,所指向的是array,其是個整型常量。所以給ar

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論