電子科技大學(xué)c第五章構(gòu)造數(shù)據(jù)類型_第1頁
電子科技大學(xué)c第五章構(gòu)造數(shù)據(jù)類型_第2頁
電子科技大學(xué)c第五章構(gòu)造數(shù)據(jù)類型_第3頁
電子科技大學(xué)c第五章構(gòu)造數(shù)據(jù)類型_第4頁
電子科技大學(xué)c第五章構(gòu)造數(shù)據(jù)類型_第5頁
已閱讀5頁,還剩44頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第五章第五章 構(gòu)造數(shù)據(jù)類型構(gòu)造數(shù)據(jù)類型丘志杰丘志杰電子科技大學(xué)電子科技大學(xué)計(jì)算機(jī)學(xué)院計(jì)算機(jī)學(xué)院 軟件學(xué)院軟件學(xué)院枚舉類型枚舉類型 “枚舉枚舉”是指將變量所有可能的取值是指將變量所有可能的取值一一一一列舉列舉出來,變量的取值只限于列舉出來的常出來,變量的取值只限于列舉出來的常量。枚舉類型的聲明的一般形式如下量。枚舉類型的聲明的一般形式如下 :當(dāng)當(dāng)沒給各枚舉常量指定值時(shí)沒給各枚舉常量指定值時(shí),其值依次默認(rèn),其值依次默認(rèn)為為0、1、2、;在定義枚舉類型時(shí),也可;在定義枚舉類型時(shí),也可使用賦值號(hào)另行指定枚舉常量的值。使用賦值號(hào)另行指定枚舉常量的值。 enumenum 枚舉類型名枚舉類型名 枚舉常量枚舉

2、常量1, 1, 枚舉常量枚舉常量2,2, , 枚舉常量枚舉常量nn;枚舉!枚舉!數(shù)組數(shù)組 數(shù)組是一組在內(nèi)存中數(shù)組是一組在內(nèi)存中依次連續(xù)存依次連續(xù)存放放的、具有的、具有同一類型同一類型的數(shù)據(jù)變量的數(shù)據(jù)變量所組成的集合體。所組成的集合體。數(shù)組元素用數(shù)組名與帶方括號(hào)的數(shù)組元素用數(shù)組名與帶方括號(hào)的數(shù)組數(shù)組下標(biāo)下標(biāo)一起標(biāo)識(shí)。一起標(biāo)識(shí)。一維數(shù)組定義與使用一維數(shù)組定義與使用 一維數(shù)組定義的一般形式為:一維數(shù)組定義的一般形式為: 數(shù)據(jù)類型數(shù)據(jù)類型 數(shù)組名數(shù)組名常量表達(dá)式常量表達(dá)式;說明:說明: 數(shù)組元素的類型可以是數(shù)組元素的類型可以是voidvoid型以型以外的任何數(shù)據(jù)類型。外的任何數(shù)據(jù)類型。數(shù)組名代表數(shù)組元

3、素在內(nèi)存中的起數(shù)組名代表數(shù)組元素在內(nèi)存中的起始地址,是一個(gè)地址常量。始地址,是一個(gè)地址常量。 數(shù)組定義之后,系統(tǒng)會(huì)將從內(nèi)存中數(shù)組定義之后,系統(tǒng)會(huì)將從內(nèi)存中為其分配為其分配一塊連續(xù)的存儲(chǔ)空間一塊連續(xù)的存儲(chǔ)空間,從第,從第1 1個(gè)數(shù)據(jù)元素開始個(gè)數(shù)據(jù)元素開始依次存放依次存放各個(gè)數(shù)組元素。各個(gè)數(shù)組元素。例如:例如: intint a5; a5; 假設(shè)地址 內(nèi)容 符號(hào)地址 103410a0 103410a4 103410a8 103410ac 103410b0 a a+1 a+2 a+3 a+4 5*sizeof(int) a0 a1 a2 a3 a4 一維數(shù)組的初始化一維數(shù)組的初始化 一維數(shù)組初始化的

