面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言C課件_第1頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言C課件_第2頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言C課件_第3頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言C課件_第4頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言C課件_第5頁(yè)
已閱讀5頁(yè),還剩50頁(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、第五章 構(gòu)造數(shù)據(jù)類型丘志杰電子科技大學(xué)計(jì)算機(jī)學(xué)院 軟件學(xué)院第1頁(yè),共55頁(yè)。枚舉類型 “枚舉”是指將變量所有可能的取值一一列舉出來(lái),變量的取值只限于列舉出來(lái)的常量。枚舉類型的聲明的一般形式如下 :當(dāng)沒(méi)給各枚舉常量指定值時(shí),其值依次默認(rèn)為0、1、2、;在定義枚舉類型時(shí),也可使用賦值號(hào)另行指定枚舉常量的值。 enum 枚舉類型名 枚舉常量1, 枚舉常量2, 枚舉常量n;枚舉!第2頁(yè),共55頁(yè)。例:Need To Do舉例 第3頁(yè),共55頁(yè)。數(shù)組 數(shù)組是一組在內(nèi)存中依次連續(xù)存放的、具有同一類型的數(shù)據(jù)變量所組成的集合體。數(shù)組元素用數(shù)組名與帶方括號(hào)的數(shù)組下標(biāo)一起標(biāo)識(shí)。第4頁(yè),共55頁(yè)。一維數(shù)組定義與使用

2、 一維數(shù)組定義的一般形式為: 數(shù)據(jù)類型 數(shù)組名常量表達(dá)式;說(shuō)明: 數(shù)組元素的類型可以是void型以外的任何數(shù)據(jù)類型。數(shù)組名代表數(shù)組元素在內(nèi)存中的起始地址,是一個(gè)地址常量。第5頁(yè),共55頁(yè)。 數(shù)組定義之后,系統(tǒng)會(huì)將從內(nèi)存中為其分配一塊連續(xù)的存儲(chǔ)空間,從第1個(gè)數(shù)據(jù)元素開(kāi)始依次存放各個(gè)數(shù)組元素。例如: int a5;第6頁(yè),共55頁(yè)。一維數(shù)組的初始化 一維數(shù)組初始化的語(yǔ)法形式為:數(shù)據(jù)類型 數(shù)組名 常量表達(dá)式 =初值1, 初值2, 初值n;例如: int array3=5,6,7; int array23=1,2;第7頁(yè),共55頁(yè)。存取一維數(shù)組元素的語(yǔ)法形式為:數(shù)組名 下標(biāo)表達(dá)式; 讀數(shù)組元素的地址通

3、過(guò)數(shù)組名來(lái)讀取,格式如下:數(shù)組名+整型表達(dá)式;或&數(shù)組名下標(biāo)表達(dá)式; 第8頁(yè),共55頁(yè)。使用數(shù)組要注意的地方在使用數(shù)組時(shí)最常犯的錯(cuò)誤是下標(biāo)越界。數(shù)組名是一個(gè)地址常量,不能作為左值(賦值的目標(biāo))。因此,不能將一個(gè)數(shù)組整體拷貝給另外一個(gè)數(shù)組。例如: int a5,c5,i; a=c;/錯(cuò)誤! 正確的方法是將對(duì)應(yīng)的元素進(jìn)行拷貝: for(i=0;i5;i+) ai=ci; 第9頁(yè),共55頁(yè)。字符數(shù)組與字符串 存放字符型數(shù)據(jù)的數(shù)組稱為字符數(shù)組。 1.用字符進(jìn)行初始化 例如: chars1 =C,h,i,n,a; 2.用字符串進(jìn)行初始化 例如: chars2 =China;第10頁(yè),共55頁(yè)。字符數(shù)組的

4、使用 字符數(shù)組也是數(shù)組,我們同樣可以通過(guò)數(shù)組名及下標(biāo)引用數(shù)組中的元素。為方便對(duì)字符與字符串的處理,C+提供了許多專門(mén)處理字符與字符串的函數(shù)。參看P118表5-1。第11頁(yè),共55頁(yè)。指針指針是C+語(yǔ)言最重要特性之一,也是C+的主要難點(diǎn)。指針提供了一種較為直觀的地址操作的手段,正確地使用指針,可以方便、靈活而有效地組織和表示復(fù)雜的數(shù)據(jù)。第12頁(yè),共55頁(yè)。地址與指針 地址:當(dāng)定義一個(gè)變量后,內(nèi)存中將會(huì)劃出一塊由若干個(gè)存儲(chǔ)單元組成的區(qū)域,用于保存該變量的數(shù)據(jù)。在內(nèi)存里每個(gè)存儲(chǔ)單元都有各自的編號(hào),稱為地址。 指針:在C+中,提供了指針類型,它是一種用于存放內(nèi)存單元地址的變量類型,地址就存儲(chǔ)在這種指針

5、類型的變量中。正因?yàn)橹羔樧兞看鎯?chǔ)的是地址,用它來(lái)指明內(nèi)存單元,所以形象地稱這種地址變量為指針。 第13頁(yè),共55頁(yè)。指針變量的定義例如: int*ip; /定義了一個(gè)int型的指針變量ip float*fp; /定義了一個(gè)float型指針變量fp typedef int A10; A *ap; / 定義了一個(gè)A類型的指針變量ap sizeof(ip)=sizeof(fp)=sizeof(ap)=4; 定義指針變量的格式如下: 數(shù)據(jù)類型 * 變量名; 第14頁(yè),共55頁(yè)。指針的初始化與賦值(1)不要將一個(gè)非地址常量、變量以及無(wú)意義的實(shí)際地址賦給指針變量。如: int *p=100; / int

