版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 伊拉克戰(zhàn)爭中美英聯(lián)軍的軍交運輸保障及啟示
- 云服務(wù)提供商安全合規(guī)性-洞察分析
- 專題2.5 科學(xué)記數(shù)法與近似數(shù)【八大題型】(舉一反三)(人教版2024)(解析版)
- 牙周植物菌與免疫調(diào)節(jié)-洞察分析
- 藝術(shù)教育對人格塑造的影響-洞察分析
- 添加劑在食品工業(yè)中的應(yīng)用策略-洞察分析
- 源碼克隆與相似性分析-洞察分析
- 藥物經(jīng)濟學(xué)評價-第1篇-洞察分析
- 學(xué)習(xí)效果量化評估方法-洞察分析
- 網(wǎng)絡(luò)棋牌游戲安全防護-洞察分析
- 銀企對接方案
- 大屏實施方案
- 工程建設(shè)監(jiān)理公司薪酬管理制度
- 反恐防范重點目標(biāo)檔案 空白模板2023年
- 預(yù)防物體打擊安全課件
- (完整word)工程造價咨詢公司管理制度
- 2023-2024學(xué)年北京市東城區(qū)高一語文上學(xué)期期末統(tǒng)檢試卷附答案解析
- 腫瘤學(xué)腫瘤發(fā)生發(fā)展和治療的研究
- 2023醫(yī)院內(nèi)部審計工作計劃范文
- 華為招聘與人員配置
- 微觀經(jīng)濟學(xué)原理曼昆英文第七章
評論
0/150
提交評論