4、語法形式為:一維數(shù)組初始化的語法形式為:數(shù)據(jù)類型數(shù)據(jù)類型 數(shù)組名數(shù)組名 常量表達(dá)式常量表達(dá)式 =初初值值1, 初值初值2, 初值初值n;例如:例如: int array3=5,6,7; int array23=1,2; 存取一維數(shù)組元素的語法形式為:存取一維數(shù)組元素的語法形式為:數(shù)組名數(shù)組名 下標(biāo)表達(dá)式下標(biāo)表達(dá)式; 讀數(shù)組元素的地址讀數(shù)組元素的地址通過數(shù)組名通過數(shù)組名來讀來讀取,格式如下:取,格式如下:數(shù)組名數(shù)組名+整型表達(dá)式整型表達(dá)式;或&數(shù)組名數(shù)組名下標(biāo)表達(dá)式下標(biāo)表達(dá)式; 使用數(shù)組要注意的地方使用數(shù)組要注意的地方f在使用數(shù)組時(shí)最常犯的錯(cuò)誤是在使用數(shù)組時(shí)最常犯的錯(cuò)誤是下標(biāo)越界下標(biāo)越界。f數(shù)組

5、名是一個(gè)地址常量,不能作為數(shù)組名是一個(gè)地址常量,不能作為左值左值( (賦值的目標(biāo)賦值的目標(biāo)) )。因此,不能將一個(gè)數(shù)組整體。因此,不能將一個(gè)數(shù)組整體拷貝給另外一個(gè)數(shù)組。拷貝給另外一個(gè)數(shù)組。例如:例如: intint a5,c5,i; a5,c5,i; a=c; a=c;/錯(cuò)誤錯(cuò)誤! ! 正確的方法是將對應(yīng)的元素進(jìn)行拷貝:正確的方法是將對應(yīng)的元素進(jìn)行拷貝: for(ifor(i=0;i5;i+)=0;i5;i+) aiai=cici; 字符數(shù)組與字符串字符數(shù)組與字符串 存放字符型數(shù)據(jù)的數(shù)組稱為存放字符型數(shù)據(jù)的數(shù)組稱為字符數(shù)組字符數(shù)組。 1.1.用字符進(jìn)行初始化用字符進(jìn)行初始化 例如:例如:cha

6、r s1 =c,h,i,n,a; 2.用字符串進(jìn)行初始化用字符串進(jìn)行初始化 例如:例如:char s2 =china;請問:請問:s1、s2所占所占內(nèi)存空間是多少?內(nèi)存空間是多少?字符數(shù)組的使用字符數(shù)組的使用 字符數(shù)組也是數(shù)組,我們同樣可以字符數(shù)組也是數(shù)組,我們同樣可以通過數(shù)組名及下標(biāo)引用數(shù)組中的元通過數(shù)組名及下標(biāo)引用數(shù)組中的元素。為方便對字符與字符串的處理,素。為方便對字符與字符串的處理,c+c+提供了許多專門處理字符與字提供了許多專門處理字符與字符串的函數(shù)。符串的函數(shù)。 參看參看p118表表5-1。指針指針指針是指針是c+c+語言最重要特性之一,語言最重要特性之一,也是也是c+c+的主要難

7、點(diǎn)。的主要難點(diǎn)。指針提供了一種較為直觀的指針提供了一種較為直觀的地址地址操操作的手段,正確地使用指針,可以作的手段,正確地使用指針,可以方便、靈活而有效地組織和表示復(fù)方便、靈活而有效地組織和表示復(fù)雜的數(shù)據(jù)。雜的數(shù)據(jù)。地址與指針地址與指針 地址:當(dāng)定義一個(gè)變量后,內(nèi)存中將會(huì)劃地址:當(dāng)定義一個(gè)變量后,內(nèi)存中將會(huì)劃出一塊由若干個(gè)存儲(chǔ)單元組成的區(qū)域,用于出一塊由若干個(gè)存儲(chǔ)單元組成的區(qū)域,用于保存該變量的數(shù)據(jù)。在保存該變量的數(shù)據(jù)。在內(nèi)存里每個(gè)存儲(chǔ)單元內(nèi)存里每個(gè)存儲(chǔ)單元都有各自的編號(hào)都有各自的編號(hào),稱為地址。,稱為地址。 指針:在指針:在c+c+中,提供了指針類型,它是一中,提供了指針類型,它是一種種用于