6、*p=(int*)100;(對(duì)嗎?) int *p=(char *)100; (2)可以使用一個(gè)已初始化的指針去給另一個(gè)指針賦值,但類型必須一致如果不一致,可進(jìn)行強(qiáng)制類型轉(zhuǎn)換。 char *p=NULL; int *ip=(int *)p+100; 數(shù)據(jù)類型 *指針變量名=初始地址表達(dá)式; 第15頁(yè),共55頁(yè)。(3)對(duì)于基本數(shù)據(jù)類型的變量、數(shù)組元素我們可以使用取地址運(yùn)算符&來(lái)獲得它們的地址,但是也只有類型一致才能賦值。 int a10; /定義int型數(shù)組 int *i_pointer=a;/定義并初始化int型指針 (4)有一種特殊的void類型指針,可以存儲(chǔ)任何的類型地址;但將一個(gè)void

7、類型的地址賦值給非void類型的指針變量,要使用類型強(qiáng)制轉(zhuǎn)換。 void v; /錯(cuò)誤,不能定義void類型的變量 void *vp; /定義void類型的指針第16頁(yè),共55頁(yè)。指針運(yùn)算 指針通常進(jìn)行下列幾種運(yùn)算:賦值運(yùn)算、取值運(yùn)算、算術(shù)運(yùn)算、相減運(yùn)算、比較運(yùn)算。(1)* 和&運(yùn)算 *:指針運(yùn)算符,&:取地址運(yùn)算符。 例如: int a4=1,2,3; int *ip=&a2; cout*ip; *ip=100; 第17頁(yè),共55頁(yè)。(2)指針與整數(shù)的加減運(yùn)算 指針的加減運(yùn)算與普通變量的加減運(yùn)算不同,由于指針存儲(chǔ)的是變量的內(nèi)存地址,指針加上或減去一個(gè)整數(shù)n,表示指針從當(dāng)前位置向后或向前移動(dòng)n

8、個(gè)sizeof(數(shù)據(jù)類型)長(zhǎng)度的存儲(chǔ)單元。因此對(duì)于不同的數(shù)據(jù)類型,n的實(shí)際大小就不同。第18頁(yè),共55頁(yè)。(3)指針自增、自減運(yùn)算 指針的自增、自減運(yùn)算是指針加減運(yùn)算的特例。指針的自增或自減表示指針從當(dāng)前位置向后或向前移動(dòng)sizeof(數(shù)據(jù)類型)長(zhǎng)度的存儲(chǔ)單元。 例如: int *p,a=5; p=&a; p+; /指針p后移4個(gè)字節(jié) 第19頁(yè),共55頁(yè)。(4)兩指針相減 當(dāng)兩個(gè)指針指向同一數(shù)組時(shí),兩個(gè)指針的相減才有意義。兩個(gè)指針相減的結(jié)果為一整數(shù),表示兩個(gè)指針之間數(shù)組元素的個(gè)數(shù)。(5)兩個(gè)指針的比較運(yùn)算 兩個(gè)指針的比較一般用于下列兩種情況:一是比較兩個(gè)指針?biāo)赶虻膶?duì)象在內(nèi)存中的位置關(guān)系;二是

