




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C語(yǔ)言中動(dòng)態(tài)分配二維數(shù)組在C中動(dòng)態(tài)分配內(nèi)存的,對(duì)于單個(gè)變量,字符串,一維數(shù)組等,都是很容易的。C中動(dòng)態(tài)分配二維數(shù)組的方法,很少有C語(yǔ)言書(shū)中描述,我查找了有的C語(yǔ)言書(shū)中提到了一個(gè)方法:假定二維數(shù)組的維數(shù)為MN分配是可以這樣: int *ptr=new int*M; /這是先動(dòng)態(tài)分配一個(gè)包含有M個(gè)指針的數(shù)組,即指先分配一個(gè)針數(shù)組 /指針數(shù)組的首地址保存在ptr中 for(int i=0;i<M;i+) &
2、#160; ptri=new intN; /為指針數(shù)組的每個(gè)元素賦一個(gè)地址,/這個(gè)地址是指向一維數(shù)組的地址,也即是為針元數(shù)組的每個(gè)元素分配一個(gè)數(shù)組 一個(gè)源代碼的例子為: 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); /簡(jiǎn)單的初始化 這樣創(chuàng)建一個(gè)數(shù)組有個(gè)嚴(yán)重的問(wèn)題,就是它的內(nèi)存不連續(xù),行與行之間的內(nèi)存不連續(xù),雖然可以用ij下標(biāo)訪問(wèn),無(wú)法滿足用指向二維數(shù)組元素型別的指針變量來(lái)訪問(wèn)整個(gè)數(shù)組的要求. 例如不能如下訪問(wèn)每個(gè)二維數(shù)組元素: int * p = NULL; for(p = pMatrix0; p < pMatrix0+colum
4、n * row; p+) int fff = *(pme); 而這種訪問(wèn)方式對(duì)于真正的二維數(shù)組是完全可以的。出現(xiàn)這種原因就是因?yàn)樾信c行之間的內(nèi)存不連續(xù)造成的。所以,這中方式創(chuàng)建的動(dòng)態(tài)二維數(shù)組,不是真正意義上的二維數(shù)組。那么什么是真正的二維數(shù)組呢?C語(yǔ)言中的二維數(shù)組在內(nèi)存組織形式是按行存儲(chǔ)的連續(xù)的內(nèi)存區(qū)域。所以,必須保證數(shù)組元素是按行存儲(chǔ)的,而且也是最重要的是內(nèi)存要連續(xù)。所以,我寫(xiě)出了如下的一個(gè)方法:假定二維數(shù)組的元素變量類型是MyType;可以是C語(yǔ)言接受的除void之外的任何類型,因?yàn)榫幾g器不曉得void類型的大??;例如i
5、nt,float,double等等類型; int row = 2; /暫假定行數(shù)是2,這個(gè)可以在運(yùn)行時(shí)刻決定; int column = 3;/暫假定列數(shù)是2,這個(gè)可以在運(yùn)行時(shí)刻決定; void *ptdhead = NULL; /在后面說(shuō)明為什么要用void*類型 void *ptdBody = NULL;/在后面說(shuō)明為什么要用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;/強(qiáng)制轉(zhuǎn)換為自己程序需要的二維數(shù)組元素類型的指針 ptdhead = NULL; for(int i = 0; i < row; i+ ) for(int j = 0; j< column; j+)
8、0; ptdheadRealseij = i+j; /進(jìn)行簡(jiǎn)單的初始化; 這樣的一種方法動(dòng)態(tài)分配的二維數(shù)組,內(nèi)存是連續(xù)的,是真正意義的C語(yǔ)言二維數(shù)組,滿足所有二維數(shù)組訪問(wèn)的方法,而且內(nèi)存利用效率高,程序性能好。這樣一種分配方法要理解的是一下一點(diǎn)概念:體會(huì),只要是指針都可以帶,不管使直接指針,還是間接指針,都可以用下標(biāo),只要使指針就可以了,這個(gè)很關(guān)鍵;另外就是要明白void*的指針是不能夠用于加減法的,因?yàn)橄到y(tǒng)不曉得一個(gè)void型的大小,但是void*指針卻是可以進(jìn)行加減法,進(jìn)行
9、指針偏移的,因?yàn)関oid*型大小使知道的,所以,編譯器使可以計(jì)算出偏移地址的。由于void型,系統(tǒng)不曉得大小,所以,void *p = (void*)malloc(3); 編譯器無(wú)法通過(guò)如 void *q = p+3;我們知道假設(shè)一個(gè)整型變量nCont在32位機(jī)器上是4個(gè)字節(jié),q是指向nCont的指針變量,q的值,也就是nCont的地址是0x00032ec0,那么q+1的值為0x0x00032ec0+1*4,這是C語(yǔ)言中計(jì)算指針表達(dá)式值的方法。即q+1的值為q+1*sizeof(int);從這里,我們可以理解為什么我們用void*作為動(dòng)態(tài)分配內(nèi)存函數(shù)返回的類型,因?yàn)?,如果返回的是void*類型
10、,我們無(wú)法計(jì)算地址的偏移量,即無(wú)法計(jì)算出數(shù)組首元素的地址,也就是數(shù)組的地址。當(dāng)然,我們可以不用void*,可以用除了void*的任何C中內(nèi)嵌的簡(jiǎn)單類型,不過(guò)如果考慮使用起來(lái)簡(jiǎn)單,方便,那么我覺(jué)得還是懸著用void*,或者char*;選擇char*類型方便的是,char類型的大小是1,那么元素的個(gè)數(shù),即等于地址的偏移量。構(gòu)建實(shí)例一維#include <stdio.h> #include <stdlib.h> int main() int n1,i; int *array; puts("輸入一維長(zhǎng)度:"); 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("輸入一維長(zhǎng)度:"); scanf("%d",&n1); puts(&quo
12、t;輸入二維長(zhǎng)度:"); 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("輸入一維長(zhǎng)度:"); scanf("%d",&n1); puts("輸入二維長(zhǎng)度:"); scanf("%d",&n2); puts("輸入三維長(zhǎng)度:"); 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("輸入一維長(zhǎng)度:"); scanf("%d",&n1); puts("輸入二維長(zhǎng)度:"); scanf(&q
16、uot;%d",&n2); puts("輸入三維長(zhǎng)度:"); scanf("%d",&n3); puts("輸入四維長(zhǎng)度:"); 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為例。 先遵循從外層到里層,逐層申請(qǐng)的原則: 最外層指針是array,它是個(gè)三維指針,所指向的是array,其為二維指針。所以給array(三維指針) 申請(qǐng)內(nèi)存應(yīng): array=(int*)calloc(n1,sizeof(int*); 次層指針是array,它是個(gè)二維指針,所指向的是array,其為一維指針。所以給array(二維指針)申請(qǐng)內(nèi)存應(yīng): for(i=0;i<n1;i+) arrayi=(int*)calloc(n2,sizeof(int*); 最內(nèi)層指針是array,它是個(gè)一維指針,所指向的是array,其是個(gè)整型常量。所以給ar
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025出版合同翻譯協(xié)議范本
- 2025國(guó)際服務(wù)貿(mào)易合同主體的范圍
- 辦公電腦軟硬件維護(hù)服務(wù)合同
- 生物技術(shù)農(nóng)業(yè)應(yīng)用合作合同書(shū)
- 紡織設(shè)計(jì)師考試內(nèi)容綱要試題及答案
- 浙江國(guó)企招聘2025溫州泰順縣國(guó)有企業(yè)社會(huì)招聘20人筆試參考題庫(kù)附帶答案詳解
- 2025河南鄭州空中絲路文化傳媒有限公司社會(huì)招聘6人筆試參考題庫(kù)附帶答案詳解
- 2025年福建省福州市中國(guó)冶金地質(zhì)總局二局招聘8人筆試參考題庫(kù)附帶答案詳解
- 2025安徽省科創(chuàng)投資有限公司社會(huì)招聘10人筆試參考題庫(kù)附帶答案詳解
- 高效備考2024年國(guó)際商業(yè)美術(shù)設(shè)計(jì)師考試試題及答案
- 圍手術(shù)期血糖的管理專家講座
- 干濕法脫硫運(yùn)行經(jīng)濟(jì)成本對(duì)比(自動(dòng)計(jì)算)
- 運(yùn)輸與配送管理選擇題復(fù)習(xí)題庫(kù)
- 線性代數(shù)矩陣
- S22天天高速安慶至潛山段(涼亭至月山)環(huán)境影響報(bào)告書(shū)
- 某廠蒸汽管道安裝吹掃及試運(yùn)行方案
- 清華大學(xué)出版社機(jī)械制圖習(xí)題集參考答案(課堂PPT)
- 安徽金軒科技有限公司 年產(chǎn)60萬(wàn)噸硫磺制酸項(xiàng)目環(huán)境影響報(bào)告書(shū)
- 兒科護(hù)理學(xué)智慧樹(shù)知到答案章節(jié)測(cè)試2023年石河子大學(xué)
- 兩篇古典英文版成語(yǔ)故事百鳥(niǎo)朝鳳英文版
- GB/T 37573-2019露天煤礦邊坡穩(wěn)定性年度評(píng)價(jià)技術(shù)規(guī)范
評(píng)論
0/150
提交評(píng)論