8、存放內(nèi)存單元地址的變量類型用于存放內(nèi)存單元地址的變量類型,地址,地址就存儲(chǔ)在這種指針類型的變量中。正因?yàn)榫痛鎯?chǔ)在這種指針類型的變量中。正因?yàn)橹钢羔樧兞看鎯?chǔ)的是地址針變量存儲(chǔ)的是地址,用它來指明內(nèi)存單元,用它來指明內(nèi)存單元,所以形象地稱這種地址變量為指針。所以形象地稱這種地址變量為指針。 指針變量的定義指針變量的定義例如:例如: int *ip; /定義了一個(gè)定義了一個(gè)int型的指針變量型的指針變量ip float *fp; /定義了一個(gè)定義了一個(gè)float型指針變量型指針變量fp sizeof(ip)=sizeof(fp)=4; 數(shù)據(jù)類型數(shù)據(jù)類型 * * 變量名;變量名; 指針的初始化與賦值指

9、針的初始化與賦值(1)不要將一個(gè)非地址常量、變量以及無意義的實(shí))不要將一個(gè)非地址常量、變量以及無意義的實(shí)際地址賦給指針變量。如:際地址賦給指針變量。如: int *p=100; / int *p=(int*)100;(對嗎?)(對嗎?) int *p=(char *)100; (2)可以使用一個(gè)已初始化的指針去給另一個(gè)指針)可以使用一個(gè)已初始化的指針去給另一個(gè)指針賦值,但類型必須一致如果不一致,可進(jìn)行強(qiáng)制賦值,但類型必須一致如果不一致,可進(jìn)行強(qiáng)制類型轉(zhuǎn)換。類型轉(zhuǎn)換。 char *p=null; int *ip=(int *)p+100; 數(shù)據(jù)類型數(shù)據(jù)類型 * *指針變量名指針變量名= =初始地

10、址表達(dá)式;初始地址表達(dá)式; (3)對于基本數(shù)據(jù)類型的變量、數(shù)組元素我們可以)對于基本數(shù)據(jù)類型的變量、數(shù)組元素我們可以使用取地址運(yùn)算符使用取地址運(yùn)算符&來獲得它們的地址,但是也只來獲得它們的地址,但是也只有類型一致才能賦值。有類型一致才能賦值。 int a10; /定義定義int型數(shù)組型數(shù)組 int *i_pointer=a;/定義并初始化定義并初始化int型指針型指針 (4)有一種特殊的)有一種特殊的void類型指針,可以存儲(chǔ)任何的類型指針,可以存儲(chǔ)任何的類型地址;但將一個(gè)類型地址;但將一個(gè)void類型的地址賦值給非類型的地址賦值給非void類型的指針變量,要使用類型強(qiáng)制轉(zhuǎn)換。類型的指針變量,

11、要使用類型強(qiáng)制轉(zhuǎn)換。 void v; /錯(cuò)誤,不能定義錯(cuò)誤,不能定義void類型的變量類型的變量 void *vp; /定義定義void類型的指針類型的指針指針運(yùn)算指針運(yùn)算 指針通常進(jìn)行下列幾種運(yùn)算:賦值運(yùn)算、取指針通常進(jìn)行下列幾種運(yùn)算:賦值運(yùn)算、取值運(yùn)算、算術(shù)運(yùn)算、相減運(yùn)算、比較運(yùn)算。值運(yùn)算、算術(shù)運(yùn)算、相減運(yùn)算、比較運(yùn)算。(1 1)* * 和和& &運(yùn)算運(yùn)算 *:指針運(yùn)算符,:指針運(yùn)算符,&:取地址運(yùn)算符。:取地址運(yùn)算符。 例如:例如: int a4=1,2,3; int *ip=&a2; cout*ip; *ip=100; 0013a000 a0=1 0013a004 a1=2 *ip 0