9、判斷指針是否為空指針。第20頁(yè),共55頁(yè)。void類型指針 指向void類型的指針是一種不確定類型的指針,它可以指向任何類型的變量。實(shí)際使用void型指針時(shí),只有通過(guò)強(qiáng)制類型轉(zhuǎn)換才能使void型指針得到具體變量的值。在沒(méi)有轉(zhuǎn)換前void型指針不能進(jìn)行指針的算術(shù)運(yùn)算。 例如: void*vp; /定義了一個(gè)void型指針vp inti=6, *ip; vp=&i; / vp指向整型變量i cout“i=”*vpendl; / 錯(cuò)誤 couti=*(int*)pendl; ip=(int*)vp; /ip指向vp指向的變量i couti=*ipendl; 第21頁(yè),共55頁(yè)。指針與字符串 字符型指

10、針: 用于存放字符型變量的地址,而字符串的本質(zhì)是以0結(jié)尾的字符數(shù)組,一個(gè)字符型指針存儲(chǔ)了字符數(shù)組的第一個(gè)元素的地址,也就存儲(chǔ)了字符串的地址,這個(gè)指針就指向了字符串。 在定義一個(gè)字符數(shù)組時(shí),可以將一個(gè)字符串常量作為初值,但將字符串常量作為初值賦給字符數(shù)組和將字符串常量作為初值賦給字符指針變量,二者的含義是不同的。例如: char str5=abcd; char *p_str=abcd;第22頁(yè),共55頁(yè)。指針與數(shù)組 1 使用指針操作符*存取數(shù)組 指針的加減運(yùn)算的特點(diǎn)使得指針操作符特別適合處理存儲(chǔ)在一段連續(xù)內(nèi)存空間中的同類型數(shù)據(jù)。這樣,使用指針操作符來(lái)對(duì)數(shù)組及其元素進(jìn)行操作就非常方便。(1) 一維

11、數(shù)組的指針操作 當(dāng)定義數(shù)組一維數(shù)組T aN (T為類型),下式為存取數(shù)組元素ai的等效方式: *(a+i); 而a+i為ai的地址。第23頁(yè),共55頁(yè)。數(shù)組指針 數(shù)組指針是指向數(shù)組的指針。 例如:int(* a_p) 5;等效于下列定義方式: typedef int I_A5; I_A *a_p;第24頁(yè),共55頁(yè)。數(shù)組與函數(shù) 數(shù)組名是一個(gè)地址,不能當(dāng)作一個(gè)左值,但是可以作為函數(shù)的形參,接受實(shí)參傳送來(lái)的地址。當(dāng)形參接受實(shí)參傳送來(lái)的地址后,形參數(shù)組與實(shí)參共享內(nèi)存中的一塊空間。函數(shù)體通過(guò)形參對(duì)數(shù)組內(nèi)容的改變會(huì)直接作用到實(shí)參上。數(shù)組名作為形參是數(shù)組應(yīng)用的一個(gè)重要方面。 第25頁(yè),共55頁(yè)。舉例 vo

12、id func(int a,int n)int i;for(i=0;in;i+)ai+=3;void main()int a=1,2,3,4;func(a,4); 第26頁(yè),共55頁(yè)。指向函數(shù)的指針 在程序運(yùn)行時(shí),不僅數(shù)據(jù)要占用內(nèi)存空間,程序的代碼也被調(diào)入內(nèi)存并占據(jù)一定的內(nèi)存空間。每一個(gè)函數(shù)都有函數(shù)名,實(shí)際上,這個(gè)函數(shù)名就是該函數(shù)的代碼在內(nèi)存的起始地址。 當(dāng)調(diào)用一個(gè)函數(shù)時(shí),編譯系統(tǒng)就是根據(jù)函數(shù)名找到函數(shù)代碼的首地址,從而執(zhí)行這段代碼。由此看來(lái),函數(shù)的調(diào)用形式:函數(shù)名(參數(shù)表),其實(shí)質(zhì)就是:函數(shù)代碼首地址(參數(shù)表)。 函數(shù)指針: 就是指向某個(gè)函數(shù)的指針,它是專門(mén)用于存放該函數(shù)代碼首地址的指針變量

