版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、C+語言程序設(shè)計(第4版)第六章 數(shù)組 指針與字符串清華大學(xué) 鄭 莉C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)目錄6.1 數(shù)組6.2 指針6.3 動態(tài)內(nèi)存分配6.4 用vector創(chuàng)建數(shù)組對象6.5 深拷貝與淺拷貝6.6 字符串6.7 綜合實例個人銀行賬戶管理程序6.8 深度探索6.9 小結(jié)2C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)數(shù)組的概念 數(shù)組是具有一定順序關(guān)系的若干相同類型變量的集合體,組成數(shù)組的變量稱為該數(shù)組的元素。 數(shù)組屬于構(gòu)造類型。36.1 數(shù)組C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)6.1.1 數(shù)組的聲明與使用 數(shù)組的聲明46.1 數(shù)組類型說明符 數(shù)組名 常量表達式 常量表達
2、式 ;數(shù)組名的構(gòu)成方法與一般變量名相同。例如:int a10; 表示a為整型數(shù)組,有10個元素:a0.a9例如: int a53;表示a為整型二維數(shù)組,其中第一維有5個下標(biāo)(04),第二維有3個下標(biāo)(02),數(shù)組的元素個數(shù)為15,可以用于存放5行3列的整型數(shù)據(jù)表格。C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)6.1.1 數(shù)組的聲明與使用(續(xù)) 引用必須先聲明,后使用。只能逐個引用數(shù)組元素,而不能一次引用整個數(shù)組例如:a0=a5+a7-a2*3例如:b12=a23/256.1 數(shù)組C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)66.1 數(shù)組 6.1.1 數(shù)組的聲明與使用例6-1#include usi
3、ng namespace std;int main() int a10, b10; for(int i = 0; i 10; i+) ai = i * 2 - 1; b10 - i - 1 = ai; for(int i = 0; i 10; i+) cout a i = ai ; cout b I = bi endl; return 0;C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)76.1 數(shù)組6.1.2 數(shù)組的存儲與初始化 一維數(shù)組的存儲數(shù)組元素在內(nèi)存中順次存放,它們的地址是連續(xù)的。例如:a0a1a2a3a4a5a6a7a8a9a數(shù)組名字是數(shù)組首元素的內(nèi)存地址。數(shù)組名是一個常量,不能被賦值。
4、C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)86.1 數(shù)組6.1.2 數(shù)組的存儲與初始化(續(xù)) 一維數(shù)組的初始化可以在定義數(shù)組的同時賦給初值: 在聲明數(shù)組時對數(shù)組元素賦以初值。例如:static int a10=0,1,2,3,4,5,6,7,8,9; 可以只給一部分元素賦初值。例如:static int a10=0,1,2,3,4; 在對全部數(shù)組元素賦初值時,可以不指定數(shù)組長度。例如:static int a=0,1,2,3,4,5,6,7,8,9C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)96.1 數(shù)組6.1.2 數(shù)組的存儲與初始化(續(xù)) 二維數(shù)組的存儲按行存放例如: float a34;其中
5、數(shù)組a的存儲順序為:a0a00 a01 a02 a03a1a10 a11 a12 a13a2a20 a21 a22 a23a可以理解為:a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)106.1 數(shù)組6.1.2 數(shù)組的存儲與初始化(續(xù)) 二維數(shù)組的初始化 將所有數(shù)據(jù)寫在一個內(nèi),按順序賦值例如:static int a34=1,2,3,4,5,6,7,8,9,10,11,12; 分行給二維數(shù)組賦初值例如:static int a34 =1,2,3,4,5,6,7,8,9,10,11,12; 可以對部分元素賦初
6、值例如:static int a34=1,0,6,0,0,11;C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)116.1 數(shù)組 6.1.2 數(shù)組的存儲與初始化例: 數(shù)組處理求Fibonacci數(shù)列#include using namespace std;int main() int f20 = 1,1;/初始化第0、1個數(shù) for (int i = 2; i 20; i+) /求第219個數(shù) fi = fi - 2 + fi - 1; for (i=0;i20;i+) /輸出,每行5個數(shù) if (i % 5 = 0) cout endl; cout.width(12); /設(shè)置輸出寬度為12 co
7、ut fi; return 0;C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)126.1 數(shù)組 6.1.2 數(shù)組的存儲與初始化例 (續(xù))運行結(jié)果:運行結(jié)果:1 11 12 23 35 58 81313212134345555898914414423323337737761061098798715971597258425844181418167656765C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例: 一維數(shù)組應(yīng)用舉例循環(huán)從鍵盤讀入若干組選擇題答案,計算并輸出每組答案的正確率,直到輸入ctrl+z為止。每組連續(xù)輸入5個答案,每個答案可以是a.d。136.1 數(shù)組 6.1.2 數(shù)組的存儲與初始化C+語
8、言程序設(shè)計(第4版),鄭莉,清華大學(xué)例 (續(xù))#include using namespace std;int main() const char KEY = a,c,b,a,d; const int NUM_QUES = 5; char c; int ques = 0, numCorrect = 0; cout Enter the NUM_QUES question tests: endl; while(cin.get(c) if(c != n) if(c = keyques) numCorrect+; cout ; else cout*; ques+; else cout Score st
9、atic_cast(numCorrect)/NUM_QUES*100 %; ques = 0; numCorrect = 0; cout endl; return 0;146.1 數(shù)組 6.1.2 數(shù)組的存儲與初始化C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)156.1 數(shù)組 6.1.2 數(shù)組的存儲與初始化例 (續(xù))運行結(jié)果:acbba * Score 60%acbad Score 100%abbda * * Score 40%bdcba* Score 0%C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)166.1 數(shù)組6.1.3 數(shù)組作為函數(shù)參數(shù) 數(shù)組元素作實參,與單個變量一樣。 數(shù)組名作參數(shù),形、
10、實參數(shù)都應(yīng)是數(shù)組名,類型要一樣,傳送的是數(shù)組首地址。對形參數(shù)組的改變會直接影響到實參數(shù)組。C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例6-2 使用數(shù)組名作為函數(shù)參數(shù)主函數(shù)中初始化一個矩陣并將每個元素都輸出,然后調(diào)用子函數(shù),分別計算每一行的元素之和,將和直接存放在每行的第一個元素中,返回主函數(shù)之后輸出各行元素的和。176.1 數(shù)組 6.1.3 數(shù)組作為函數(shù)參數(shù)C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)#include using namespace std;void rowSum(int a4, int nRow) for (int i = 0; i nRow; i+) for(int j =
11、1; j 4; j+)ai0 += aij; int main() /主函數(shù)int table34 = 1, 2, 3, 4, 2, 3, 4, 5, 3, 4, 5, 6; /聲明并初始化數(shù)組18例6-2 (續(xù))6.1 數(shù)組 6.1.3 數(shù)組作為函數(shù)參數(shù)C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué) /輸出數(shù)組元素for (int i = 0; i 3; i+)for (int j = 0; j 4; j+)cout tableij ;cout endl;rowSum(table, 3);/調(diào)用子函數(shù),計算各行和 /輸出計算結(jié)果for (int i = 0; i 3; i+)cout Sum o
12、f row i is tablei0 endl;return 0;19例6-2 (續(xù))6.1 數(shù)組 6.1.3 數(shù)組作為函數(shù)參數(shù)C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)20例6-2 (續(xù))運行結(jié)果:1 2 3 42 3 4 53 4 5 6Sum of row 0 is 10Sum of row 1 is 14Sum of row 2 is 186.1 數(shù)組 6.1.3 數(shù)組作為函數(shù)參數(shù)C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)216.1 數(shù)組6.1.4 對象數(shù)組 聲明:類名 數(shù)組名元素個數(shù); 訪問方法:通過下標(biāo)訪問 數(shù)組名下標(biāo).成員名C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)22對象數(shù)組初
13、始化 數(shù)組中每一個元素對象被創(chuàng)建時,系統(tǒng)都會調(diào)用類構(gòu)造函數(shù)初始化該對象。 通過初始化列表賦值。 例:Point a2=Point(1,2),Point(3,4); 如果沒有為數(shù)組元素指定顯式初始值,數(shù)組元素便使用默認值初始化(調(diào)用缺省構(gòu)造函數(shù))。6.1 數(shù)組 6.1.4 對象數(shù)組C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)23數(shù)組元素所屬類的構(gòu)造函數(shù) 不聲明構(gòu)造函數(shù),則采用缺省構(gòu)造函數(shù)。 各元素對象的初值要求為相同的值時,可以聲明具有默認形參值的構(gòu)造函數(shù)。 各元素對象的初值要求為不同的值時,需要聲明帶形參的構(gòu)造函數(shù)。 當(dāng)數(shù)組中每一個對象被刪除時,系統(tǒng)都要調(diào)用一次析構(gòu)函數(shù)。6.1 數(shù)組 6.1.4
14、 對象數(shù)組C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)24例6-3 對象數(shù)組應(yīng)用舉例/Point.h#ifndef _POINT_H#define _POINT_Hclass Point /類的定義public:/外部接口Point();Point(int x, int y);Point();void move(int newX,int newY);int getX() const return x; int getY() const return y; static void showCount();/靜態(tài)函數(shù)成員private:/私有數(shù)據(jù)成員int x, y;#endif/_POINT_H6
15、.1 數(shù)組 6.1.4 對象數(shù)組C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)25例6-3 (續(xù))/Point.cpp#include #include Point.husing namespace std;Point:Point() x = y = 0;cout Default Constructor called. endl;Point:Point(int x, int y) : x(x), y(y) cout Constructor called. endl;Point:Point() cout Destructor called. endl;void Point:move(int newX
16、,int newY) cout Moving the point to ( newX , newY ) endl;x = newX;y = newY;6.1 數(shù)組 6.1.4 對象數(shù)組C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)26例6-3 (續(xù))/6-3.cpp#include Point.h#include using namespace std;int main() cout Entering main. endl;Point a2;for(int i = 0; i 2; i+)ai.move(i + 10, i + 20);cout Exiting main. endl;return 0
17、;6.1 數(shù)組 6.1.4 對象數(shù)組C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)27例6-3 (續(xù))運行結(jié)果:Entering main.Default Constructor called.Default Constructor called.Moving the point to (10, 20)Moving the point to (11, 21)Exiting main.Destructor called.Destructor called.6.1 數(shù)組 6.1.4 對象數(shù)組C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)6.1.5 程序?qū)嵗?例6-4 利用Point類進行點的線性擬合 用n
18、個數(shù)據(jù)點擬合成直線的問題,直線模型為 其中:286.1 數(shù)組( )y xaxb10210)()(niiniiixxxyxxyyxxLLaxayb1100/ , /nniiiixxnyynC+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)/Point.h#ifndef _POINT_H#define _POINT_H class Point /Point類的定義public:/外部接口Point(float x = 0, float y = 0) : x(x), y(y) float getX() const return x; float getY() const return y; private:
19、/私有數(shù)據(jù)成員float x, y;#endif/_POINT_H296.1 數(shù)組 6.1.5 程序?qū)嵗?-4(續(xù))C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)/6_4.cpp#include Point.h#include #include using namespace std;/直線線性擬合,points為各點,nPoint為點數(shù)float lineFit(const Point points, int nPoint) float avgX = 0, avgY = 0;float lxx = 0, lyy = 0, lxy = 0;for(int i = 0; i nPoint; i+)
20、 /計算x、y的平均值avgX += pointsi.getX() / nPoint;avgY += pointsi.getY() / nPoint;for(int i = 0; i nPoint; i+) /計算Lxx、Lyy和Lxylxx += (pointsi.getX() - avgX) * (pointsi.getX() - avgX);lyy += (pointsi.getY() - avgY) * (pointsi.getY() - avgY);lxy += (pointsi.getX() - avgX) * (pointsi.getY() - avgY);306.1 數(shù)組 6.
21、1.5 程序?qū)嵗?-4(續(xù))C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)cout This line can be fitted by y=ax+b. endl;cout a = lxy / lxx ; /輸出回歸系數(shù)acout b = avgY - lxy * avgX / lxx endl;/輸出回歸系數(shù)breturn static_cast(lxy / sqrt(lxx * lyy); /返回相關(guān)系數(shù)rint main() Point p10 = Point(6, 10), Point(14, 20), Point(26, 30), Point(33, 40), Point(46, 50
22、), Point(54, 60), Point(67, 70), Point(75, 80), Point(84, 90), Point(100, 100) ;/初始化數(shù)據(jù)點float r = lineFit(p, 10);/進行線性回歸計算cout Line coefficient r = r endl;/輸出相關(guān)系數(shù)return 0;316.1 數(shù)組 6.1.5 程序?qū)嵗?-4(續(xù))C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例6-4(續(xù)) 運行結(jié)果為:This line can be fitted by y=ax+b.a = 0.97223 b = 5.90237Line coeffic
23、ient r = 0.998193326.1 數(shù)組 6.1.5 程序?qū)嵗鼵+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)6.2.1 內(nèi)存空間的訪問方式 內(nèi)存空間的訪問方式 通過變量名訪問 通過地址訪問336.2 指針C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)6.2.2 指針變量的聲明 概念 指針:指針:內(nèi)存地址,用于間接訪問內(nèi)存單元 指針指針變量變量:用于存放地址的變量 聲明例:static int i;static int *ptr = &i; 引用例1:i = 3;例2:*ptr = 3;346.2 指針指向整型變量的指針20003ptr*ptri2000內(nèi)存用戶數(shù)據(jù)區(qū)變量 i變量 j變量 pt
24、r362000200020043010C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)6.2.3 與地址相關(guān)的運算“*”和“&” 地址運算符:&例:int var;則 &var 表示變量 var 在內(nèi)存中的起始地址356.2 指針C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)6.2.4 指針的賦值 指針變量的初始化 語法形式存儲類型 數(shù)據(jù)類型 *指針名初始地址;例:int *pa = &a; 注意事項 用變量地址作為初值時,該變量必須在指針初始化之前已聲明過,且變量類型應(yīng)與指針類型一致。 可以用一個已賦初值的指針去初始化另一個指針變量。 不要用一個內(nèi)部 auto 變量去初始化 static 指針。366
25、.2 指針C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)指針變量的賦值運算指針指針名名= =地址地址 “地址”中存放的數(shù)據(jù)類型與指針類型必須相符。 向指針變量賦的值必須是地址常量或變量,不能是普通整數(shù)。但可以賦值為整數(shù)0,表示空指針。 指針的類型是它所指向變量的類型,而不是指針本身數(shù)據(jù)值的類型,任何一個指針本身的數(shù)據(jù)值都是unsigned long int型。 允許聲明指向 void 類型的指針。該指針可以被賦予任何類型對象的地址。例: void *general; 376.2 指針 6.2.4 指針的賦值C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例6-5 指針的聲明、賦值與使用#include
26、using namespace std;int main() int i;/定義int型數(shù)iint *ptr = &i;/取i的地址賦給ptri = 10;/int型數(shù)賦初值cout i = i endl;/輸出int型數(shù)的值cout *ptr = *ptr endl;/輸出int型指針?biāo)傅刂返膬?nèi)容return 0;386.2 指針 6.2.4 指針的賦值運行結(jié)果:i = 10*ptr = 10C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例6-6 void類型指針的使用#include using namespace std;int main() /!void voidObject; 錯,不能
27、聲明void類型的變量void *pv;/對,可以聲明void類型的指針int i = 5;pv = &i;/void類型指針指向整型變量int *pint = static_cast(pv); /void類型指針賦值給int類型指針cout *pint = *pint endl;return 0; 396.2 指針 6.2.4 指針的賦值C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)指向常量的指針 不能通過指針來改變所指對象的值,但指針本身可以改變,可以指向另外的對象。例:int a;const int *p1 = &a;/p1是指向常量的指針int b;p1 = &b;/正確,p1本身的值可以
28、改變*p1 = 1;/編譯時出錯,不能通過p1改變所指的對象406.2 指針 6.2.4 指針的賦值C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)指針類型的常量 若聲明指針常量,則指針本身的值不能被改變。例:int a;int * const p2 = &a; p2 = &b;/錯誤,p2是指針常量,值不能改變416.2 指針 6.2.4 指針的賦值C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)指針變量的算術(shù)運算 指針與整數(shù)的加減運算 指針p加上或減去n,其意義是指針當(dāng)前指向位置的前方或后方第n個數(shù)據(jù)的地址。 這種運算的結(jié)果值取決于指針指向的數(shù)據(jù)類型。 p1n1等價于*(p1 + n1) 指針加一,減
29、一運算 指向下一個或前一個數(shù)據(jù)。例如:y=*px+ 相當(dāng)于 y=*(px+) (*和+優(yōu)先級相同,自右向左運算)426.2 指針 6.2.5 指針運算C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)papa-2pa-1pa+1pa+2pa+3*(pa-2)或pa-2*pa或pa0*(pa+1)或pa1*(pa+2)或pa2*(pa+3)或pa3*(pa-1)或pa-1short *pa436.2 指針 6.2.5 指針運算C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)pb-1pbpb+1pb+2*(pb-1)或pb-1*pb或pb0*(pb+1)或pb1*(pb+2)或pb2long *pb446.2
30、指針 6.2.5 指針運算C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)指針變量的關(guān)系運算 關(guān)系運算 指向相同類型數(shù)據(jù)的指針之間可以進行各種關(guān)系運算。 指向不同數(shù)據(jù)類型的指針,以及指針與一般整數(shù)變量之間的關(guān)系運算是無意義的。 指針可以和零之間進行等于或不等于的關(guān)系運算。例如:p=0或p!=0 賦值運算 向指針變量賦的值必須是地址常量或變量,不能是普通整數(shù)。但可以賦值為整數(shù)0,表示空指針。456.2 指針 6.2.5 指針運算C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)6.2.6 用指針處理數(shù)組元素 聲明與賦值例:int a10, *pa; pa=&a0; 或 pa=a; 通過指針引用數(shù)組元素 經(jīng)過上
31、述聲明及賦值后: *pa就是a0,*(pa+1)就是a1,. ,*(pa+i)就是ai. ai, *(pa+i), *(a+i), pai都是等效的。 不能寫 a+,因為a是數(shù)組首地址是常量。466.2 指針C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例6-7476.2 指針 6.2.6 用指針處理數(shù)組元素設(shè)有一個int型數(shù)組a,有10個元素。用三種方法輸出各元素: 使用數(shù)組名和下標(biāo) 使用數(shù)組名和指針運算 使用指針變量C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例6-7 (續(xù)) 使用數(shù)組名和下標(biāo)486.2 指針 6.2.6 用指針處理數(shù)組元素#include using namespace std
32、;int main() int a10 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ;for (int i = 0; i 10; i+)cout ai ;cout endl;return 0;C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例6-7 (續(xù)) 使用數(shù)組名指針運算496.2 指針 6.2.6 用指針處理數(shù)組元素#include using namespace std;int main() int a10 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ;for (int i = 0; i 10; i+)cout *(a+i) ;cout endl;retu
33、rn 0;C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例6-7 (續(xù)) 使用指針變量506.2 指針 6.2.6 用指針處理數(shù)組元素#include using namespace std;int main() int a10 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ;for (int *p = a; p (a + 10); p+)cout *p ;cout endl;return 0;C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)6.2.7 指針數(shù)組 數(shù)組的元素是指針型例:Point *pa2;由pa0,pa1兩個指針組成 516.2 指針C+語言程序設(shè)計(第4版),鄭莉,清
34、華大學(xué)例6-8 利用指針數(shù)組存放單位矩陣526.2 指針 6.2.7 指針數(shù)組#include using namespace std;int main() int line1 = 1, 0, 0 ;/矩陣的第一行int line2 = 0, 1, 0 ;/矩陣的第二行int line3 = 0, 0, 1 ;/矩陣的第三行/定義整型指針數(shù)組并初始化int *pLine3 = line1, line2, line3 ;C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例6-8 (續(xù))536.2 指針 6.2.7 指針數(shù)組cout Matrix test: endl; /輸出單位矩陣for (int i
35、 = 0; i 3; i+) for (int j = 0; j 3; j+) cout pLineij ; cout endl;return 0;輸出結(jié)果為:Matrix test:1,0,00,1,00,0,1C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例6-9 二維數(shù)組舉例546.2 指針 6.2.7 指針數(shù)組#include using namespace std;int main() int array233= 11, 12, 13 , 21, 22, 23 , 31, 32, 33 ; for(int i = 0; i 3; i+) for(int j = 0; j 3; j+) c
36、out *(*(array2 + i) + j) ;/逐個輸出二維數(shù)組第i行元素值 cout endl; return 0;C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)55例6-9 (續(xù))運行結(jié)果:11 12 1321 22 2331 32 336.2 指針 6.2.7 指針數(shù)組C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)56指針數(shù)組 vs 二維數(shù)組6.2 指針 6.2.7 指針數(shù)組pLine0 pLine1 pLine2(a) 指針數(shù)組array20array21array22array2二維數(shù)組pLineC+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)6.2.8 用指針作為函數(shù)參數(shù) 以地址方式傳遞數(shù)
37、據(jù),可以用來返回函數(shù)處理結(jié)果。 實參是數(shù)組名時形參可以是指針。576.2 指針C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例6-10586.2 指針 6.2.8 用指針作為函數(shù)參數(shù)題目:讀入三個浮點數(shù),將整數(shù)部分和小數(shù)部分分別輸出#include using namespace std;void splitFloat(float x, int *intPart, float *fracPart) /取x的整數(shù)部分 *intPart = static_cast(x); /取x的小數(shù)部分 *fracPart = x - *intPart;C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例6-10 (續(xù))5
38、96.2 指針 6.2.8 用指針作為函數(shù)參數(shù)int main() cout Enter 3 float point numbers: endl; for(int i = 0; i x; splitFloat(x, &n, &f);/變量地址作為實參 cout Integer Part = n Fraction Part = f endl; return 0;C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)60例6-10 (續(xù))運行結(jié)果:Enter 3 floating point numbers 4.7Integer Part = 4 Fraction Part = 0.78.913Integer
39、 Part = 8 Fraction Part = 0.913-4.7518Integer Part = -4 Fraction Part = -0.75186.2 指針 6.2.8 用指針作為函數(shù)參數(shù)C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例: 輸出數(shù)組元素的內(nèi)容和地址616.2 指針 6.2.8 用指針作為函數(shù)參數(shù)#include #include using namespace std;void arrayPtr(long *p, int n) cout In func, address of array is p endl;cout Accessing array using poi
40、nters endl;for (int i = 0; i n; i+) cout Address for index i is p + i; cout Value is *(p + i) endl;C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例 (續(xù))626.2 指針 6.2.8 用指針作為函數(shù)參數(shù)int main() long list5=50, 60, 70, 80, 90;cout In main, address of array is list endl;cout endl; arrayPtr(list,5);return 0;C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)63例 (續(xù))運
41、行結(jié)果:In main, address of array is 0012FF50In func, address of array is 0012FF50Accessing array using pointersAddress for index 0 is 0012FF50 Value is 50Address for index 1 is 0012FF54 Value is 60Address for index 2 is 0012FF58 Value is 70Address for index 3 is 0012FF5C Value is 80Address for index 4
42、is 0012FF60 Value is 906.2 指針 6.2.8 用指針作為函數(shù)參數(shù)C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例: 指向常量的指針做形參646.2 指針 6.2.8 用指針作為函數(shù)參數(shù)#includeusing namespace std;const int N = 6;void print(const int *p, int n);int main() int arrayN; for (int i = 0; i arrayi; print(array, N); return 0;void print(const int *p, int n) cout *p; for (
43、int i = 1; i n; i+) cout , *(p+i); cout endl;C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)6.2.9 指針型函數(shù) 當(dāng)函數(shù)的返回值是地址時,該函數(shù)就是指針形函數(shù)。 聲明形式存儲類型 數(shù)據(jù)類型 *函數(shù)名()656.2 指針C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)6.2.10 指向函數(shù)的指針 聲明形式存儲類型 數(shù)據(jù)類型 (*函數(shù)指針名)(); 含義: 數(shù)據(jù)指針指向數(shù)據(jù)存儲區(qū),而函數(shù)指針指向的是程序代碼存儲區(qū)。666.2 指針C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例6-11 函數(shù)指針676.2 指針 6.2.10 指向函數(shù)的指針#include usin
44、g namespace std;void printStuff(float) cout This is the print stuff function. endl;void printMessage(float data) cout The data to be listed is data endl;void printFloat(float data) cout The data to be printed is data 成員名ptr-getx() 相當(dāng)于 (*ptr).getx();706.2 指針C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例6-12使用指針來訪問Point類的成員/
45、6_12.cpp#include using namespace std;class Point /類的定義public:/外部接口Point(int x = 0, int y = 0) : x(x), y(y) /構(gòu)造函數(shù)int getX() const return x; /返回xint getY() const return y; /返回yprivate:/私有數(shù)據(jù)int x, y; 716.2 指針 6.2.11 對象指針的一般概念C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例6-12(續(xù))72int main() /主函數(shù)Point a(4, 5);/定義并初始化對象aPoint *p
46、1 = &a;/定義對象指針,用a的地址將其初始化cout getX() endl;/利用指針訪問對象成員cout a.getX() x;766.2 指針 6.2.11 對象指針C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)指向類的非靜態(tài)成員的指針 通過指向成員的指針只能訪問公有成員 聲明指向成員的指針 聲明指向公有數(shù)據(jù)成員的指針 類型說明符 類名:*指針名; 聲明指向公有函數(shù)成員的指針 類型說明符 (類名:*指針名)(參數(shù)表);776.2 指針 6.2.11 對象指針C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)指向類的非靜態(tài)成員的指針(續(xù)) 指向數(shù)據(jù)成員的指針 說明指針應(yīng)該指向哪個成員指針名 =
47、&類名:數(shù)據(jù)成員名; 通過對象名(或?qū)ο笾羔槪┡c成員指針結(jié)合來訪問數(shù)據(jù)成員對象名.*類成員指針名或: 對象指針名-*類成員指針名786.2 指針 6.2.11 對象指針C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)指向類的非靜態(tài)成員的指針(續(xù)) 指向函數(shù)成員的指針 初始化指針名=&類名:函數(shù)成員名; 通過對象名(或?qū)ο笾羔槪┡c成員指針結(jié)合來訪問函數(shù)成員(對象名.*類成員指針名)(參數(shù)表)或:(對象指針名-*類成員指針名)(參數(shù)表)796.2 指針 6.2.11 對象指針C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例6-13 訪問對象的公有成員函數(shù)的不同方式80int main() /主函數(shù) Poin
48、t a(4,5);/聲明對象APoint *p1 = &a; /聲明對象指針并初始化 /聲明成員函數(shù)指針并初始化int (Point:*funcPtr)() = Point:getX; /(1)使用成員函數(shù)指針訪問成員函數(shù)cout (a.*funcPtr)() endl; /(2)使用成員函數(shù)指針和對象指針訪問成員函數(shù)cout *funcPtr)() endl; /(3)使用對象名訪問成員函數(shù)cout a.getX() endl; /(4)使用對象指針訪問成員函數(shù)cout getX() endl; return 0;6.2 指針 6.2.11 對象指針C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)
49、指向類的靜態(tài)成員的指針 對類的靜態(tài)成員的訪問不依賴于對象 可以用普通的指針來指向和訪問靜態(tài)成員 例6-14 通過指針訪問類的靜態(tài)數(shù)據(jù)成員 例6-15 通過指針訪問類的靜態(tài)函數(shù)成員816.2 指針 6.2.11 對象指針C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例6-14 通過指針訪問類的靜態(tài)數(shù)據(jù)成員82#include using namespace std;class Point /Point類定義public:/外部接口Point(int x = 0, int y = 0) : x(x), y(y) count+;Point(const Point &p) : x(p.x), y(p.y)
50、 count+;Point() count-; int getX() const return x; int getY() const return y; static int count;private:/私有數(shù)據(jù)成員int x, y;int Point:count = 0;6.2 指針 6.2.11 對象指針C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例6-14 (續(xù))83int main() /主函數(shù)實現(xiàn) /定義一個int型指針,指向類的靜態(tài)成員int *ptr = &Point:count;Point a(4, 5);/定義對象acout Point A: a.getX() , a.ge
51、tY();cout Object count = *ptr endl;Point b(a);/定義對象bcout Point B: b.getX() , b.getY();cout Object count = *ptr endl; return 0;6.2 指針 6.2.11 對象指針C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例6-15 通過指針訪問類的靜態(tài)函數(shù)成員84#include using namespace std;class Point /Point類定義public:/外部接口Point(int x = 0, int y = 0) : x(x), y(y) count+; Po
52、int(const Point &p) : x(p.x), y(p.y) count+; Point() count-; int getX() const return x; int getY() const return y; static void showCount() cout Object count = count endl; private:/私有數(shù)據(jù)成員int x, y;static int count;int Point:count = 0;6.2 指針 6.2.11 對象指針C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例6-15 (續(xù))85int main() /主函數(shù)實現(xiàn)
53、/定義一個指向函數(shù)的指針,指向類的靜態(tài)成員函數(shù)void (*funcPtr)() = Point:showCount;Point a(4, 5);/定義對象Acout Point A: a.getX() , a.getY();funcPtr(); /輸出對象個數(shù),直接通過指針訪問靜態(tài)函數(shù)成員Point b(a);/定義對象Bcout Point B: b.getX() , b.getY();funcPtr(); /輸出對象個數(shù),直接通過指針訪問靜態(tài)函數(shù)成員return 0;6.2 指針 6.2.11 對象指針C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)866.3 動態(tài)內(nèi)存分配動態(tài)申請內(nèi)存操作符
54、new new 類型名T(初始化參數(shù)列表) 功能:在程序執(zhí)行期間,申請用于存放T類型對象的內(nèi)存空間,并依初值列表賦以初值。 結(jié)果值:成功:T類型的指針,指向新分配的內(nèi)存;失?。簰伋霎惓?。C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)876.3 動態(tài)內(nèi)存分配釋放內(nèi)存操作符delete delete 指針p 功能:釋放指針p所指向的內(nèi)存。p必須是new操作的返回值。C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例6-16 動態(tài)創(chuàng)建對象舉例88#include using namespace std;class Point public:Point() : x(0), y(0) coutDefault Co
55、nstructor called.endl;Point(int x, int y) : x(x), y(y) cout Constructor called.endl;Point() coutDestructor called.endl; int getX() const return x; int getY() const return y; void move(int newX, int newY) x = newX;y = newY;private:int x, y;6.3 動態(tài)內(nèi)存分配C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例6-16 (續(xù))89int main() cout Ste
56、p one: endl;Point *ptr1 = new Point;/調(diào)用缺省構(gòu)造函數(shù)delete ptr1;/刪除對象,自動調(diào)用析構(gòu)函數(shù)cout Step two: endl;ptr1 = new Point(1,2);delete ptr1;return 0;6.3 動態(tài)內(nèi)存分配運行結(jié)果:運行結(jié)果:Step One:Default Constructor called.Destructor called.Step Two:Constructor called.Destructor called.C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)906.3 動態(tài)內(nèi)存分配申請和釋放動態(tài)數(shù)組 分配:
57、new 類型名T 數(shù)組長度 數(shù)組長度可以是任何表達式,在運行時計算 釋放:delete 數(shù)組名p 釋放指針p所指向的數(shù)組。p必須是用new分配得到的數(shù)組首地址。C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例6-17 動態(tài)創(chuàng)建對象數(shù)組舉例91#includeusing namespace std;class Point /類的聲明同例6-16,略 ;int main() Point *ptr = new Point2;/創(chuàng)建對象數(shù)組ptr0.move(5, 10); /通過指針訪問數(shù)組元素的成員ptr1.move(15, 20); /通過指針訪問數(shù)組元素的成員cout Deleting. endl
58、;delete ptr; /刪除整個對象數(shù)組return 0;6.3 動態(tài)內(nèi)存分配C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)92例6-17 (續(xù))運行結(jié)果:Default Constructor called.Default Constructor called.Deleting.Destructor called.Destructor called.6.3 動態(tài)內(nèi)存分配C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)936.3 動態(tài)內(nèi)存分配將動態(tài)數(shù)組封裝成類 更加簡潔,便于管理 建立和刪除數(shù)組的過程比較繁瑣 封裝成類后更加簡潔,便于管理 可以在訪問數(shù)組元素前檢查下標(biāo)是否越界 用assert來檢查,
59、assert只在調(diào)試時生效C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例6-18 動態(tài)數(shù)組類94#include #include using namespace std;class Point /類的聲明同例6-16 ;class ArrayOfPoints /動態(tài)數(shù)組類public:ArrayOfPoints(int size) : size(size) points = new Pointsize;ArrayOfPoints() cout Deleting. = 0 & index size);return pointsindex;private:Point *points;/指向動態(tài)數(shù)組
60、首地址int size;/數(shù)組大小;6.3 動態(tài)內(nèi)存分配C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)例6-18 (續(xù))95int main() int count; cout count;ArrayOfPoints points(count);/創(chuàng)建對象數(shù)組/通過訪問數(shù)組元素的成員points.element(0).move(5, 0);/通過類訪問數(shù)組元素的成員points.element(1).move(15, 20);return 0;6.3 動態(tài)內(nèi)存分配C+語言程序設(shè)計(第4版),鄭莉,清華大學(xué)96例6-18 (續(xù))運行結(jié)果:Please enter the number of poin
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年廣告創(chuàng)意設(shè)計委托合同
- 房屋貸款保險合同模板
- 2024版農(nóng)村建房材料供應(yīng)協(xié)議
- 2024年個人租房合同范本
- 代理招商合同參考
- 兩家企業(yè)合作協(xié)議書格式
- 凈身出戶的離婚協(xié)議書應(yīng)注意啥
- 家庭住宅裝潢監(jiān)理合同范例
- 房屋買賣居間合同書標(biāo)準(zhǔn)格式
- 子女撫養(yǎng)權(quán)協(xié)議書中的主要內(nèi)容與要求
- SPECTRO直讀光譜儀使用PPT學(xué)習(xí)教案
- 急性腎盂腎炎護理查房
- 常用鋼材磁特性曲線
- 淺談地鐵通信系統(tǒng)漏纜施工
- 安全工器具試驗標(biāo)準(zhǔn)及周期表
- 機器人學(xué)_機器人雅可比矩陣
- 家長會邀請函模板
- 空調(diào)工程評標(biāo)辦法
- 血液透析血標(biāo)本采集
- 孫子兵法與兵家智慧
- 果樹病蟲害防治管理論文
評論
0/150
提交評論