12、013a008 a2=3 0013a00c a3=0 ip 0013a014 ip=0013a008 (2)指針與整數(shù)的加減運(yùn)算)指針與整數(shù)的加減運(yùn)算 指針的指針的加減運(yùn)算加減運(yùn)算與普通變量的加減與普通變量的加減運(yùn)算不同,由于指針存儲(chǔ)的是變量的運(yùn)算不同,由于指針存儲(chǔ)的是變量的內(nèi)存地址,指針加上或減去一個(gè)整數(shù)內(nèi)存地址,指針加上或減去一個(gè)整數(shù)n n,表示指針從當(dāng)前位置向后或向前,表示指針從當(dāng)前位置向后或向前移動(dòng)移動(dòng)n n個(gè)個(gè)sizeof(數(shù)據(jù)類型)(數(shù)據(jù)類型)長度的存長度的存儲(chǔ)單元。因此對于不同的數(shù)據(jù)類型,儲(chǔ)單元。因此對于不同的數(shù)據(jù)類型,n n的實(shí)際大小就不同。的實(shí)際大小就不同。(3 3)指針自增

13、、自減運(yùn)算)指針自增、自減運(yùn)算 指針的自增、自減運(yùn)算是指針加減運(yùn)算的特指針的自增、自減運(yùn)算是指針加減運(yùn)算的特例。指針的自增或自減表示指針從當(dāng)前位置例。指針的自增或自減表示指針從當(dāng)前位置向后或向前移動(dòng)向后或向前移動(dòng)sizeof(數(shù)據(jù)類型)長度的(數(shù)據(jù)類型)長度的存儲(chǔ)單元。存儲(chǔ)單元。 例如:例如: int *p,a=5,b=6,c=7; p=&b; p+; /指針指針p后移后移4個(gè)字節(jié)個(gè)字節(jié),指向指向a(4 4)兩指針相減)兩指針相減 當(dāng)兩個(gè)指針當(dāng)兩個(gè)指針指向同一數(shù)組時(shí)指向同一數(shù)組時(shí),兩個(gè)指,兩個(gè)指針的相減針的相減才有意義才有意義。兩個(gè)指針相減的結(jié)。兩個(gè)指針相減的結(jié)果為一整數(shù),表示兩個(gè)指針之間數(shù)組

14、元果為一整數(shù),表示兩個(gè)指針之間數(shù)組元素的個(gè)數(shù)。素的個(gè)數(shù)。 (5 5)兩個(gè)指針的比較運(yùn)算)兩個(gè)指針的比較運(yùn)算 兩個(gè)指針的比較一般用于下列兩種情況:兩個(gè)指針的比較一般用于下列兩種情況:一是比較兩個(gè)指針?biāo)赶虻膶ο笤趦?nèi)存一是比較兩個(gè)指針?biāo)赶虻膶ο笤趦?nèi)存中的中的位置關(guān)系位置關(guān)系;二是判斷指針是否為空;二是判斷指針是否為空指針。指針。void類型指針類型指針 指向指向voidvoid類型的指針是一種類型的指針是一種不確定類型不確定類型的指針,它的指針,它可以可以指向任何類型的變量指向任何類型的變量。實(shí)際使用。實(shí)際使用voidvoid型指針時(shí),只有通過型指針時(shí),只有通過強(qiáng)強(qiáng)制類型轉(zhuǎn)換制類型轉(zhuǎn)換才能使才能

