版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quá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語言中計算指針表達式值的方法。即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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 國際合作融資協(xié)議書(2篇)
- 云南藝術(shù)學(xué)院《最優(yōu)化理論與算法Ⅱ》2023-2024學(xué)年第一學(xué)期期末試卷
- 二零二五年度章筠離婚案件中商標(biāo)權(quán)益分配協(xié)議3篇
- 二零二五年度生態(tài)環(huán)保型房屋建設(shè)質(zhì)量保修合同3篇
- 二零二五年度房屋交易-買賣雙方隱私保護協(xié)議3篇
- 2024版航空公司飛機采購合同
- 2025屆高考地理一輪復(fù)習(xí)熱點滾動測一含解析
- 二零二五年度石油勘探與開發(fā)技術(shù)服務(wù)合同2篇
- 二零二五年度生態(tài)環(huán)保工程居間服務(wù)協(xié)議3篇
- 人教版六年級(上)語文作業(yè)本全冊答案
- 工程材料(構(gòu)配件)設(shè)備清單及自檢結(jié)果表
- 滬教版 三年級數(shù)學(xué)上冊 圖形與幾何習(xí)題2
- 大使涂料(安徽)有限公司年產(chǎn)6萬噸科技型工業(yè)涂料、水性環(huán)保涂料生產(chǎn)項目環(huán)境影響報告書
- 利樂包和康美包的比較
- 法院執(zhí)行庭長供職報告1400字
- 推動架機械加工工序卡片
- 重慶市綦江區(qū)篆塘鎮(zhèn)白坪村建筑用砂巖礦采礦權(quán)評估報告
- 甘肅社火100首歌詞
- 行政查房情況記錄表
- GB/T 2315-2000電力金具標(biāo)稱破壞載荷系列及連接型式尺寸
- 腹主動脈瘤的護理查房
評論
0/150
提交評論