![第5章 構(gòu)造數(shù)據(jù)類型(new)_第1頁](http://file3.renrendoc.com/fileroot3/2021-11/8/90b9319f-09de-41de-8c98-96fb1a0bac85/90b9319f-09de-41de-8c98-96fb1a0bac851.gif)
![第5章 構(gòu)造數(shù)據(jù)類型(new)_第2頁](http://file3.renrendoc.com/fileroot3/2021-11/8/90b9319f-09de-41de-8c98-96fb1a0bac85/90b9319f-09de-41de-8c98-96fb1a0bac852.gif)
![第5章 構(gòu)造數(shù)據(jù)類型(new)_第3頁](http://file3.renrendoc.com/fileroot3/2021-11/8/90b9319f-09de-41de-8c98-96fb1a0bac85/90b9319f-09de-41de-8c98-96fb1a0bac853.gif)
![第5章 構(gòu)造數(shù)據(jù)類型(new)_第4頁](http://file3.renrendoc.com/fileroot3/2021-11/8/90b9319f-09de-41de-8c98-96fb1a0bac85/90b9319f-09de-41de-8c98-96fb1a0bac854.gif)
![第5章 構(gòu)造數(shù)據(jù)類型(new)_第5頁](http://file3.renrendoc.com/fileroot3/2021-11/8/90b9319f-09de-41de-8c98-96fb1a0bac85/90b9319f-09de-41de-8c98-96fb1a0bac855.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第第5 5章章 構(gòu)造數(shù)據(jù)類型構(gòu)造數(shù)據(jù)類型C+語語言言程程序序設(shè)設(shè)計計教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型制作人:沈顯君 楊進才第第5 5章章構(gòu)造數(shù)據(jù)類型構(gòu)造數(shù)據(jù)類型1. 掌握枚舉類型的使用;2. 深入理解數(shù)組的概念, 掌握數(shù)組應(yīng)用的一般方法;3. 深入理解指針的概念,掌握指針的使用;4. 注意指針與數(shù)組的區(qū)別,會使用多重指針以及指針與數(shù)組的多種混合體,會分配動態(tài)數(shù)組;5. 理解字符串的概念,會使用字符串;6. 理解引用的概念,掌握引用型函數(shù)參數(shù)的用法;7. 掌握結(jié)構(gòu)與聯(lián)合類型的使用,并注意二者的區(qū)別。學習目標C+語語言言程程序序設(shè)設(shè)計計教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.1
2、 枚舉類型枚舉類型enumenumeration i.nju:mrein 1. 枚舉類型的定義:枚舉類型的定義: “枚舉枚舉”()()是指將變量所有可能的取值一一列舉出來,變量的取值只限于列舉出來的常量。 枚舉類型的聲明的一般形式如下 :枚舉類型名以及枚舉常量為標識符,遵循標識符的取名規(guī)則。在定義一個枚舉類型時,定義了多個常量,供枚舉類型變量取值,稱此常量為枚舉常量。當沒給各枚舉常量指定值時,其值依次默認為0、1、2、;在定義枚舉類型時,也可使用賦值號另行指定枚舉常量的值。 enum 枚舉類型名 枚舉常量1, 枚舉常量2, 枚舉常量n;枚舉!枚舉!C+語語言言程程序序設(shè)設(shè)計計教教程程 第第5章
3、章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.1 枚舉類型枚舉類型枚舉類型的定義:枚舉類型的定義:例1: enum weekday SUN, MON, TUE, WED, THU, FRI, SAT ; 定義了7個枚舉常量以及枚舉類型weekday。枚舉常量具有默認的整數(shù)與之對應(yīng):SUN的值為0、MON的值為1、TUE為2、SAT為6。例2: enum city Beijing,Shanghai,Tianjin=5,Chongqing; 枚舉常量Beijing的值為0,Shanghai的值為1,Tianjin的值指定為5。對于指定值后面的沒有指定值的枚舉常量,編譯器會將前一個常量值加1(下一個整數(shù))賦給它,所
4、以Chongqing的值為6。C+語語言言程程序序設(shè)設(shè)計計教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.1 枚舉類型枚舉類型枚舉類型的定義說明枚舉類型的定義說明: :枚舉類型定義了以后就可以使用枚舉常量、使用用枚舉類型來定義變量,定義枚舉變量的方法與定義其它變量的方法一樣。 例如: enum city city1, city2; city city1, city2; 用兩種方法定義了city1、city2兩個枚舉類型的變量名。枚舉類型變量也可以在定義枚舉類型的同時定義 例如: enum city Beijing,Shanghai,Tianjin=5,Chongqing city1, city
5、2; 在定義枚舉類型的同時定義枚舉類型變量可以省略枚舉類型名 例如: enum Beijing,Shanghai,Tianjin=5,Chongqing city1, city2; 在定義變量時,可以順便給出初值,若不給初值,默認初值為隨機的無意義的數(shù)。 C+語語言言程程序序設(shè)設(shè)計計教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.1 枚舉類型枚舉類型枚舉類型的使用:枚舉類型的使用:用枚舉類型建立枚舉變量后就可以對枚舉變量實施賦值以及進行其它運算了,對枚舉變量進行賦值,其值要求為同一枚舉類型要求為同一枚舉類型。否則,在編譯時出錯。 例如: weekday d1,d2,d3,d4; d1=SUN;
6、 d2=6; /錯誤 d3=Shanghai; /錯誤 其中對d2所賦之值是整數(shù)6,不是枚舉常量;可以采用將一個整型值強制轉(zhuǎn)換成同類型的枚舉常量賦給枚舉變量:枚舉常量、枚舉類型的變量可進行算術(shù)運算、關(guān)系運算可進行算術(shù)運算、關(guān)系運算。 對枚舉類型實施算術(shù)、關(guān)系運算時,枚舉值轉(zhuǎn)換成整型值參加運算,結(jié)果為整型值。所以,如果要將結(jié)果賦給枚舉變量,還要將結(jié)果轉(zhuǎn)換成枚舉值。 例如: d1=d1+2; /是錯誤的,因為結(jié)果為int型。 需要將它強制轉(zhuǎn)換成枚舉型: d1=(weekday)(d1+2);C+語語言言程程序序設(shè)設(shè)計計教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.1 枚舉類型枚舉類型枚舉類型的使
7、用:枚舉類型的使用: 枚舉常量、枚舉類型的變量可直接進行各種形式的關(guān)系運算可直接進行各種形式的關(guān)系運算。 例如: if(city1=3) ; if(city2=Beijing); if(Shanghai=1); if(city1SUN);枚舉類型變量不能直接進行輸入不能直接進行輸入 例如: cind1; /錯誤C+語語言言程程序序設(shè)設(shè)計計教教程程 第第4章章函函數(shù)數(shù)F注意注意: : 枚舉常量是常量,不是變量,所以不能對枚舉常量進行賦值。 例如: 在上例中不能進行賦值 Shanghai=Beijing; 枚舉常量的值不是列舉的字符串,其值為整數(shù)。 編譯器對賦給枚舉變量的對象(數(shù))進行類型檢查,如
8、類型不相符則發(fā)出警告。 當類型相 同,而值超出此類枚舉類型枚舉常量范圍時,也是正常的。123456789101112/* 程序名:p5_1.cpp * 功能: 枚舉類型的使用,輸入城市代號,輸出城市名稱 */#includeusing namespace std;enum city Beijing,Shanghai,Tianjin=6,Chongqing;int main() int n; coutInput a city number (Beijing-1 to exit):n;枚舉類型枚舉類型定義定義C+語語言言程程序序設(shè)設(shè)計計教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型【例例5-15-1
9、】輸入城市代號,輸出城市名稱。 5.1 枚舉類型枚舉類型131415161718192021222324 while(n=Beijing) switch(n) case Beijing: coutBeijingendl; break; case Shanghai: coutShanghaiendl;break; case Tianjin: coutTianjinendl; break; case Chongqing: coutChongqingendl; break; default: coutInvalid city number! n; return 0; Input a city num
10、ber (-1 to exit):1Shanghai8Invalid city number!-1 C+語語言言程程序序設(shè)設(shè)計計教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型枚舉類型的使用枚舉類型的使用5.1 枚舉類型枚舉類型C+語言程序設(shè)計清華大學 鄭莉5.2 數(shù)組的概念數(shù)組的概念數(shù)組數(shù)組是具有一定是具有一定順序關(guān)系順序關(guān)系的若干的若干相相同類型變量的集合體同類型變量的集合體,組成數(shù)組的變量,組成數(shù)組的變量稱為該數(shù)組的稱為該數(shù)組的元素元素。數(shù)組屬于構(gòu)造類型。數(shù)組屬于構(gòu)造類型。 數(shù) 組C+語言程序設(shè)計清華大學 鄭莉一維數(shù)組的聲明與引用一維數(shù)組的聲明與引用l一維數(shù)組的聲明一維數(shù)組的聲明類型說明符
11、數(shù)組名 常量表達式 ; 例如: int a10; 表示 a 為整型數(shù)組,有10個元素:a0.a9l引用引用必須先聲明,后使用。只能逐個引用數(shù)組元素,而不能一次引用整個數(shù)組例如:a0=a5+a7-a2*3數(shù)組名的構(gòu)成方法與一般變量名相同。 數(shù) 組C+語言程序設(shè)計清華大學 鄭莉一維數(shù)組的聲明與引用一維數(shù)組的聲明與引用#include using namespace std;void main()int A10,B10;int i;for(i=0;i10;i+)Ai=i*2-1;B10-i-1=Ai; 數(shù) 組 for(i=0;i10;i+) coutAi =&Ai; coutAi =Ai;
12、cout Bi = Biendl;C+語言程序設(shè)計清華大學 鄭莉一維數(shù)組的存儲順序一維數(shù)組的存儲順序數(shù)組元素在內(nèi)存中順次存放,它們的地址是連續(xù)的。例如:具有10個元素的數(shù)組 a,在內(nèi)存中的存放次序如下:數(shù)組名字是數(shù)組首元素的內(nèi)存地址。數(shù)組名是一個常量,不能被賦值。a0 a1a2 a3 a4a5 a6 a7a8 a9a 數(shù) 組C+語言程序設(shè)計清華大學 鄭莉一維數(shù)組的初始化一維數(shù)組的初始化可以在編譯階段使數(shù)組得到初值:可以在編譯階段使數(shù)組得到初值:在聲明數(shù)組時對數(shù)組元素賦以初值。例如:int a10=0,1,2,3,4,5,6,7,8,9;可以只給一部分元素賦初值。例如:int a10=0,1,2
13、,3,4;在對全部數(shù)組元素賦初值時,可以不指定數(shù)組長度。例如:int a=1,2,3,4,5 數(shù) 組C+語言程序設(shè)計清華大學 鄭莉#includeusing namespace std;void main() int i; int f20=1,1; /初始化第初始化第0、1個數(shù)個數(shù) for(i=2;i20;i+) fi=fi-2+fi-1; /求第求第219個數(shù)個數(shù) for(i=0;i20;i+) /輸出,每行輸出,每行5個數(shù)個數(shù)/ if(i%5=0) coutendl; cout.width(12); /設(shè)置輸出寬度為設(shè)置輸出寬度為12 coutfi; 例:用數(shù)組來處理求例:用數(shù)組來處理求F
14、ibonacci數(shù)列問題數(shù)列問題C+語言程序設(shè)計清華大學 鄭莉例:用數(shù)組來處理求例:用數(shù)組來處理求Fibonacci數(shù)列問題數(shù)列問題C+語言程序設(shè)計清華大學 鄭莉一維數(shù)組應(yīng)用舉例一維數(shù)組應(yīng)用舉例循環(huán)從鍵盤讀入若干組選擇題答案,循環(huán)從鍵盤讀入若干組選擇題答案,計算并輸出每組答案的正確率,直到輸計算并輸出每組答案的正確率,直到輸入入ctrl+z為止。為止。每組連續(xù)輸入每組連續(xù)輸入5個答案,每個答案個答案,每個答案可以是可以是a.d。 數(shù) 組C+語言程序設(shè)計清華大學 鄭莉#include using namespace std;void main(void) char key = a,c,b,a,d
15、;char c;int ques = 0, numques = 5, numcorrect = 0;cout Enter the numques question tests: endl; while (cin.get(c) if (c != n)if (c = keyques) numcorrect+; cout ;elsecout *; else cout Score float(numcorrect)/numques*100 %; ques = 0; / reset variables numcorrect = 0; cout endl; continue; ques+;18C+語言程序
16、設(shè)計清華大學 鄭莉運行結(jié)果:運行結(jié)果:acbba * Score 60%acbad Score 100%abbda * * Score 40%bdcba* Score 0%19C+語言程序設(shè)計清華大學 鄭莉二維數(shù)組的聲明及引用二維數(shù)組的聲明及引用數(shù)據(jù)類型數(shù)據(jù)類型 標識符標識符常量表達式常量表達式1常量表達式常量表達式2 ;例例: int a53; 表示a為整型二維數(shù)組,其中第一維有5個 下 標 ( 0 4 ) , 第 二 維 有 3 個 下 標(02),數(shù)組的元素個數(shù)為15,可以用于存放5行3列的整型數(shù)據(jù)表格。 數(shù) 組C+語言程序設(shè)計清華大學 鄭莉l存儲順序存儲順序按行存放,上例中數(shù)組a的存儲
17、順序為:l二維數(shù)組的聲明二維數(shù)組的聲明類型說明符 數(shù)組名常量表達式常量表達式例如:float a34;a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23a0a00 a01 a02 a03a1a10 a11 a12 a13a2a20 a21 a22 a23a可以理解為:l引用引用例如:b12=a23/2二維數(shù)組的聲明及引用二維數(shù)組的聲明及引用 數(shù) 組21C+語言程序設(shè)計清華大學 鄭莉l將所有數(shù)據(jù)寫在一個將所有數(shù)據(jù)寫在一個內(nèi),按順序賦值內(nèi),按順序賦值例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;l分行給二維數(shù)組賦初值分行給二
18、維數(shù)組賦初值例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;l可以對部分元素賦初值可以對部分元素賦初值例如:int a34=1,0,6,0,0,11;二維數(shù)組的初始化二維數(shù)組的初始化 數(shù) 組22C+語言程序設(shè)計清華大學 鄭莉數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù)l數(shù)組元素作實參,與單個變量一樣。數(shù)組元素作實參,與單個變量一樣。l數(shù)組名作參數(shù),形、實參數(shù)都應(yīng)是數(shù)數(shù)組名作參數(shù),形、實參數(shù)都應(yīng)是數(shù)組名,類型要一樣,傳送的是數(shù)組首組名,類型要一樣,傳送的是數(shù)組首地址。對形參數(shù)組的改變會直接影響地址。對形參數(shù)組的改變會直接影響到實參數(shù)組。到實參數(shù)組。 數(shù) 組C+語言程序設(shè)計清華大學
19、 鄭莉例例 使用數(shù)組名作為函數(shù)參數(shù)使用數(shù)組名作為函數(shù)參數(shù)l主函數(shù)中初始化一個矩陣并將每個元主函數(shù)中初始化一個矩陣并將每個元素都輸出,然后調(diào)用子函數(shù),分別計素都輸出,然后調(diào)用子函數(shù),分別計算每一行的元素之和,將和直接存放算每一行的元素之和,將和直接存放在每行的第一個元素中,返回主函數(shù)在每行的第一個元素中,返回主函數(shù)之后輸出各行元素的和。之后輸出各行元素的和。 數(shù) 組C+語言程序設(shè)計清華大學 鄭莉#include using namespace std;void RowSum(int A4, int nrow) int sum;for (int i = 0; i nrow; i+)sum = 0;
20、for(int j = 0; j 4; j+)sum += Aij;cout Sum of row i is sum endl; Ai0=sum; 25C+語言程序設(shè)計清華大學 鄭莉void main(void) int Table34 = 1,2,3,4,2,3,4,5,3,4,5,6;for (int i = 0; i 3; i+)for (int j = 0; j 4; j+)cout Tableij ;cout endl;RowSum(Table,3); for (int i = 0; i 3; i+) cout Tablei026C+語言程序設(shè)計清華大學 鄭莉運行結(jié)果:運行結(jié)果:1
21、2 3 42 3 4 53 4 5 6Sum of row 0 is 10Sum of row 1 is 14Sum of row 2 is 1810 14 1827C+語言程序設(shè)計清華大學 鄭莉5.3 字符串的輸入字符串的輸入/輸出輸出l方法方法逐個字符輸入輸出將整個字符串一次輸入或輸出例:char c=China; coutstr1str2str3; 運行時輸入數(shù)據(jù): How are you?內(nèi)存中變量狀態(tài)如下: str1: H o w 0 str2: a r e 0 str3: y o u ? 029C+語言程序設(shè)計清華大學 鄭莉若改為: static char str13; cinst
22、r; 運行時輸入數(shù)據(jù): How are you?內(nèi)存中變量 str 內(nèi)容如下: str: H o w 0 30C+語言程序設(shè)計清華大學 鄭莉整行輸入字符串整行輸入字符串lcin.getline(字符數(shù)組名字符數(shù)組名St, 字符個數(shù)字符個數(shù)N, 結(jié)束符結(jié)束符);功能:一次連續(xù)讀入多個字符(可以包括空格),直到讀滿N個,或遇到指定的結(jié)束符(默認為n)。讀入的字符串存放于字符數(shù)組St中。讀取但不存儲結(jié)束符。lcin.get(字符數(shù)組名字符數(shù)組名St, 字符個數(shù)字符個數(shù)N, 結(jié)束符結(jié)束符);功能:一次連續(xù)讀入多個字符(可以包括空格),直到讀滿N個,或遇到指定的結(jié)束符(默認為n)。讀入的字符串存放于字符
23、數(shù)組St中。既不讀取也不存儲結(jié)束符。 字符串C+語言程序設(shè)計清華大學 鄭莉整行輸入字符串舉例整行輸入字符串舉例#include using namespace std;void main (void) char city80;char state80;int i;for (i = 0; i 2; i+) cin.getline(city,80,); cin.getline(state,80,n); cout City: city State: state endl; 字符串C+語言程序設(shè)計清華大學 鄭莉運行結(jié)果運行結(jié)果Beijing,ChinaCity: Beijing Country: Ch
24、inaShanghai,ChinaCity: Shanghai Country: ChinaC+語言程序設(shè)計清華大學 鄭莉字符串處理函數(shù)字符串處理函數(shù)strcat(連接),(連接),strcpy(復(fù)制),(復(fù)制),strcmp(比較),(比較),strlen(求長度),(求長度), strlwr(轉(zhuǎn)換為小寫),轉(zhuǎn)換為小寫),strupr(轉(zhuǎn)換為大寫)(轉(zhuǎn)換為大寫)頭文件頭文件 字符串C+語言程序設(shè)計清華大學 鄭莉例例 string類應(yīng)用舉例類應(yīng)用舉例#include #include using namespace std ;void trueFalse(int x) cout (x? Tru
25、e: False) endl; 字符串C+語言程序設(shè)計清華大學 鄭莉void main() string S1=DEF, S2=123; char CP1 =ABC; char CP2 =DEF; cout S1 is S1 endl; cout S2 is S2 endl; coutlength of S2:S2.length()endl; cout CP1 is CP1 endl; cout CP2 is CP2 endl; cout S1=CP1 returned ; trueFalse(S1=CP1); cout CP2=S1 returned ; trueFalse(CP2=S1);
26、 S2+=S1; coutS2=S2+S1:S2endl; coutlength of S2:S2.length()endl;36C+語言程序設(shè)計清華大學 鄭莉5.4 指針:關(guān)于內(nèi)存地址指針:關(guān)于內(nèi)存地址l內(nèi)存空間的訪問方式內(nèi)存空間的訪問方式通過變量名訪問通過地址訪問l地址運算符:地址運算符:&例:int var;則&var 表示變量var在內(nèi)存中的起始地址C+語言程序設(shè)計清華大學 鄭莉聲明例:int i;int *i_pointer=&i; 指向整型變量的指針指針變量的概念概念指針:指針:內(nèi)存地址,用于 間接訪問內(nèi)存單元指針變量:指針變量: 用于存放地址的變量2000
27、3i_pointer*i_pointeri2000內(nèi)存用戶數(shù)據(jù)區(qū)變量 i變量 j變量 i_pointer362000200020043010引用例1: i=3;例2: *i_pointer=3; 指 針C+語言程序設(shè)計清華大學 鄭莉指針變量的初始化l語法形式 存儲類型 數(shù)據(jù)類型 *指針名初始地址;例: int *pa=&a;l注意事項 用變量地址作為初值時,該變量必須在指針初始化之前已說明過,且變量類型應(yīng)與指針類型一致。 可以用一個已賦初值的指針去初始化另一 個指針變量。 指 針C+語言程序設(shè)計清華大學 鄭莉指針變量的賦值運算指針變量的賦值運算指針名指針名=地址地址l“地址地址”中存放
28、的數(shù)據(jù)類型與指針類型必中存放的數(shù)據(jù)類型與指針類型必須相符。須相符。l向指針變量賦的值必須是地址常量或變量,向指針變量賦的值必須是地址常量或變量,不能是普通整數(shù)。但可以賦值為整數(shù)不能是普通整數(shù)。但可以賦值為整數(shù)0,表,表示空指針。示空指針。l指針的類型是它所指向變量的類型,而不指針的類型是它所指向變量的類型,而不是指針本身數(shù)據(jù)值的類型,任何一個指針是指針本身數(shù)據(jù)值的類型,任何一個指針本身的數(shù)據(jù)值都是本身的數(shù)據(jù)值都是unsigned long int型。型。l允許聲明指向允許聲明指向 void 類型的指針。該指針可類型的指針。該指針可以被賦予任何類型對象的地址。以被賦予任何類型對象的地址。例:例:
29、 void *general; 指 針C+語言程序設(shè)計清華大學 鄭莉例例 指針的聲明、賦值與使用指針的聲明、賦值與使用#includeusing namespace std;void main() int *i_pointer;/聲明聲明int型指針型指針i_pointerint i;/聲明聲明int型數(shù)型數(shù)ii_pointer=&i;/取取i的地址賦給的地址賦給i_pointeri=10;/int型數(shù)賦初值型數(shù)賦初值coutOutput int i=iendl; /輸出輸出int型數(shù)的值型數(shù)的值coutOutput int pointer i=*i_pointerendl; /輸出輸
30、出int型指針所指地址的內(nèi)容型指針所指地址的內(nèi)容 指 針C+語言程序設(shè)計清華大學 鄭莉程序運行的結(jié)果是:程序運行的結(jié)果是:Output int i=10Output int pointer i=1042C+語言程序設(shè)計清華大學 鄭莉指針變量的算術(shù)運算指針變量的算術(shù)運算l指針與整數(shù)的加減運算指針與整數(shù)的加減運算指針 p 加上或減去 n ,其意義是指針當前指向位置的前方或后方第 n 個數(shù)據(jù)的地址。這種運算的結(jié)果值取決于指針指向的數(shù)據(jù)類型。l指針加一,減一運算指針加一,減一運算指向下一個或前一個數(shù)據(jù)。例如:y=*px+ 相當于 y=*(px+) (*和+優(yōu)先級相同,自右向左運算) 指 針C+語言程序
31、設(shè)計清華大學 鄭莉papa-2pa-1pa+1pa+2pa+3*(pa-2)*pa*(pa+1)*(pa+2)*(pa+3)*(pa-1)short *pa44C+語言程序設(shè)計清華大學 鄭莉pb-1pbpb+1pb+2*(pb-1)*pb*(pb+1)*(pb+2)long *pb45C+語言程序設(shè)計清華大學 鄭莉l關(guān)系運算關(guān)系運算指向相同類型數(shù)據(jù)的指針之間可以進行各種關(guān)系運算。指向不同數(shù)據(jù)類型的指針,以及指針與一般整數(shù)變量之間的關(guān)系運算是無意義的。指針可以和零之間進行等于或不等于的關(guān)系運算。例如:p=0或p!=0l賦值運算賦值運算向指針變量賦的值必須是地址常量或變量,不能是普通整數(shù)。但可以賦
32、值為整數(shù)0,表示空指針。 指 針C+語言程序設(shè)計清華大學 鄭莉指向數(shù)組元素的指針指向數(shù)組元素的指針l聲明與賦值聲明與賦值例: int a10, *pa; pa=&a0; 或 pa=a;l通過指針引用數(shù)組元素通過指針引用數(shù)組元素經(jīng)過上述聲明及賦值后:*pa就是a0,*(pa+1)就是a1,. ,*(pa+i)就是ai.ai, *(pa+i), *(a+i), pai都是等效的。不能寫 a+,因為a是數(shù)組首地址是常量。 指 針C+語言程序設(shè)計清華大學 鄭莉例例 設(shè)有一個設(shè)有一個int型數(shù)組型數(shù)組a,有,有10個元素。個元素。用三種方法輸出各元素:用三種方法輸出各元素:使用數(shù)組名和下標使用數(shù)
33、組名和指針運算使用指針變量 指 針C+語言程序設(shè)計清華大學 鄭莉main() int a10; int i; for(i=0; iai; coutendl; for(i=0; i10; i+) coutai;使用數(shù)組名和下標使用數(shù)組名和下標49C+語言程序設(shè)計清華大學 鄭莉main() int a10; int i; for(i=0; iai; coutendl; for(i=0; i10; i+) cout*(a+i);使用數(shù)組名指針運算使用數(shù)組名指針運算C+語言程序設(shè)計清華大學 鄭莉使用指針變量使用指針變量main() int a10; int *p,i; for(i=0; iai; co
34、utendl; for(p=a; p(a+10); p+) cout*p;C+語言程序設(shè)計清華大學 鄭莉l數(shù)組的元素是指針型數(shù)組的元素是指針型l例:例:int *pa2; 由由pa0,pa1兩個指針組成兩個指針組成 指 針C+語言程序設(shè)計清華大學 鄭莉例例 利用指針數(shù)組存放單位矩陣利用指針數(shù)組存放單位矩陣#include using namespace std;void main() int line1=1,0,0; /聲明數(shù)組,矩陣的第一行聲明數(shù)組,矩陣的第一行int line2=0,1,0; /聲明數(shù)組,矩陣的第二行聲明數(shù)組,矩陣的第二行int line3=0,0,1; /聲明數(shù)組,矩陣的
35、第三行聲明數(shù)組,矩陣的第三行int *p_line3;/聲明整型指針數(shù)組聲明整型指針數(shù)組p_line0=line1; /初始化指針數(shù)組元素初始化指針數(shù)組元素p_line1=line2;p_line2=line3; 指 針C+語言程序設(shè)計清華大學 鄭莉/輸出單位矩陣輸出單位矩陣 coutMatrix test:endl;for(int i=0;i3;i+)/對指針數(shù)組元素循環(huán)對指針數(shù)組元素循環(huán) for(int j=0;j3;j+)/對矩陣每一行循環(huán)對矩陣每一行循環(huán) coutp_lineij ; coutendl;輸出結(jié)果為:輸出結(jié)果為:Matrix test:Matrix test:1,0,01
36、,0,00,1,00,1,00,0,10,0,154C+語言程序設(shè)計清華大學 鄭莉l以地址方式傳遞數(shù)據(jù),可以用來返回以地址方式傳遞數(shù)據(jù),可以用來返回函數(shù)處理結(jié)果。函數(shù)處理結(jié)果。l實參是數(shù)組名時形參可以是指針。實參是數(shù)組名時形參可以是指針。 指針與函數(shù)C+語言程序設(shè)計清華大學 鄭莉例例題目:讀入三個浮點數(shù),將整數(shù)部分和題目:讀入三個浮點數(shù),將整數(shù)部分和小數(shù)部分分別輸出小數(shù)部分分別輸出#include using namespace std;void splitfloat(float x, int *intpart, float *fracpart) /形參形參intpart、 fracpart是
37、指針是指針 *intpart = int(x);/ 取取x的整數(shù)部分的整數(shù)部分 *fracpart = x - *intpart; /取取x的小數(shù)部分的小數(shù)部分 指針與函數(shù)C+語言程序設(shè)計清華大學 鄭莉void main(void)int i, n;float x, f;cout Enter three (3) floating point numbers endl;for (i = 0; i x;splitfloat(x,&n,&f); /變量地址做實參變量地址做實參cout Integer Part is n Fraction Part is f endl;57C+語言程序
38、設(shè)計清華大學 鄭莉運行結(jié)果:運行結(jié)果:Enter three (3) floating point numbers 4.7Integer Part is 4 Fraction Part is 0.78.913Integer Part is 8 Fraction Part is 0.913-4.7518Integer Part is -4 Fraction Part is -0.751858C+語言程序設(shè)計清華大學 鄭莉當函數(shù)的返回值是地址時,該當函數(shù)的返回值是地址時,該函數(shù)就是指針形函數(shù)。函數(shù)就是指針形函數(shù)。聲明形式聲明形式 存儲類型存儲類型 數(shù)據(jù)類型數(shù)據(jù)類型 *函數(shù)名函數(shù)名()int *ge
39、tAddress(int i)return &i; 指針與函數(shù)C+語言程序設(shè)計清華大學 鄭莉l聲明形式聲明形式 存儲類型存儲類型 數(shù)據(jù)類型數(shù)據(jù)類型 (*函數(shù)指針名函數(shù)指針名)(); l含義:含義:數(shù)據(jù)指針指向數(shù)據(jù)存儲區(qū),而函數(shù)指針指向的是程序代碼存儲區(qū)。指向函數(shù)的指針指向函數(shù)的指針 指針與函數(shù)C+語言程序設(shè)計清華大學 鄭莉例例 函數(shù)指針函數(shù)指針#include using namespace std;void print_stuff(float data_to_ignore);void print_message(float list_this_data);void print_flo
40、at(float data_to_print);void (*function_pointer)(float);void main()float pi = (float)3.14159;float two_pi = (float)2.0 * pi; 指針與函數(shù)C+語言程序設(shè)計清華大學 鄭莉 print_stuff(pi); function_pointer = print_stuff; function_pointer(pi); function_pointer = print_message; function_pointer(two_pi); function_pointer(13.0);
41、 function_pointer = print_float; function_pointer(pi); print_float(pi);62C+語言程序設(shè)計清華大學 鄭莉void print_stuff(float data_to_ignore) coutThis is the print stuff function.n; void print_message(float list_this_data) coutThe data to be listed is list_this_dataendl; void print_float(float data_to_print) coutT
42、he data to be printed is data_to_printendl; 63C+語言程序設(shè)計清華大學 鄭莉運行結(jié)果:運行結(jié)果:This is the print stuff function. This is the print stuff function. The data to be listed is 6.283180 The data to be listed is 13.000000 The data to be printed is 3.141590 The data to be printed is 3.14159064動態(tài)內(nèi)存分配動態(tài)內(nèi)存分配 在C+中,動態(tài)內(nèi)
43、存分配技術(shù)可以保證程序在運行過程中根據(jù)實際需要申請適量的內(nèi)存,使用結(jié)束后還可以釋放。C+通過new運算運算和delete運算運算來實現(xiàn)動態(tài)內(nèi)存分配。 1. new運算運算 new運算的作用是按指定類型和大小動態(tài)的分配內(nèi)存。 基本語法形式為: 其中:數(shù)據(jù)類型可以是基本數(shù)據(jù)類型,也可以是用戶自定義的復(fù)雜數(shù)據(jù)類型。 new運算符在堆(內(nèi)存)中創(chuàng)建一個由類型名指定類型的對象,如果創(chuàng)建成功,返回對象的地址;否則返回空指針NULL。初值列表給出被創(chuàng)建對象的初始值。由于返回的是地址,所以要用事先定義一個類型相同的指針變量來存儲這個 地址。 指針變量指針變量=new 類型名類型名 (初值列表初值列表);del
44、ete 指針變量指針變量;C+語語言言程程序序設(shè)設(shè)計計教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型動態(tài)內(nèi)存分配動態(tài)內(nèi)存分配1)new創(chuàng)建指定類型對象創(chuàng)建指定類型對象 例: int *ip; ip=new int(5); /ip指向1個初值為5的int型對象 也可以使用一條語句定義: int *ip=new int(5); delete ip;C+語語言言程程序序設(shè)設(shè)計計教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型F 說明說明: : 首先定義了一個整型指針ip; 然后申請內(nèi)存,創(chuàng)建一個int型數(shù)據(jù)對象,并將該數(shù)據(jù)對象初始化為5; 最后返回創(chuàng)建的數(shù)據(jù)對象的地址,存入ip。動態(tài)內(nèi)存分配動態(tài)內(nèi)存分配2
45、)new創(chuàng)建動態(tài)數(shù)組時創(chuàng)建動態(tài)數(shù)組時 使用new運算可創(chuàng)建一個數(shù)據(jù)對象,也可以創(chuàng)建同類型的多個對象-數(shù)組。由于數(shù)組大小可以動態(tài)給定,所創(chuàng)建的對象稱為動態(tài)數(shù)組動態(tài)數(shù)組。new創(chuàng)建動態(tài)數(shù)組時,需要給出數(shù)組的結(jié)構(gòu)說明。 其語法格式如下: 其中:下標表達式與數(shù)組初始化時的常量表達式不同,可以是變量表達式。用new申請失敗時,返回NULL。申請一個動態(tài)數(shù)組,往往需要較大的空間,因此,在程序中需要對new的返回值進行判斷,看是否申請成功。 例: int *pa; pa=new int 5; /pa指向5個未初始化的int型數(shù)據(jù)對象的首地址 delete pa;C+語語言言程程序序設(shè)設(shè)計計教教程程 第第5章
46、章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型指針變量指針變量=new 類型名類型名 下標表達式下標表達式;delete 指針變量指針變量; 5.3.7 5.3.7 指針常量與常指針指針常量與常指針 1. 1. 指針常量指針常量 指針是常量 指針常量是相對于指針變量而言的,也就是指針值不能被修改的指針。 如果在定義指針變量時,指針變量前用const修飾,被定義的指針變量就變成了一個指針類型的常變量,指針類型的常變量簡稱為指針常量指針常量。 定義指針常量格式如下: 修飾符const與指針變量緊鄰,說明指針變量不允許修改。既然指針變量的值不能修改,所以一定要在定義時給出初值。 數(shù)據(jù)類型數(shù)據(jù)類型* * const co
47、nst 指針名指針名 = = 變量名;變量名; C+語語言言程程序序設(shè)設(shè)計計教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型修飾符const與指針變量緊鄰,說明指針的值不允許修改,所以一定要在定義時給出初值。 int a=2; int b=3; int * const p=&a; /定義了一個指針常量并初始化 p=&b; /錯誤,指針常量的值為常量,不能指向其它變量 p=NULL; /錯誤,指針常量的值為常量,不能被修改5.3.7 5.3.7 指針常量與常指針指針常量與常指針 因為const修飾的是指針,而不是指針指向的對象的值,所以指針指向的對象的值可以被更改: *p=4; /正
48、確,指針常量所指變量的值可以被修改 C+語語言言程程序序設(shè)設(shè)計計教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型 2.2.常量常量指針指針常量的指針常量的指針 如果在定義指針變量時,數(shù)據(jù)類型前用const修飾,被定義的指針變量就是指向常量的指針變量,指向常量的指針變量簡稱為常量指針。定義常量指針的格式如下: const const 數(shù)據(jù)類型數(shù)據(jù)類型* * 指針變量指針變量 = = 變量名;變量名;或 數(shù)據(jù)類型數(shù)據(jù)類型 const const * * 指針變量指針變量 = = 變量名;變量名;定義一個常量指針后,指針指向的對象的值不能被更改,即不能通過指針來更改所指向的對象的值,但指針本身可以改變,
49、指向另外的對象。 const int a=2; int b=3; const int * p=&a;/定義了一個常量指針并初始化 p=&b;/正確, 常量指針可以指向其它變量 p=NULL;/正確,指針常量的值可以被修改5.3.7 5.3.7 指針常量與常量指針指針常量與常量指針 因為const修飾的是指針指向的值,而不是指針,所以指針指向的值不能被 更改。 *p=4; /錯誤,指針常量所指變量的值不可以被修改 const用在數(shù)組的類型前修飾數(shù)組元素,數(shù)組元素為常量的數(shù)組的稱為常量數(shù)組,常量數(shù)組的元素不可改變,也不可將地址賦值給非常量指針。 const int a3=1,2,3
50、;/定義常量數(shù)組 a0=0; /錯誤,常量數(shù)組的元素不可修改 int *p=a; /錯誤,常量數(shù)組的地址不能賦給非常量指針C+語語言言程程序序設(shè)設(shè)計計教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型F注意注意: :常數(shù)組的所有元素必須全部賦初值。常數(shù)組的所有元素必須全部賦初值。 const int a=1,2,3; /正確 const char a=1,2,3; /正確 const int a10=1,2,3; /錯誤,常數(shù)組元素沒有全部賦初值 5.3.7 5.3.7 指針常量與常指針指針常量與常指針 3. 3. 指向常量的指針常量指向常量的指針常量 指針常量保護指針的值不被修改,常量指針保護指針
51、指向的值不被修改,為了將兩者同時保護,可以定義指向常量的指針常量,簡稱為常指針常量。常指針常量是常指針常量。常指針常量是一個指向常量的指針,指針值本身也是一個常量。 常指針常量定義格式如下: 其中:左邊的const與數(shù)據(jù)類型相結(jié)合,表明數(shù)據(jù)的值是常量;右邊的const用在變量前,表明變量的值是常量。定義一個常指針常量后,修改指針的值與修改指針指向內(nèi)容的值都是錯誤的: const int a=2; int b=3; int *q=&b; const int * const p=&a; /定義了一個常量指針并初始化 p=&b; /錯誤,常指針常量的值為常量,不能指向其它變量
52、 p=NULL; /錯誤,常指針常量的值為常量,不能被改變 *p=b; /錯誤,常指針常量所指的值為常量,不能被改變 p=q; /錯誤,常指針常量的值為常量,不能被改變 q=p; /錯誤,不能將一個常指針賦給非常指針 const const 數(shù)據(jù)類型數(shù)據(jù)類型* * const const 指針變量指針變量 = = 變量名;變量名;或 數(shù)據(jù)類型數(shù)據(jù)類型 const const * * const const 指針變量指針變量 = = 變量名;變量名; C+語語言言程程序序設(shè)設(shè)計計教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型F注意注意: :常指針類型通常用作函數(shù)的形參,以防止在函數(shù)體內(nèi)通過形參修改
53、實參指向的值,以保護實參。 5.4.2 引用與函數(shù)引用與函數(shù) 1. 1. 引用作為函數(shù)的參數(shù)引用作為函數(shù)的參數(shù) 當引用作為函數(shù)的形參,在進行函數(shù)調(diào)用時,進行實參與形參的結(jié)合,其結(jié)合過程相當于定義了一個形參對實參的引用引用。因此,在函數(shù)體內(nèi),對形參進行運算相當于對實參進行運算。與指針相比,引用作為函數(shù)參數(shù)具有兩個優(yōu)點優(yōu)點: 函數(shù)體的實現(xiàn)比指針簡單比指針簡單。用指針作為形參,函數(shù)體內(nèi)形參要帶著*參加運算;而用引用作為形參,函數(shù)體內(nèi)參加運算的為形參變量。 調(diào)用函數(shù)語法簡單語法簡單。用指針作為形參,實參需要取變量的地址;而用引用作為形參,與簡單傳值調(diào)用傳值調(diào)用一樣,實參為變量。 C+語語言言程程序序設(shè)
54、設(shè)計計教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型1234567891011121314151617181920 21/* p5_12.cpp * * 用傳引用的方式實現(xiàn)兩個數(shù)交換 */#include using namespace std;void swap(int &refx,int &refy) int temp; temp=refx; refx=refy; refy=temp;int main() int x=3,y=5; coutbefore swap: x=x y=yendl; swap(x,y); coutafter swap: x=x y=yendl; ret
55、urn 0; C+語語言言程程序序設(shè)設(shè)計計教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型before swap: x=3 y=5after swap: x=5 y=3 5.4.2 引用與函數(shù)引用與函數(shù) 2. 2. 引用作為函數(shù)的返回值引用作為函數(shù)的返回值 函數(shù)返回值類型為引用型,在函數(shù)調(diào)用時,若接受返回值的是一個引用變量,相當于定義了一個對返回變量的引用。若接受返回值的是一個非引用變量,函數(shù)返回變量的值賦給接受變量。 如果函數(shù)返回值類型為引用型,則要求返回值為左值。這樣,函數(shù)調(diào)用式可以當作左值。12345678910111213/* p5_13.cpp * * 使用引用作為函數(shù)的返回值 */#i
56、nclude using namespace std;int max1(int a ,int n) /求數(shù)組a 中元素的最大值 int t=0; for(int i=0;iat) t=i; return at+0;C+語語言言程程序序設(shè)設(shè)計計教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型1415161718192021222324252627 int& max2(int a,int n) /求數(shù)組a中元素的最大值 int t=0; for(int i=0;iat) t=i; return at;int& sum(int a ,int n) /求數(shù)組a中元素的和 int s=0; for(int i=0;in;i+) s+=ai; return s;C+語語言言程程序序設(shè)設(shè)計計教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.4.2 引用與函數(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 華師大版數(shù)學八年級上冊12.5《因式分解》(第1課時)聽評課記錄
- 現(xiàn)場服務(wù)協(xié)議書(2篇)
- 生活小家電代理銷售合同(2篇)
- 粵人版地理七年級上冊《第三節(jié) 聚落的發(fā)展變化》聽課評課記錄7
- 蘇州市公開課蘇教版六年級數(shù)學下冊《確定位置》聽評課記錄+教學反思
- 人教版數(shù)學八年級上下冊聽評課記錄(全冊)
- 人教版部編歷史八年級上冊《第19課 七七事變與全民族抗戰(zhàn)》聽課評課記錄3
- 五年級上冊數(shù)學聽評課記錄《4.3 探索活動:平行四邊形的面積》(18)-北師大版
- 新版華東師大版八年級數(shù)學下冊《16分式復(fù)習》聽評課記錄15
- 人教版數(shù)學七年級下冊第16課時《6.1平方根(第1課時)》聽評課記錄
- 2024時事政治考試題庫(基礎(chǔ)題)
- 2024山西文旅投資集團招聘117人公開引進高層次人才和急需緊缺人才筆試參考題庫(共500題)答案詳解版
- 小學校本課程教材《趣味數(shù)學》
- 干細胞療法推廣方案
- (2024年)電工安全培訓(xùn)(新編)課件
- mil-std-1916抽樣標準(中文版)
- 《社區(qū)康復(fù)》課件-第七章 腦癱患兒的社區(qū)康復(fù)實踐
- 城鄉(xiāng)環(huán)衛(wèi)一體化內(nèi)部管理制度
- 廣匯煤炭清潔煉化有限責任公司1000萬噸年煤炭分級提質(zhì)綜合利用項目變更環(huán)境影響報告書
- 小學數(shù)學六年級解方程練習300題及答案
- 大數(shù)據(jù)在化工行業(yè)中的應(yīng)用與創(chuàng)新
評論
0/150
提交評論