15、使voidvoid型指針得到具體變量的值。在型指針得到具體變量的值。在沒有轉(zhuǎn)沒有轉(zhuǎn)換前換前voidvoid型指針型指針不能不能進(jìn)行指針的算術(shù)運(yùn)算。進(jìn)行指針的算術(shù)運(yùn)算。 例如:例如: voidvoid * *vpvp; /; /定義了一個(gè)定義了一個(gè)voidvoid型指針型指針vpvp intint i=6, i=6, * *ipip; ; vpvp=&i; / =&i; / vpvp指向整型變量指向整型變量i i coutcout“i=”“i=”* *vpvpendlendl; / ; / 錯(cuò)誤錯(cuò)誤 coutcouti=i=* *( (intint * *)p)pendlendl; ; ipip

16、=(=(intint * *) )vpvp; /; /ipip指向指向vpvp指向的變量指向的變量i i coutcouti=i=* *ipipendlendl; ; 指針與字符串指針與字符串 字符型指針:字符型指針: 用于存放字符型變量的地址,而用于存放字符型變量的地址,而字符串的本字符串的本質(zhì)是以質(zhì)是以00結(jié)尾的字符數(shù)組結(jié)尾的字符數(shù)組,一個(gè)字符型指針存儲(chǔ)了,一個(gè)字符型指針存儲(chǔ)了字符數(shù)組的第一個(gè)元素的地址,也就存儲(chǔ)了字符串字符數(shù)組的第一個(gè)元素的地址,也就存儲(chǔ)了字符串的地址,這個(gè)指針就指向了字符串。的地址,這個(gè)指針就指向了字符串。 在定義一個(gè)字符數(shù)組時(shí),可以將一個(gè)字符串在定義一個(gè)字符數(shù)組時(shí),可

17、以將一個(gè)字符串常量作為初值,但將字符串常量作為初值賦給字符常量作為初值,但將字符串常量作為初值賦給字符數(shù)組和將字符串常量作為數(shù)組和將字符串常量作為初值初值賦給字符指針變量,賦給字符指針變量,二者的含義是不同的。二者的含義是不同的。例如:例如: char str5=abcd; char *p_str=abcd;指針與數(shù)組指針與數(shù)組 1 1 使用指針操作符使用指針操作符* *存取數(shù)組存取數(shù)組 指針的加減運(yùn)算的特點(diǎn)指針的加減運(yùn)算的特點(diǎn)使得指針操作符特別適使得指針操作符特別適合處理存儲(chǔ)在合處理存儲(chǔ)在一段連續(xù)內(nèi)存空間一段連續(xù)內(nèi)存空間中的同類型數(shù)據(jù)。這中的同類型數(shù)據(jù)。這樣,使用指針操作符來對數(shù)組及其元素進(jìn)

18、行操作就非樣,使用指針操作符來對數(shù)組及其元素進(jìn)行操作就非常方便。常方便。(1) (1) 一維數(shù)組的指針操作一維數(shù)組的指針操作 當(dāng)定義數(shù)組一維數(shù)組當(dāng)定義數(shù)組一維數(shù)組t t anan (t (t為類型為類型) ),下式為,下式為存取數(shù)組元素存取數(shù)組元素aiai 的等效方式:的等效方式: * *( (a+ia+i) ); 而而a+ia+i為為aiai 的地址。的地址。數(shù)組指針數(shù)組指針 數(shù)組指針是指向數(shù)組的指針。數(shù)組指針是指向數(shù)組的指針。 例如:例如:intint ( (* * a_pa_p) 5;) 5;等效于下列定義方式:等效于下列定義方式: typedeftypedef intint i_a5;

