多維字符串?dāng)?shù)組的初始化-動(dòng)態(tài)內(nèi)存分配_第1頁(yè)
多維字符串?dāng)?shù)組的初始化-動(dòng)態(tài)內(nèi)存分配_第2頁(yè)
多維字符串?dāng)?shù)組的初始化-動(dòng)態(tài)內(nèi)存分配_第3頁(yè)
多維字符串?dāng)?shù)組的初始化-動(dòng)態(tài)內(nèi)存分配_第4頁(yè)
多維字符串?dāng)?shù)組的初始化-動(dòng)態(tài)內(nèi)存分配_第5頁(yè)
已閱讀5頁(yè),還剩2頁(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、編程學(xué)習(xí)二維字符串?dāng)?shù)組的初始化動(dòng)態(tài)內(nèi)存分配動(dòng)態(tài)內(nèi)存分配1.堆內(nèi)存分配 :C/C+定義了4個(gè)內(nèi)存區(qū)間:代碼區(qū),全局變量與靜態(tài)變量區(qū),局部變量區(qū)即棧區(qū),動(dòng)態(tài)存儲(chǔ)區(qū),即堆(heap)區(qū)或自由存儲(chǔ)區(qū)(free store)。堆的概念:通常定義變量(或?qū)ο螅?,編譯器在編譯時(shí)都可以根據(jù)該變量(或?qū)ο螅┑念?lèi)型知道所需內(nèi)存空間的大小,從而系統(tǒng)在適當(dāng)?shù)臅r(shí)候?yàn)樗麄兎峙浯_定的存儲(chǔ)空間。這種內(nèi)存分配稱為靜態(tài)存儲(chǔ)分配; 有些操作對(duì)象只在程序運(yùn)行時(shí)才能確定,這樣編譯時(shí)就無(wú)法為他們預(yù)定存儲(chǔ)空間,只能在程序運(yùn)行時(shí),系統(tǒng)根據(jù)運(yùn)行時(shí)的要求進(jìn)行內(nèi)存分配,這種方法稱為動(dòng)態(tài)存儲(chǔ)分配。所有動(dòng)態(tài)存儲(chǔ)分配都在堆區(qū)中進(jìn)行。當(dāng)程序運(yùn)行到需要一個(gè)

2、動(dòng)態(tài)分配的變量或?qū)ο髸r(shí),必須向系統(tǒng)申請(qǐng)取得堆中的一塊所需大小的存貯空間,用于存貯該變量或?qū)ο?。?dāng)不再使用該變量或?qū)ο髸r(shí),也就是它的生命結(jié)束時(shí),要顯式釋放它所占用的存貯空間,這樣系統(tǒng)就能對(duì)該堆空間進(jìn)行再次分配,做到重復(fù)使用有限的資源。堆空間申請(qǐng)、釋放的方法:在C+中,申請(qǐng)和釋放堆中分配的存貯空間,分別使用new和delete的兩個(gè)運(yùn)算符來(lái)完成, 指針變量名=new 類(lèi)型名(初始化式); delete 指針名;例如:1、 int *pi=new int(0); 它與下列代碼序列大體等價(jià): 2、int ival=0, *pi=&ival;區(qū)別:pi所指向的變量是由庫(kù)操作符new()分配的,位

3、于程序的堆區(qū)中,并且該對(duì)象未命名。堆空間申請(qǐng)、釋放說(shuō)明:.new運(yùn)算符返回的是一個(gè)指向所分配類(lèi)型變量(對(duì)象)的指針。對(duì)所創(chuàng)建的變量或?qū)ο?,都是通過(guò)該指針來(lái)間接操作的,而且動(dòng)態(tài)創(chuàng)建的對(duì)象本身沒(méi)有名字。.一般定義變量和對(duì)象時(shí)要用標(biāo)識(shí)符命名,稱命名對(duì)象,而動(dòng)態(tài)的稱無(wú)名對(duì)象(請(qǐng)注意與棧區(qū)中的臨時(shí)對(duì)象的區(qū)別,兩者完全不同:生命期不同,操作方法不同,臨時(shí)變量對(duì)程序員是透明的)。.堆區(qū)是不會(huì)在分配時(shí)做自動(dòng)初始化的(包括清零),所以必須用初始化式(initializer)來(lái)顯式初始化。new表達(dá)式的操作序列如下:從堆區(qū)分配對(duì)象,然后用括號(hào)中的值初始化該對(duì)象。3.堆空間申請(qǐng)、釋放演示:.用初始化式(initia

4、lizer)來(lái)顯式初始化int *pi=new int(0);.當(dāng)pi生命周期結(jié)束時(shí),必須釋放pi所指向的目標(biāo): delete pi;注意這時(shí)釋放了pi所指的目標(biāo)的內(nèi)存空間,也就是撤銷(xiāo)了該目標(biāo),稱動(dòng)態(tài)內(nèi)存釋放(dynamic memorydeallocation),但指針pi本身并沒(méi)有撤銷(xiāo),它自己仍然存在,該指針?biāo)純?nèi)存空間并未釋放。4. 在堆中建立動(dòng)態(tài)一維數(shù)組申請(qǐng)數(shù)組空間:指針變量名=new 類(lèi)型名下標(biāo)表達(dá)式;注意:“下標(biāo)表達(dá)式”不是常量表達(dá)式,即它的值不必在編譯時(shí)確定,可以在運(yùn)行時(shí)確定。釋放數(shù)組空間:delete 指向該數(shù)組的指針變量名;注意:方括號(hào)非常重要的,如果delete語(yǔ)句中少了方

