二維數(shù)組定義以及動(dòng)態(tài)分配空間_第1頁(yè)
二維數(shù)組定義以及動(dòng)態(tài)分配空間_第2頁(yè)
二維數(shù)組定義以及動(dòng)態(tài)分配空間_第3頁(yè)
二維數(shù)組定義以及動(dòng)態(tài)分配空間_第4頁(yè)
二維數(shù)組定義以及動(dòng)態(tài)分配空間_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、二維數(shù)組定義以及動(dòng)態(tài)分配空間(轉(zhuǎn))下面三種定義形式怎么理解?怎么動(dòng)態(tài)分配空間?、int*Ptr;、int*Ptr5;我更喜歡寫成int*Prt5;、int(*Ptr)5;此文引自網(wǎng)上,出處不詳,但是覺(jué)得非常好。略改了一點(diǎn)。多維數(shù)組一向很難,一般都采用一維數(shù)組,但是一旦要用到還真是頭疼。閑話少說(shuō),這里我就以三個(gè)二維數(shù)組的比較來(lái)展開(kāi)討論:、int*Ptr;、int*Ptr5;我更喜歡寫成int*Prt5;、int(*Ptr)5;以上三例都是整數(shù)的二維數(shù)組,都可以用形如Ptr11的方式訪問(wèn)其內(nèi)容;但它們的差別卻是很大的。下面我從四個(gè)方面對(duì)它們進(jìn)行討論:一、內(nèi)容:它們本身都是指針,它們的最終內(nèi)容都是整

2、數(shù)。注意我這里說(shuō)的是最終內(nèi)容,而不是中間內(nèi)容,比如你寫Ptr0,對(duì)于三者來(lái)說(shuō),其內(nèi)容都是一個(gè)整數(shù)指針,即int*;Ptr11這樣的形式才是其最終內(nèi)容。二、意義:(1)、int*Ptr表示指向一群指向整數(shù)的指針的指針。(2)、int*Ptr5表示指向5個(gè)指向整數(shù)的指針的指針,或者說(shuō)Ptr有5個(gè)指向一群整數(shù)的指針,Ptr是這5個(gè)指針構(gòu)成的數(shù)組的地址(3)、int(*Ptr)5表示指向一群指向5個(gè)整數(shù)數(shù)組的指針的指針。三、所占空間:(1)、int*Ptr和(3)、int(*Ptr)5一樣,在32位平臺(tái)里,都是4字節(jié),即一個(gè)指針。但(2)、int*Ptr5不同,它是5個(gè)指針,它占5*4=20個(gè)字節(jié)的內(nèi)

3、存空間。四、用法:、int*Ptr因?yàn)槭侵羔樀闹羔槪枰獌纱蝺?nèi)存分配才能使用其最終內(nèi)容。首先,Ptr=(int*)newint*5;這樣分配好了以后,它和(2)的意義相同了;然后要分別對(duì)5個(gè)指針進(jìn)行內(nèi)存分配,例如:Ptr0=newint20;它表示為第0個(gè)指針?lè)峙?0個(gè)整數(shù),分配好以后,Ptr0為指向20個(gè)整數(shù)的數(shù)組。這時(shí)可以使用下標(biāo)用法Ptr00到Ptr019了。如果沒(méi)有第一次內(nèi)存分配,該P(yáng)tr是個(gè)野指針,是不能使用的,如果沒(méi)有第二次內(nèi)存分配,則Ptr0等也是個(gè)野指針,也是不能用的。當(dāng)然,用它指向某個(gè)已經(jīng)定義的地址則是允許的,那是另外的用法(類似于借雞生蛋的做法),這里不作討論(下同)。例子