19、 i_a5; i_a i_a * *a_pa_p; ;數(shù)組與函數(shù)數(shù)組與函數(shù) 數(shù)組名數(shù)組名是一個(gè)地址,不能當(dāng)作一個(gè)左值,是一個(gè)地址,不能當(dāng)作一個(gè)左值,但是可以作為函數(shù)的形參,接受實(shí)參傳送來但是可以作為函數(shù)的形參,接受實(shí)參傳送來的地址。的地址。 當(dāng)形參接受實(shí)參傳送來的地址后,形參當(dāng)形參接受實(shí)參傳送來的地址后,形參數(shù)組與實(shí)參數(shù)組與實(shí)參共享內(nèi)存中的一塊空間共享內(nèi)存中的一塊空間。函數(shù)體。函數(shù)體通過形參對數(shù)組內(nèi)容的改變會(huì)直接作用到實(shí)通過形參對數(shù)組內(nèi)容的改變會(huì)直接作用到實(shí)參上。參上。舉例舉例 void void func(intfunc(int a,inta,int n) n)intint i; i;for

20、(ifor(i=0;i=0;in;in;i+)+)aiai+=3;+=3; void main()void main()intint a=1,2,3,4,i; a=1,2,3,4,i;func(a,4);func(a,4);for(ifor(i=0;i4;i+)=0;i4;i+) coutcoutaiai:; ; coutcoutendlendl; ; void func(int b,int n);void func(int a10,int n);void func(int *a,int n);指向函數(shù)的指針指向函數(shù)的指針 在程序運(yùn)行時(shí),數(shù)據(jù)和代碼都占據(jù)一定在程序運(yùn)行時(shí),數(shù)據(jù)和代碼都占據(jù)一定的

21、內(nèi)存空間。每一個(gè)函數(shù)都有函數(shù)名,的內(nèi)存空間。每一個(gè)函數(shù)都有函數(shù)名,函數(shù)函數(shù)名就是該函數(shù)的代碼在內(nèi)存的起始地址名就是該函數(shù)的代碼在內(nèi)存的起始地址。 函數(shù)的調(diào)用形式:函數(shù)名(參數(shù)表),函數(shù)的調(diào)用形式:函數(shù)名(參數(shù)表),其實(shí)質(zhì)就是:其實(shí)質(zhì)就是:函數(shù)代碼首地址(參數(shù)表)函數(shù)代碼首地址(參數(shù)表)。 函數(shù)指針函數(shù)指針就是指向某個(gè)函數(shù)的指針,是就是指向某個(gè)函數(shù)的指針,是專門用于存放該函數(shù)代碼首地址的指針變量專門用于存放該函數(shù)代碼首地址的指針變量。函數(shù)指針的定義語法形式如下:函數(shù)指針的定義語法形式如下:數(shù)據(jù)類型數(shù)據(jù)類型 (* *函數(shù)指針名)(形參表);函數(shù)指針名)(形參表); 其中其中: :數(shù)據(jù)類型為函數(shù)指針

22、所指函數(shù)的返回值類型;數(shù)據(jù)類型為函數(shù)指針?biāo)负瘮?shù)的返回值類型;形參表則列出了該指針?biāo)负瘮?shù)的形參類型形參表則列出了該指針?biāo)负瘮?shù)的形參類型和個(gè)數(shù)。和個(gè)數(shù)。函數(shù)指針名與函數(shù)指針名與* *外面的圓括號(hào)()是必須的,外面的圓括號(hào)()是必須的,如果去掉圓括號(hào),將被解釋為函數(shù)的返回值如果去掉圓括號(hào),將被解釋為函數(shù)的返回值為指針。為指針。 函數(shù)指針的定義函數(shù)指針的定義 函數(shù)指針在函數(shù)指針在使用之前也要進(jìn)行賦值使用之前也要進(jìn)行賦值,使指,使指針指向一個(gè)已經(jīng)存在的函數(shù)代碼的起始地址。針指向一個(gè)已經(jīng)存在的函數(shù)代碼的起始地址。語法形式為:語法形式為: 函數(shù)指針名函數(shù)指針名=函數(shù)名;函數(shù)名;函數(shù)指針的初始化函數(shù)指針