13、。一旦定義了某個(gè)函數(shù)指針,那么,它就與函數(shù)名有同樣的作用,在程序中就可以象使用函數(shù)名一樣,通過(guò)指向該函數(shù)的指針來(lái)調(diào)用該函數(shù)。 第27頁(yè),共55頁(yè)。函數(shù)指針的定義語(yǔ)法形式如下:其中:數(shù)據(jù)類型為函數(shù)指針?biāo)负瘮?shù)的返回值類型;形參表則列出了該指針?biāo)负瘮?shù)的形參類型和個(gè)數(shù)。函數(shù)指針名與*外面的圓括號(hào)()是必須的,如果去掉圓括號(hào),將被解釋為函數(shù)的返回值為指針。 數(shù)據(jù)類型 (*函數(shù)指針名)(形參表); 第28頁(yè),共55頁(yè)。 函數(shù)指針在使用之前也要進(jìn)行賦值,使指針指向一個(gè)已經(jīng)存在的函數(shù)代碼的起始地址。語(yǔ)法形式為:函數(shù)指針名=函數(shù)名; 調(diào)用函數(shù)指針指向的函數(shù)有如下兩種格式: 函數(shù)指針名(實(shí)參表); (* 函數(shù)

14、指針名) (實(shí)參表); 例如: int add(int a,int b);/定義函數(shù) int (*fptr)(int a,int b);/定義函數(shù)指針 fptr=add;/ 函數(shù)指針賦值第29頁(yè),共55頁(yè)。 采用下列任何一種形式調(diào)用函數(shù)add: add(1,2); (*fptr)(1,2); fptr(1,2);說(shuō)明:雖然三種調(diào)用形式的結(jié)果完全相同,當(dāng)用指向函數(shù)的指針調(diào)用函數(shù)add()時(shí),習(xí)慣上使用(*fptr)(1,2),因?yàn)檫@種形式能更直觀地說(shuō)明是用指向函數(shù)的指針來(lái)調(diào)用函數(shù)。第30頁(yè),共55頁(yè)。多重指針 如果已經(jīng)定義了一個(gè)指針類型,我們?cè)俣x一個(gè)指針,用于指向已經(jīng)定義的指針變量,后面定義的

15、指針變量就是一個(gè)指向指針的指針變量,簡(jiǎn)稱指向指針的指針,這樣的指針也稱二重(級(jí))指針。 三重及以上的指針統(tǒng)稱為多重指針。例如: int *pp; 定義了一個(gè)二級(jí)指針變量,等效于下列定義方式: typedef int * P; P *p; 例:int a,*p,*pp; p=&a;pp=&p;第31頁(yè),共55頁(yè)。動(dòng)態(tài)存儲(chǔ)分配和釋放存儲(chǔ)空間C的做法void *malloc(size_t size);voidfree(void *pMemory);例如:char * p = (char *)malloc(100);strcpy(p,”Hello World!”);free(p);注意:這里是以字節(jié)計(jì)

16、算的單元數(shù)目第32頁(yè),共55頁(yè)。2022/7/2932C+的做法使用運(yùn)算符new和delete使用形式 type是一個(gè)數(shù)據(jù)類型名,p是該類型的指針變量,new的作用就是從堆空間中分配一塊與type類型的數(shù)據(jù)一樣大小的內(nèi)存(如果分配失敗,new返回一個(gè)空指針),該內(nèi)存地址被存于指針p中。一旦不想再使用,可以用delete來(lái)釋放該內(nèi)存空間。type *p; p=new type; delete p;第33頁(yè),共55頁(yè)。2022/7/2933舉例int *p; p=new int; *p=50;delete p;第34頁(yè),共55頁(yè)。2022/7/2934幾點(diǎn)注意使用new申請(qǐng)的內(nèi)存空間是沒(méi)有名字的,