4、:C語(yǔ)言:/動(dòng)態(tài)分配二維數(shù)組空間mHight=10;二維數(shù)組的高度m;/二維數(shù)組的寬度動(dòng)態(tài)分配一個(gè)二維數(shù)組m_ppTable內(nèi)存空間/其類型為int/m_ppTable指向該數(shù)組int*m_ppTable;m_ppTable=newint*m_iHight;動(dòng)態(tài)分配mHight個(gè)類型為int*的內(nèi)存空間/分配的是行地址空間for(inti=0;im_ppTablei=newintm_iWidth;動(dòng)態(tài)分配mWidth個(gè)類型為int的內(nèi)存空間/分配的是某行的數(shù)值空間/由此分配的二維數(shù)組空間并非是連續(xù)的可以使用m_ppTablerowcol來(lái)給該二維數(shù)組賦值/其中0=row/釋放所分配的內(nèi)存空間f

5、or(inti=0;ideletem_iWidthm_ppTablei;/以行為單位釋放數(shù)值空間deletem_iHightm_ppTable;/釋放行地址空間int*a;a=(int*)calloc(sizeof(int*),n);for(i=0;iai=(int*)calloc(sizeof(int),n);這樣就可以了使用的時(shí)候就和普通的二維數(shù)組一樣最后用for(i=0;icfree(ai);cfree(a);釋放內(nèi)存就可以了、int*Ptr5這樣定義的話,編譯器已經(jīng)為它分配了5個(gè)指針的空間,這相當(dāng)于(1)中的第一次內(nèi)存分配。根據(jù)對(duì)(1)的討論可知,顯然要對(duì)其進(jìn)行一次內(nèi)存分配的。否則就是

6、野指針。、int(*Ptr)5這種定義我覺(jué)得很費(fèi)解,不是不懂,而是覺(jué)得理解起來(lái)特別吃力,也許是我不太習(xí)慣這樣的定義吧。怎么描述它呢?它的意義是一群指針,每個(gè)指針都是指向一個(gè)5個(gè)整數(shù)的數(shù)組。如果想分配k個(gè)指針這樣寫:Ptr=(int(*)5)newint5*k。這是一次性的內(nèi)存分配。分配好以后,Ptr指向一片連續(xù)的地址空間,其中Ptr0指向第0個(gè)5個(gè)整數(shù)數(shù)組的首地址,Ptr1指向第1個(gè)5個(gè)整數(shù)數(shù)組的首地址。綜上所述,我覺(jué)得可以這樣理解它們:int*PtrintPtrxy;int*Ptr5intPtr5x;int(*Ptr)5intPtrx5;這里x和y是表示若干的意思。1.C語(yǔ)言動(dòng)態(tài)分配二維數(shù)組

7、(1)已知第二維Code-1char(*a)N;指向數(shù)組的指針a=(char(*)N)malloc(sizeof(char*)*m);printf(%dn,sizeof(a);/4,指針printf(%dn,sizeof(a0);/N,維數(shù)組free(a);已知第一維Code-2char*aM;/指針的數(shù)組inti;for(i=0;iM;i+)ai=(char*)malloc(sizeof(char)*n);printf(%dn,sizeof(a);/4*M,指針數(shù)組printf(%dn,sizeof(a0);/4,指針for(i=0;iM;i+)free(ai);已知第一維,一次分配內(nèi)存(保

8、證內(nèi)存的連續(xù)性)Code-3char*aM;/指針的數(shù)組inti;a0=(char*)malloc(sizeof(char)*M*n);for(i=1;iM;i+)ai=ai-1+n;printf(%dn,sizeof(a);/4*M,指針數(shù)組printf(%dn,sizeof(a0);/4,指針free(a0);兩維都未知Code-4char*a;inti;a=(char*)malloc(sizeof(char*)*m);分配指針數(shù)組for(i=0;im;i+)ai=(char*)malloc(sizeof(char)*n);分配每個(gè)指針?biāo)赶虻臄?shù)組printf(%dn,sizeof(a);

9、/4,指針printf(%dn,sizeof(a0);/4,指針for(i=0;im;i+)free(ai);free(a);(5)兩維都未知,一次分配內(nèi)存(保證內(nèi)存的連續(xù)性)Code-5char*a;inti;a=(char*)malloc(sizeof(char*)*m);/分配指針數(shù)組a0=(char*)malloc(sizeof(char)*m*n);/一次性分配所有空間for(i=1;im;i+)ai=ai-1+n;printf(%dn,sizeof(a);/4,指針printf(%dn,sizeof(a0);/4,指針free(a0);free(a);2.C+動(dòng)態(tài)分配二維數(shù)組已知第

10、二維Code-6char(*a)N;/指向數(shù)組的指針a=newcharmN;printf(%dn,sizeof(a);/4,指針printf(%dn,sizeof(a0);/N,維數(shù)組deletea;已知第一維Code-7char*aM;/指針的數(shù)組for(inti=0;iM;i+)ai=newcharn;printf(%dn,sizeof(a);/4*M,指針數(shù)組printf(%dn,sizeof(a0);/4,指針for(i=0;iM;i+)deleteai;(3)已知第一維,一次分配內(nèi)存(保證內(nèi)存的連續(xù)性)Code-8char*aM;指針的數(shù)組a0=newcharM*n;for(inti

11、=1;iM;i+)ai=ai-1+n;printf(%dn,sizeof(a);/4*M,指針數(shù)組printf(%dn,sizeof(a0);/4,指針deletea0;兩維都未知Code-9char*a;a=newchar*m;/分配指針數(shù)組for(inti=0;im;i+)ai=newcharn;分配每個(gè)指針?biāo)赶虻臄?shù)組printf(%dn,sizeof(a);/4,指針printf(%dn,sizeof(a0);/4,指針for(i=0;im;i+)deleteai;deletea;兩維都未知,一次分配內(nèi)存(保證內(nèi)存的連續(xù)性)Code-10char*a;a=newchar*m;a0=ne

12、wcharm*n;/一次性分配所有空間for(inti=1;im;i+)ai=ai-1+n;/分配每個(gè)指針?biāo)赶虻臄?shù)組printf(%dn,sizeof(a);/4,指針printf(%dn,sizeof(a0);/4,指針deletea0;deletea;多說(shuō)一句:new和delete要注意配對(duì)使用,即有多少個(gè)new就有多少個(gè)delete,這樣才可以避免內(nèi)存泄漏!3.靜態(tài)二維數(shù)組作為函數(shù)參數(shù)傳遞如果采用上述幾種方法動(dòng)態(tài)分配二維數(shù)組,那么將對(duì)應(yīng)的數(shù)據(jù)類型作為函數(shù)參數(shù)就可以了。這里討論靜態(tài)二維數(shù)組作為函數(shù)參數(shù)傳遞,即按照以下的調(diào)用方式:inta23;func(a);C語(yǔ)言中將靜態(tài)二維數(shù)組作為參數(shù)

13、傳遞比較麻煩,一般需要指明第二維的長(zhǎng)度,如果不給定第二維長(zhǎng)度,則只能先將其作為一維指針傳遞,然后利用二維數(shù)組的線性存儲(chǔ)特性,在函數(shù)體內(nèi)轉(zhuǎn)化為對(duì)指定元素的訪問(wèn)。首先寫好測(cè)試代碼,以驗(yàn)證參數(shù)傳遞的正確性:給定第二維長(zhǎng)度Code-11voidfunc(intaN)printf(%dn,a12);不給定第二維長(zhǎng)度Code-12voidfunc(int*a)printf(%dn,a1*N+2);/計(jì)算元素位置注意:使用該函數(shù)時(shí)需要將二維數(shù)組首地址強(qiáng)制轉(zhuǎn)換為一維指針,即func(int*)a);1.C語(yǔ)言動(dòng)態(tài)分配二維數(shù)組(1)已知第二維Code-1char(*a)N;指向數(shù)組的指針a=(char(*)N)

14、malloc(sizeof(char*)*m);printf(%dn,sizeof(a);/4,指針printf(%dn,sizeof(a0);/N,一維數(shù)組free(a);已知第一維Code-2char*aM;/指針的數(shù)組inti;for(i=0;iM;i+)ai=(char*)malloc(sizeof(char)*n);printf(%dn,sizeof(a);/4*M,指針數(shù)組printf(%dn,sizeof(a0);/4,指針for(i=0;iM;i+)free(ai);已知第一維,一次分配內(nèi)存(保證內(nèi)存的連續(xù)性)Code-3char*aM;/指針的數(shù)組inti;a0=(char*

15、)malloc(sizeof(char)*M*n);for(i=1;iM;i+)ai=ai-1+n;printf(%dn,sizeof(a);/4*M,指針數(shù)組printf(%dn,sizeof(a0);/4,指針free(a0);兩維都未知Code-4char*a;inti;a=(char*)malloc(sizeof(char*)*m);/分配指針數(shù)組for(i=0;im;i+)ai=(char*)malloc(sizeof(char)*n);/分配每個(gè)指針?biāo)赶虻臄?shù)組printf(%dn,sizeof(a);/4,指針printf(%dn,sizeof(a0);/4,指針for(i=0;

16、im;i+)free(ai);free(a);兩維都未知,一次分配內(nèi)存(保證內(nèi)存的連續(xù)性)Code-5char*a;inti;a=(char*)malloc(sizeof(char*)*m);/分配指針數(shù)組a0=(char*)malloc(sizeof(char)*m*n);/一次性分配所有空間for(i=1;im;i+)ai=ai-1+n;printf(%dn,sizeof(a);/4,指針printf(%dn,sizeof(a0);/4,指針free(a0);free(a);2.C+動(dòng)態(tài)分配二維數(shù)組已知第二維Code-6char(*a)N;/指向數(shù)組的指針a=newcharmN;print

17、f(%dn,sizeof(a);/4,指針printf(%dn,sizeof(a0);/N,維數(shù)組deletea;已知第一維Code-7char*aM;/指針的數(shù)組for(inti=0;iM;i+)ai=newcharn;printf(%dn,sizeof(a);/4*M,指針數(shù)組printf(%dn,sizeof(a0);/4,指針for(i=0;iM;i+)deleteai;(3)已知第一維,一次分配內(nèi)存(保證內(nèi)存的連續(xù)性)Code-8char*aM;/指針的數(shù)組a0=newcharM*n;for(inti=1;iM;i+)ai=ai-1+n;printf(%dn,sizeof(a);/4

18、*M,指針數(shù)組printf(%dn,sizeof(a0);/4,指針deletea0;兩維都未知Code-9char*a;a=newchar*m;/分配指針數(shù)組for(inti=0;im;i+)ai=newcharn;分配每個(gè)指針?biāo)赶虻臄?shù)組printf(%dn,sizeof(a);/4,指針printf(%dn,sizeof(a0);/4,指針for(i=0;im;i+)deleteai;deletea;兩維都未知,一次分配內(nèi)存(保證內(nèi)存的連續(xù)性)Code-10char*a;a=newchar*m;a0=newcharm*n;/一次性分配所有空間for(inti=1;im;i+)ai=ai-1+n;/分配每個(gè)指針?biāo)赶虻臄?shù)組printf(%dn,sizeof(a);/4,指針printf(%dn,sizeof(a0);/4,指針deletea0;deletea;多說(shuō)一句:new和delete要注意配對(duì)使用,即有多少個(gè)new就有多少個(gè)delete,這樣才可以避免內(nèi)存泄漏!3.靜態(tài)二維數(shù)組作為函數(shù)參數(shù)傳遞如果采用上述幾種方法動(dòng)態(tài)分配二維數(shù)組,那么將對(duì)應(yīng)的數(shù)據(jù)類型作為函數(shù)參數(shù)就可以了。這里討論靜態(tài)二維數(shù)組作為函數(shù)參

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論