23、的初始化例如:例如: intint add(intadd(int a,inta,int b);/ b);/定義函數(shù)定義函數(shù) intint ( (* *fptr)(intfptr)(int a,inta,int b);/ b);/定義函數(shù)指針定義函數(shù)指針 fptrfptr=add;/ =add;/ 函數(shù)指針賦值函數(shù)指針賦值例如:例如: add(1,2); add(1,2); ( (* *fptr)(1,2); fptr)(1,2); fptr(1,2); fptr(1,2);函數(shù)指針的使用函數(shù)指針的使用調(diào)用函數(shù)指針指向的函數(shù)有如下兩種格式:調(diào)用函數(shù)指針指向的函數(shù)有如下兩種格式: (* 函數(shù)指針名

24、函數(shù)指針名) (實(shí)參表實(shí)參表); 函數(shù)指針名函數(shù)指針名(實(shí)參表實(shí)參表);說明:當(dāng)用指向函數(shù)的指針調(diào)說明:當(dāng)用指向函數(shù)的指針調(diào)用函數(shù)用函數(shù)add()時(shí),習(xí)慣上使用時(shí),習(xí)慣上使用 (*fptr)(1,2),因?yàn)檫@種形,因?yàn)檫@種形式能更直觀地說明是用指向函式能更直觀地說明是用指向函數(shù)的指針來調(diào)用函數(shù)。數(shù)的指針來調(diào)用函數(shù)。二重和多重指針二重和多重指針 如果已經(jīng)定義了一個(gè)指針變量如果已經(jīng)定義了一個(gè)指針變量a a,再定義一個(gè)指針再定義一個(gè)指針b b,用于指向,用于指向a a,那么,那么稱稱b b是指向指針是指向指針a a的指針的指針,這樣的指針,這樣的指針也稱也稱二重指針二重指針。 三重及以上三重及以上的

25、指針統(tǒng)稱為的指針統(tǒng)稱為多重指針多重指針。例如:例如: intint a, a,* *p,p,* * *pp,pp,* * * *pppppp; ; p=&a;pp=&p; ppp=&pp;2021-10-1231動(dòng)態(tài)內(nèi)存分配和釋放動(dòng)態(tài)內(nèi)存分配和釋放c的做法的做法void *malloc(size_t size);voidfree(void *pmemory);例如:例如:char * p = (char *)malloc(100);strcpy(p,”hello world!”);printf(“%sn”,p);free(p);2021-10-1232c+的做法的做法 使用使用new和和del

26、ete,使用形式:使用形式:type *p; p=new type; delete p;type是一個(gè)是一個(gè)數(shù)據(jù)類型名數(shù)據(jù)類型名從堆空間中分從堆空間中分配一塊與配一塊與type類型的數(shù)據(jù)一類型的數(shù)據(jù)一樣大小的內(nèi)存樣大小的內(nèi)存用用delete來釋來釋放該內(nèi)存空間放該內(nèi)存空間2021-10-1233例如:動(dòng)態(tài)分配和釋放單個(gè)數(shù)據(jù)的存儲(chǔ)區(qū)例如:動(dòng)態(tài)分配和釋放單個(gè)數(shù)據(jù)的存儲(chǔ)區(qū)#include void main()int *p; p=new int;if(p=null)cout“allocation failure!n”;else*p=15;cout*p;delete p;2021-10-1234用用n

27、ew運(yùn)算符初始化單個(gè)數(shù)據(jù)的存儲(chǔ)區(qū)運(yùn)算符初始化單個(gè)數(shù)據(jù)的存儲(chǔ)區(qū)語法形式為:語法形式為: type *p; p=new type(初始值初始值); delete p;初始值可以是初始值可以是常量、變量、常量、變量、以及表達(dá)式以及表達(dá)式2021-10-1235 舉例舉例#include void main()int *p; p=new int(100);if(p=null)cout“allocation failure!n”;elsecout*p;delete p;提問:提問:如果如果p=new int(98.5),會(huì)怎么樣?,會(huì)怎么樣?2021-10-1236 注意:用注意:用delete釋放的內(nèi)

