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

下載本文檔

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

文檔簡介

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

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

3、存空間。四、用法:、int*Ptr因為是指針的指針,需要兩次內(nèi)存分配才能使用其最終內(nèi)容。首先,Ptr=(int*)newint*5;這樣分配好了以后,它和(2)的意義相同了;然后要分別對5個指針進行內(nèi)存分配,例如:Ptr0=newint20;它表示為第0個指針分配20個整數(shù),分配好以后,Ptr0為指向20個整數(shù)的數(shù)組。這時可以使用下標用法Ptr00到Ptr019了。如果沒有第一次內(nèi)存分配,該Ptr是個野指針,是不能使用的,如果沒有第二次內(nèi)存分配,則Ptr0等也是個野指針,也是不能用的。當然,用它指向某個已經(jīng)定義的地址則是允許的,那是另外的用法(類似于借雞生蛋的做法),這里不作討論(下同)。例子

4、:C語言:/動態(tài)分配二維數(shù)組空間mHight=10;二維數(shù)組的高度m;/二維數(shù)組的寬度動態(tài)分配一個二維數(shù)組m_ppTable內(nèi)存空間/其類型為int/m_ppTable指向該數(shù)組int*m_ppTable;m_ppTable=newint*m_iHight;動態(tài)分配mHight個類型為int*的內(nèi)存空間/分配的是行地址空間for(inti=0;im_ppTablei=newintm_iWidth;動態(tài)分配mWidth個類型為int的內(nèi)存空間/分配的是某行的數(shù)值空間/由此分配的二維數(shù)組空間并非是連續(xù)的可以使用m_ppTablerowcol來給該二維數(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ù)組一樣最后用for(i=0;icfree(ai);cfree(a);釋放內(nèi)存就可以了、int*Ptr5這樣定義的話,編譯器已經(jīng)為它分配了5個指針的空間,這相當于(1)中的第一次內(nèi)存分配。根據(jù)對(1)的討論可知,顯然要對其進行一次內(nèi)存分配的。否則就是

6、野指針。、int(*Ptr)5這種定義我覺得很費解,不是不懂,而是覺得理解起來特別吃力,也許是我不太習(xí)慣這樣的定義吧。怎么描述它呢?它的意義是一群指針,每個指針都是指向一個5個整數(shù)的數(shù)組。如果想分配k個指針這樣寫:Ptr=(int(*)5)newint5*k。這是一次性的內(nèi)存分配。分配好以后,Ptr指向一片連續(xù)的地址空間,其中Ptr0指向第0個5個整數(shù)數(shù)組的首地址,Ptr1指向第1個5個整數(shù)數(shù)組的首地址。綜上所述,我覺得可以這樣理解它們:int*PtrintPtrxy;int*Ptr5intPtr5x;int(*Ptr)5intPtrx5;這里x和y是表示若干的意思。1.C語言動態(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);分配每個指針所指向的數(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+動態(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;分配每個指針所指向的數(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;/分配每個指針所指向的數(shù)組printf(%dn,sizeof(a);/4,指針printf(%dn,sizeof(a0);/4,指針deletea0;deletea;多說一句:new和delete要注意配對使用,即有多少個new就有多少個delete,這樣才可以避免內(nèi)存泄漏!3.靜態(tài)二維數(shù)組作為函數(shù)參數(shù)傳遞如果采用上述幾種方法動態(tài)分配二維數(shù)組,那么將對應(yīng)的數(shù)據(jù)類型作為函數(shù)參數(shù)就可以了。這里討論靜態(tài)二維數(shù)組作為函數(shù)參數(shù)傳遞,即按照以下的調(diào)用方式:inta23;func(a);C語言中將靜態(tài)二維數(shù)組作為參數(shù)

13、傳遞比較麻煩,一般需要指明第二維的長度,如果不給定第二維長度,則只能先將其作為一維指針傳遞,然后利用二維數(shù)組的線性存儲特性,在函數(shù)體內(nèi)轉(zhuǎn)化為對指定元素的訪問。首先寫好測試代碼,以驗證參數(shù)傳遞的正確性:給定第二維長度Code-11voidfunc(intaN)printf(%dn,a12);不給定第二維長度Code-12voidfunc(int*a)printf(%dn,a1*N+2);/計算元素位置注意:使用該函數(shù)時需要將二維數(shù)組首地址強制轉(zhuǎn)換為一維指針,即func(int*)a);1.C語言動態(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);/分配每個指針所指向的數(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+動態(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;分配每個指針所指向的數(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;/分配每個指針所指向的數(shù)組printf(%dn,sizeof(a);/4,指針printf(%dn,sizeof(a0);/4,指針deletea0;deletea;多說一句:new和delete要注意配對使用,即有多少個new就有多少個delete,這樣才可以避免內(nèi)存泄漏!3.靜態(tài)二維數(shù)組作為函數(shù)參數(shù)傳遞如果采用上述幾種方法動態(tài)分配二維數(shù)組,那么將對應(yīng)的數(shù)據(jù)類型作為函數(shù)參數(shù)就可以了。這里討論靜態(tài)二維數(shù)組作為函數(shù)參

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論