5、括號(hào),因編譯器認(rèn)為該指針是指向數(shù)組第一個(gè)元素的,會(huì)產(chǎn)生回收不徹底的問(wèn)題(只回收了第一個(gè)元素所占空間),加了方括號(hào)后就轉(zhuǎn)化為指向數(shù)組的指針,回收整個(gè)數(shù)組。delete 的方括號(hào)中不需要填數(shù)組元素?cái)?shù),系統(tǒng)自知。即使寫(xiě)了,編譯器也忽略。#include <iostream.h>#include <string.h>void main() int n; char *pc; cout<<"請(qǐng)輸入動(dòng)態(tài)數(shù)組的元素個(gè)數(shù)"<<endl; cin>>n; /n在運(yùn)行時(shí)確定,可輸入17 pc=new charn; /申請(qǐng)17個(gè)字符(可裝

6、8個(gè)漢字和一個(gè)結(jié)束符)的內(nèi)存空間 strcpy(pc,“堆內(nèi)存的動(dòng)態(tài)分配”);/ cout<<pc<<endl; delete pc;/釋放pc所指向的n個(gè)字符的內(nèi)存空間 return ;5. 動(dòng)態(tài)一維數(shù)組的說(shuō)明 變量n在編譯時(shí)沒(méi)有確定的值,而是在運(yùn)行中輸入,按運(yùn)行時(shí)所需分配堆空間,這一點(diǎn)是動(dòng)態(tài)分配的優(yōu)點(diǎn),可克服數(shù)組“大開(kāi)小用”的弊端,在表、排序與查找中的算法,若用動(dòng)態(tài)數(shù)組,通用性更佳。一定注意:delete pc是將n個(gè)字符的空間釋放,而用delete pc則只釋放了一個(gè)字符的空間; 如果有一個(gè)char *pc1,令pc1=p,同樣可用delete pc1來(lái)釋放該空間

7、。盡管C+不對(duì)數(shù)組作邊界檢查,但在堆空間分配時(shí),對(duì)數(shù)組分配空間大小是紀(jì)錄在案的。 沒(méi)有初始化式(initializer),不可對(duì)數(shù)組初始化。指針類(lèi)型:(1)int *ptr;/指針?biāo)赶虻念?lèi)型是int (2)char *ptr;/指針?biāo)赶虻牡念?lèi)型是char (3)int *ptr;/指針?biāo)赶虻牡念?lèi)型是int* (也就是一個(gè)int * 型指針) (4)int (*ptr)3;/指針?biāo)赶虻牡念?lèi)型是int()3 /二維指針的聲明指針數(shù)組:一個(gè)數(shù)組里存放的都是同一個(gè)類(lèi)型的指針,通常我們把他叫做指針數(shù)組。比如 int * a2;它里邊放了2個(gè)int * 型變量 .(指針數(shù)組)int * a2; a

8、0= new int3; a1=new int3; delete a0; delete a1;注意這里 是一個(gè)數(shù)組,不能delete ;數(shù)組指針:一個(gè)指向一維或者多維數(shù)組的指針.int * b=new int10;指向一維數(shù)組的指針b ; 注意,這個(gè)時(shí)候釋放空間一定要delete ,否則會(huì)造成內(nèi)存泄露, b 就成為了空懸指針int (*b2)10=new int1010; 注意,這里的b2指向了一個(gè)二維int型數(shù)組的首地址. 注意:在這里,b2等效于二維數(shù)組名,但沒(méi)有指出其邊界,即最高維的元素?cái)?shù)量,但是它的最低維數(shù)的元素?cái)?shù)量必須要指定!就像指向字符的指針,即等效一個(gè)字符串,不要把指向字符的指針

9、說(shuō)成指向字符串的指針。int(*b3) 30 20; /三級(jí)指針>指向三維數(shù)組的指針; int (*b2) 20; /二級(jí)指針;>指向二維數(shù)組的指針; b3=new int 1 20 30; b2=new int 30 20; 刪除這兩個(gè)動(dòng)態(tài)數(shù)組可用下式: delete b3; /刪除(釋放)三維數(shù)組; delete b2; /刪除(釋放)二維數(shù)組; 在堆中建立動(dòng)態(tài)多維數(shù)組new 類(lèi)型名下標(biāo)表達(dá)式1 下標(biāo)表達(dá)式2;例如:建立loat (*cp)3020 ; /指向一個(gè)30行20列數(shù)組的指針,指向二維數(shù)組的指針cp=new float 15 30 20; /建立由15個(gè)30*20數(shù)組

10、組成的數(shù)組;注意:cp等效于三維數(shù)組名,但沒(méi)有指出其邊界,即最高維的元素?cái)?shù)量,就像指向字符的指針即等效一個(gè)字符串,不要把指向字符的指針,說(shuō)成指向字符串的指針。這與數(shù)組的嵌套定義相一致。 總結(jié)如下方法:指針對(duì)應(yīng)關(guān)系為char *a6<=>char *a /在函數(shù)傳遞參數(shù)時(shí)候很容易出錯(cuò)char a56<=>char (*a)6int a50100;int *p=&a00; aij<=>*(p+100*i+j);或:int (*p)100; p=a;aii<=>*(*(p+i)+j);char *a10; /指針數(shù)組for (i=0;i<

11、10;i+) ai=new char10;for(i=0;i<10;i+)delete ai;#include <iostream.h>#include <stdlib.h>int main()int (*p)3;p= new int 23;int i,j;for(i=0;i<2;i+)for(j=0;j<3;j+) pij=rand()%100;for(i=0;i<2;i+) cout<<endl; for(j=0;j<3;j+) cout<<pij<<ends; delete p;return 0;#include<iostream.h>#include<stdlib.h>int main()char *a; /或者用上面的指針數(shù)組的方法也可以a=new char *2;fo

溫馨提示

  • 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)論