28、存空間釋放的內(nèi)存空間必須是由必須是由new分配的空間,否則執(zhí)分配的空間,否則執(zhí)行行delete時(shí)將會(huì)導(dǎo)致嚴(yán)重的錯(cuò)誤。時(shí)將會(huì)導(dǎo)致嚴(yán)重的錯(cuò)誤。例如:例如: int *p; delete p;/出錯(cuò)出錯(cuò)例如:例如: int *p,value; p=&value; delete p;/出錯(cuò)出錯(cuò)2021-10-1237動(dòng)態(tài)分配一維數(shù)組的存儲(chǔ)空間動(dòng)態(tài)分配一維數(shù)組的存儲(chǔ)空間 語法為:語法為:type *p;p=new typenum;delete p;num用于指定數(shù)組用于指定數(shù)組大小,可以是常量、大小,可以是常量、變量、以及表達(dá)式變量、以及表達(dá)式如果分配成果,如果分配成果, new返回的指針指向數(shù)組的返回

29、的指針指向數(shù)組的起始位置起始位置2021-10-1238例如:例如:#include void main()int i, *p; p=new int100;if(p=null)cout“allocation failure!n”;elsefor(i=0;i 100;i+)pi=i+1;for(i=0;i 100;i+)coutpi ;delete p;2021-10-1239引用引用 簡單地說,引用就是給一個(gè)單元簡單地說,引用就是給一個(gè)單元起一個(gè)別名。也就是說,引用與起一個(gè)別名。也就是說,引用與它所引用的變量共享存儲(chǔ)單元。它所引用的變量共享存儲(chǔ)單元。 引用主要有以下三種用法引用主要有以下三種用

30、法: 獨(dú)立引用獨(dú)立引用 作為函數(shù)參數(shù)作為函數(shù)參數(shù) 作為函數(shù)返回類型作為函數(shù)返回類型2021-10-1240獨(dú)立引用獨(dú)立引用int i=0, k=8;int &ri=i;int *p=&i;ri=k; ri是是i的引用,的引用, i和和ri代表同一個(gè)代表同一個(gè)內(nèi)存單元。內(nèi)存單元。 在聲明獨(dú)立引用時(shí)必須對它初始化,在聲明獨(dú)立引用時(shí)必須對它初始化,這種情況下的別名綁定是永久的。這種情況下的別名綁定是永久的。2021-10-1241初始化獨(dú)立引用的幾種方式初始化獨(dú)立引用的幾種方式“=”的右端是一個(gè)變量的右端是一個(gè)變量int a; int &ra=a;“=”的右端是一個(gè)常量的右端是一個(gè)常量const f

31、loat &r2=1.0;定義常引用定義常引用int x=1;const int &rx=x;rx=98;/錯(cuò)誤,只能使用錯(cuò)誤,只能使用rx,不能修改不能修改2021-10-1242引用作為函數(shù)參數(shù)引用作為函數(shù)參數(shù) c+和和c一樣一樣,都是采用都是采用“傳值傳值”的方式向函數(shù)傳遞參數(shù),從而使的方式向函數(shù)傳遞參數(shù),從而使實(shí)際參數(shù)和形式參數(shù)相結(jié)合的。實(shí)際參數(shù)和形式參數(shù)相結(jié)合的。在這種情況下,實(shí)參和形參是兩在這種情況下,實(shí)參和形參是兩個(gè)不同的單元,在結(jié)合時(shí),實(shí)參個(gè)不同的單元,在結(jié)合時(shí),實(shí)參的值將會(huì)被拷貝到形參中。的值將會(huì)被拷貝到形參中。2021-10-1243c+函數(shù)的傳值調(diào)用函數(shù)的傳值調(diào)用void func(int num)num+;void main( )int value=5;func( value );cout value ;由于由于“傳值傳值”方式的存在,方式的存在,因此試圖通過改變形參來改因此試圖

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論