17、只能通過(guò)指針間接訪問(wèn)它們。用delete釋放的內(nèi)存空間必須是由new分配的空間,否則執(zhí)行delete時(shí)將會(huì)導(dǎo)致嚴(yán)重的錯(cuò)誤。例如:int *p; delete p;/出錯(cuò)int *p,value; p=&value;delete p;/出錯(cuò)第35頁(yè),共55頁(yè)。2022/7/2935new和delete的典型用法動(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;pp15第36頁(yè),共55頁(yè)。2022/7/2936用new

18、運(yùn)算符初始化單個(gè)數(shù)據(jù)的存儲(chǔ)區(qū)語(yǔ)法為:type *p;P=new type(初始值);delete p;幾點(diǎn)說(shuō)明:是用小括號(hào)將初始值括起來(lái)。初始值可以是常量、變量、以及表達(dá)式。第37頁(yè),共55頁(yè)。2022/7/2937舉例#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ì)怎么樣?注意:初始值必須與相應(yīng)類型一致。p100第38頁(yè),共55頁(yè)。2022/7/2938動(dòng)態(tài)分配一維數(shù)組的存儲(chǔ)空間語(yǔ)法為:type *p;

19、P=new typenum;delete p;幾點(diǎn)說(shuō)明:num用于指定數(shù)組大小,可以是常量、變量、以及表達(dá)式,并且用中括號(hào)括起來(lái)。通過(guò)pi的方式訪問(wèn)數(shù)組元素。第39頁(yè),共55頁(yè)。2022/7/2939#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;p1100Unit 99Unit 0第40頁(yè),共55頁(yè)。2022/7/2940幾點(diǎn)說(shuō)明:new返回的指針指向數(shù)組的

20、起始位置,也就是數(shù)組的第一個(gè)元素。用new動(dòng)態(tài)分配一個(gè)數(shù)組時(shí)不能對(duì)它進(jìn)行初始化。(呵呵,為什么?)第41頁(yè),共55頁(yè)。2022/7/2941引用 Reference簡(jiǎn)單地說(shuō),引用就是給一個(gè)單元起一個(gè)別名。也就是說(shuō),引用與它所引用的變量共享存儲(chǔ)單元。引用主要有以下三種用法:獨(dú)立引用作為函數(shù)參數(shù)作為函數(shù)返回類型第42頁(yè),共55頁(yè)。2022/7/2942獨(dú)立引用int i=0, k=8;int &j=i;int *p=&i;j=k;0ijpj是i的引用, i和j是代表同一個(gè)單元。 這種使用引用的方式稱為獨(dú)立引用。在聲明獨(dú)立引用時(shí)必須對(duì)它初始化,這種情況下的別名綁定是永久的。語(yǔ)句”j=k;” 不是試圖

21、使j成為k的別名,而是在給j賦值,即使j的值也就是i的值等于k。第43頁(yè),共55頁(yè)。2022/7/2943初始化獨(dú)立引用的幾種方式賦值表達(dá)式的右端是一個(gè)變量int a; int &ra=a;賦值表達(dá)式的右端是一個(gè)常量float &r1=1.0;/早期的C+版本const float &r2=1.0;/近期C+版本定義常引用int x=1;const int &rx=x;rx=98;/錯(cuò)誤,只能使用rx,不能修改第44頁(yè),共55頁(yè)。2022/7/2944引用作為函數(shù)參數(shù)C+和C一樣,都是采用“傳值”的方式向函數(shù)傳遞參數(shù),從而使實(shí)際參數(shù)和形式參數(shù)相結(jié)合的。在這種情況下,實(shí)參和形參是兩個(gè)不同的單元,

22、在結(jié)合時(shí),實(shí)參的值將會(huì)被拷貝到形參中。第45頁(yè),共55頁(yè)。2022/7/2945C+函數(shù)的傳值調(diào)用void func(int num)num+;void main( )int value=5;func( value );cout value ;/輸出:5value5(6)num5StackCopy由于“傳值”方式的存在,因此試圖通過(guò)改變形參來(lái)改變實(shí)參的努力是不會(huì)成功的。第46頁(yè),共55頁(yè)。2022/7/2946通過(guò)傳地址來(lái)改變實(shí)參為了解決上述問(wèn)題,在C語(yǔ)言中,可以通過(guò)傳遞指針的方式來(lái)完成。我們可以通過(guò)形參指針間接地改變實(shí)參。第47頁(yè),共55頁(yè)。2022/7/2947C語(yǔ)言的傳指針調(diào)用void

23、func(int *pnum)(*pnum)+;void main( )int value=5;func( &value );cout value ;/輸出:6valuevalue的地址pnum5(6)Stack指向此時(shí)實(shí)參與形參的傳遞為:int *pnum=&value;第48頁(yè),共55頁(yè)。2022/7/2948C+傳遞引用的方式C+采用了比傳遞指針更好的方式:傳遞引用。在這種情況下,形參的名字將被看作是實(shí)參的別名(同獨(dú)立引用的情況一樣),也就是說(shuō),形參就是實(shí)參本身。此時(shí)對(duì)形參的改變也就直接改變了實(shí)參。第49頁(yè),共55頁(yè)。2022/7/2949C+語(yǔ)言的引用調(diào)用void func(int &pnum)pnum+;void main( )int value=5;func(value );cout value ;

溫馨提示

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