




已閱讀5頁(yè),還剩83頁(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)介
第八講 數(shù)組、字符串、指針,教材:C+語(yǔ)言程序設(shè)計(jì)(第4版) 第6章 6.1、6.2、6.6,清華大學(xué) 鄭 莉,目錄,8.1 數(shù)組 8.2 字符串 8.3 指針 8.4 小結(jié),2,數(shù)組的概念,數(shù)組是具有一定順序關(guān)系的若干相同類型變量的集合體,組成數(shù)組的變量稱為該數(shù)組的元素。 數(shù)組屬于構(gòu)造類型。,3,8.1 數(shù)組,8.1.1 數(shù)組的聲明與使用,數(shù)組的聲明,4,8.1 數(shù)組,類型說(shuō)明符 數(shù)組名 常量表達(dá)式 常量表達(dá)式 ;,例如:int a10; 表示a為整型數(shù)組,有10個(gè)元素:a0.a9,例如: int a53; 表示a為整型二維數(shù)組,其中第一維有5個(gè)下標(biāo)(04),第二維有3個(gè)下標(biāo)(02),數(shù)組的元素個(gè)數(shù)為15,可以用于存放5行3列的整型數(shù)據(jù)表格。,8.1.1 數(shù)組的聲明與使用(續(xù)),引用 必須先聲明,后使用。 只能逐個(gè)引用數(shù)組元素,而不能一次引用整個(gè)數(shù)組 例如:a0=a5+a7-a2*3 例如:b12=a23/2,5,8.1 數(shù)組,6,8.1 數(shù)組 8.1.1 數(shù)組的聲明與使用,例8-1(教材例6-1),#include using 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; ,7,8.1 數(shù)組,8.1.2 數(shù)組的存儲(chǔ)與初始化,一維數(shù)組的存儲(chǔ) 數(shù)組元素在內(nèi)存中順次存放,它們的地址是連續(xù)的。 例如:,數(shù)組名字是數(shù)組首元素的內(nèi)存地址。 數(shù)組名是一個(gè)常量,不能被賦值。,8,8.1 數(shù)組,8.1.2 數(shù)組的存儲(chǔ)與初始化(續(xù)),一維數(shù)組的初始化 可以在定義數(shù)組的同時(shí)賦給初值: 在聲明數(shù)組時(shí)對(duì)數(shù)組元素賦以初值。 例如:static int a10=0,1,2,3,4,5,6,7,8,9; 可以只給一部分元素賦初值。 例如:static int a10=0,1,2,3,4; 在對(duì)全部數(shù)組元素賦初值時(shí),可以不指定數(shù)組長(zhǎng)度。 例如:static int a=0,1,2,3,4,5,6,7,8,9,9,8.1 數(shù)組,8.1.2 數(shù)組的存儲(chǔ)與初始化(續(xù)),二維數(shù)組的存儲(chǔ) 按行存放 例如: float a34; 其中數(shù)組a的存儲(chǔ)順序?yàn)椋?a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23,10,8.1 數(shù)組,8.1.2 數(shù)組的存儲(chǔ)與初始化(續(xù)),二維數(shù)組的初始化 將所有數(shù)據(jù)寫在一個(gè)內(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; 可以對(duì)部分元素賦初值 例如:static int a34=1,0,6,0,0,11;,11,8.1 數(shù)組,8.1.3 數(shù)組的應(yīng)用舉例,例8-2 求Fibonacci數(shù)列前20項(xiàng) #include using namespace std; int main() int f20 = 1,1; /初始化第0、1個(gè)數(shù) for (int i = 2; i 20; i+) /求第219個(gè)數(shù) fi = fi - 2 + fi - 1; for (i=0;i20;i+) /輸出,每行5個(gè)數(shù) if (i % 5 = 0) cout endl; cout.width(12); /設(shè)置輸出寬度為12 cout fi; return 0; ,12,8.1 數(shù)組 8.1.3 數(shù)組的應(yīng)用舉例,例8-2 (續(xù)),運(yùn)行結(jié)果: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765,例8-3 一維數(shù)組應(yīng)用舉例,循環(huán)從鍵盤讀入若干組選擇題答案,計(jì)算并輸出每組答案的正確率,直到輸入ctrl+z為止。 每組連續(xù)輸入5個(gè)答案,每個(gè)答案可以是ad。,13,8.1 數(shù)組 8.1.3 數(shù)組的應(yīng)用舉例,例8-3 (續(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 (numCorrect)/NUM_QUES*100 “%“; ques = 0; numCorrect = 0; cout endl; return 0; ,14,8.1 數(shù)組 8.1.3 數(shù)組的應(yīng)用舉例,15,8.1 數(shù)組 8.1.3 數(shù)組的應(yīng)用舉例,例8-3 (續(xù)),運(yùn)行結(jié)果: acbba * Score 60% acbad Score 100% abbda * * Score 40% bdcba * Score 0%,16,8.1 數(shù)組,8.1.4 以數(shù)組作為函數(shù)參數(shù),數(shù)組元素作實(shí)參,與單個(gè)變量一樣。 數(shù)組名作參數(shù),形、實(shí)參數(shù)都應(yīng)是數(shù)組名,類型要一樣,傳送的是數(shù)組首地址。對(duì)形參數(shù)組的改變會(huì)直接影響到實(shí)參數(shù)組。,例8-4(教材例6-2) 使用數(shù)組名作為函數(shù)參數(shù),主函數(shù)中初始化一個(gè)矩陣并將每個(gè)元素都輸出,然后調(diào)用子函數(shù),分別計(jì)算每一行的元素之和,將和直接存放在每行的第一個(gè)元素中,返回主函數(shù)之后輸出各行元素的和。,17,8.1 數(shù)組 8.1.4 以數(shù)組作為函數(shù)參數(shù),#include using namespace std; void rowSum(int a4, int nRow) for (int i = 0; i nRow; i+) for(int j = 1(是0吧?); j 4; j+) ai0 += aij; int main() /主函數(shù) int table34 = 1, 2, 3, 4, 2, 3, 4, 5, 3, 4, 5, 6; /聲明并初始化數(shù)組,18,例8-4 (續(xù)),8.1 數(shù)組 8.1.4 以數(shù)組作為函數(shù)參數(shù),/輸出數(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ù),計(jì)算各行和 /輸出計(jì)算結(jié)果 for (int i = 0; i 3; i+) cout “Sum of row “ i “ is “ tablei0 endl; return 0; ,19,例8-4 (續(xù)),8.1 數(shù)組 8.1.4 以數(shù)組作為函數(shù)參數(shù),20,例8-4 (續(xù)),運(yùn)行結(jié)果: 1 2 3 4 2 3 4 5 3 4 5 6 Sum of row 0 is 10 Sum of row 1 is 14 Sum of row 2 is 18,8.1 數(shù)組 8.1.4 數(shù)組作為函數(shù)參數(shù),21,8.1 數(shù)組,8.1.5 對(duì)象數(shù)組,聲明: 類名 數(shù)組名元素個(gè)數(shù); 訪問(wèn)方法: 通過(guò)下標(biāo)訪問(wèn) 數(shù)組名下標(biāo).成員名,22,對(duì)象數(shù)組初始化,數(shù)組中每一個(gè)元素對(duì)象被創(chuàng)建時(shí),系統(tǒng)都會(huì)調(diào)用類構(gòu)造函數(shù)初始化該對(duì)象。 通過(guò)初始化列表賦值。 例:Point a2=Point(1,2),Point(3,4); 如果沒(méi)有為數(shù)組元素指定顯式初始值,數(shù)組元素便使用默認(rèn)值初始化(調(diào)用缺省構(gòu)造函數(shù))。,8.1 數(shù)組 8.1.5 對(duì)象數(shù)組,23,數(shù)組元素所屬類的構(gòu)造函數(shù),不聲明構(gòu)造函數(shù),則采用缺省構(gòu)造函數(shù)。 各元素對(duì)象的初值要求為相同的值時(shí),可以聲明具有默認(rèn)形參值的構(gòu)造函數(shù)。 各元素對(duì)象的初值要求為不同的值時(shí),需要聲明帶形參的構(gòu)造函數(shù)。 當(dāng)數(shù)組中每一個(gè)對(duì)象被刪除時(shí),系統(tǒng)都要調(diào)用一次析構(gòu)函數(shù)。,8.1 數(shù)組 8.1.4 對(duì)象數(shù)組,24,例8-5(教材例6-4 ) 對(duì)象數(shù)組應(yīng)用舉例,/Point.h #ifndef _POINT_H #define _POINT_H class 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_H,8.1 數(shù)組 8.1.4 對(duì)象數(shù)組,25,例8-5 (續(xù)),/Point.cpp #include #include “Point.h“ using 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,int newY) cout “Moving the point to (“ newX “, “ newY “)“ endl; x = newX; y = newY; ,8.1 數(shù)組 8.1.4 對(duì)象數(shù)組,26,例8-5 (續(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; ,8.1 數(shù)組 8.1.4 對(duì)象數(shù)組,27,例8-5 (續(xù)),運(yùn)行結(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.,8.1 數(shù)組 8.1.4 對(duì)象數(shù)組,28,8.2 字符串,8.2.1 用字符數(shù)組存儲(chǔ)和處理字符串,字符串常量(例:“program“) 各字符連續(xù)、順序存放,每個(gè)字符占一個(gè)字節(jié),以0結(jié)尾,相當(dāng)于一個(gè)隱含創(chuàng)建的字符常量數(shù)組 “program”出現(xiàn)在表達(dá)式中,表示這一char數(shù)組的首地址 首地址可以賦給char常量指針: const char *STRING1 = “program“; 字符串變量 可以顯式創(chuàng)建字符數(shù)組來(lái)表示字符串變量,例如,以下三條語(yǔ)句具有等價(jià)的作用: char str8 = p, r, o, g, r, a, m, 0 ; char str8 = “program“; char str = “program“;,29,8.2 字符串 8.2.1 用字符數(shù)組存儲(chǔ)和處理字符串,用字符數(shù)組表示字符串的缺點(diǎn),用字符數(shù)組表示字符串的缺點(diǎn) 執(zhí)行連接、拷貝、比較等操作,都需要顯式調(diào)用庫(kù)函數(shù),很麻煩 當(dāng)字符串長(zhǎng)度很不確定時(shí),需要用new動(dòng)態(tài)創(chuàng)建字符數(shù)組,最后要用delete釋放,很繁瑣 字符串實(shí)際長(zhǎng)度大于為它分配的空間時(shí),會(huì)產(chǎn)生數(shù)組下標(biāo)越界的錯(cuò)誤 解決方法 使用字符串類string表示字符串 string實(shí)際上是對(duì)字符數(shù)組操作的封裝,30,8.2 字符串,8.2.2 string類,常用構(gòu)造函數(shù) string(); /缺省構(gòu)造函數(shù),建立一個(gè)長(zhǎng)度為0的串 string(const char *s); /用指針s所指向的字符串常量初始化string類的對(duì)象 string(const string/執(zhí)行拷貝構(gòu)造函數(shù),用s2的值作為s3的初值,31,8.2 字符串,8.2.2 string類(續(xù)),常用操作符 s + t 將串s和t連接成一個(gè)新串 s = t 用t更新s s = t 判斷s與t是否相等 s != t 判斷s與t是否不等 s t 判斷s是否大于t (按字典順序比較) s = t 判斷s是否大于或等于t (按字典順序比較) si 訪問(wèn)串中下標(biāo)為i的字符 例: string s1 = “abc“, s2 = “def“; string s3 = s1 + s2; /結(jié)果是“abcdef“ bool s4 = (s1 s2); /結(jié)果是true char s5 = s21; /結(jié)果是e,例8-6(教材例6-23) string類應(yīng)用舉例,32,#include #include using namespace std; /根據(jù)value的值輸出true或false,title為提示文字 inline void test(const char *title, bool value) cout title “ returns “ (value ? “true“ : “false“) endl; ,8.2 字符串 8.2.2 string類,例8-6 (續(xù)),33,int main() string s1 = “DEF“; cout s2; cout “l(fā)ength of s2: “ s2.length() endl; /比較運(yùn)算符的測(cè)試 test(“s1 = “ABC“, s1 = “ABC“); test(“DEF“ = s1“, “DEF“ = s1); /連接運(yùn)算符的測(cè)試 s2 += s1; cout “s2 = s2 + s1: “ s2 endl; cout “l(fā)ength of s2: “ s2.length() endl; return 0; ,8.2 字符串 8.2.2 string類,用getline輸入整行字符串,34,輸入整行字符串 用cin的操作符輸入字符串,會(huì)以空格作為分隔符,空格后的內(nèi)容會(huì)在下一回輸入時(shí)被讀取 用string頭文件中的getline可以輸入整行字符串,例如: getline(cin, s2); 以其它字符作為分隔符輸入字符串 輸入字符串時(shí),可以使用其它分隔符作為字符串結(jié)束的標(biāo)志(例如逗號(hào)、分號(hào)) 把分隔符作為getline的第3個(gè)參數(shù)即可,例如: getline(cin, s2, ,);,8.2 字符串 8.2.2 string類,例8-7(教材例6-24) 用getline輸入字符串,35,include #include using namespace std; int main() for (int i = 0; i 2; i+) string city, state; getline(cin, city, ,); getline(cin, state); cout “City:“ city “ State:“ state endl; return 0; ,8.2 字符串 8.2.2 string類,運(yùn)行結(jié)果: Beijing,China City: Beijing State: China San Francisco,the United States City: San Francisco State: the United States,8.3.1 內(nèi)存空間的訪問(wèn)方式,內(nèi)存空間的訪問(wèn)方式 通過(guò)變量名訪問(wèn) 通過(guò)地址訪問(wèn),36,8.3 指針,8.3.2 指針變量的聲明,概念 指針:內(nèi)存地址,用于間接訪問(wèn)內(nèi)存單元 指針變量:用于存放地址的變量 聲明 例:static int i; static int *ptr = ,37,8.3 指針,指向整型變量的指針,8.3.3 與地址相關(guān)的運(yùn)算“*”和“&”,地址運(yùn)算符: 則 &var 表示變量 var 在內(nèi)存中的起始地址,38,8.3 指針,8.3.4 指針的賦值,指針變量的初始化 語(yǔ)法形式 存儲(chǔ)類型 數(shù)據(jù)類型 *指針名初始地址; 例:int *pa = 注意事項(xiàng) 用變量地址作為初值時(shí),該變量必須在指針初始化之前已聲明過(guò),且變量類型應(yīng)與指針類型一致。 可以用一個(gè)已賦初值的指針去初始化另一個(gè)指針變量。 不要用一個(gè)內(nèi)部 auto 變量去初始化 static 指針。,39,8.3 指針,指針變量的賦值運(yùn)算,指針名=地址 “地址”中存放的數(shù)據(jù)類型與指針類型必須相符。 向指針變量賦的值必須是地址常量或變量,不能是普通整數(shù)。但可以賦值為整數(shù)0,表示空指針。 指針的類型是它所指向變量的類型,而不是指針本身數(shù)據(jù)值的類型,任何一個(gè)指針本身的數(shù)據(jù)值都是unsigned long int型。 允許聲明指向 void 類型的指針。該指針可以被賦予任何類型對(duì)象的地址。 例: void *general;,40,8.3 指針 8.3.4 指針的賦值,例8-8(教材例6-5) 指針的聲明、賦值與使用,#include using namespace std; int main() int i; /定義int型數(shù)i int *ptr = ,41,8.3 指針 8.3.4 指針的賦值,運(yùn)行結(jié)果: i = 10 *ptr = 10,例8-9(教材例6-6 ) void類型指針的使用,#include using namespace std; int main() /!void voidObject; 錯(cuò),不能聲明void類型的變量 void *pv; /對(duì),可以聲明void類型的指針 int i = 5; pv = ,42,8.3 指針 8.3.4 指針的賦值,指向常量的指針,不能通過(guò)指針來(lái)改變所指對(duì)象的值,但指針本身可以改變,可以指向另外的對(duì)象。 例: int a; const int *p1 = /編譯時(shí)出錯(cuò),不能通過(guò)p1改變所指的對(duì)象,43,8.3 指針 8.3.4 指針的賦值,指針類型的常量,若聲明指針常量,則指針本身的值不能被改變。 例: int a; int * const p2 = /錯(cuò)誤,p2是指針常量,值不能改變,44,8.3 指針 8.3.4 指針的賦值,8.3.5 指針運(yùn)算,指針變量的算術(shù)運(yùn)算 指針變量的關(guān)系運(yùn)算,45,8.3 指針,指針變量的算術(shù)運(yùn)算,指針與整數(shù)的加減運(yùn)算 指針p加上或減去n,其意義是指針當(dāng)前指向位置的前方或后方第n個(gè)數(shù)據(jù)的地址。 這種運(yùn)算的結(jié)果值取決于指針指向的數(shù)據(jù)類型。 p1n1等價(jià)于*(p1 + n1) 指針加一,減一運(yùn)算 指向下一個(gè)或前一個(gè)數(shù)據(jù)。 例如:y=*px+ 相當(dāng)于 y=*(px+) (*和+優(yōu)先級(jí)相同,自右向左運(yùn)算),46,8.3 指針 8.3.5 指針運(yùn)算,pa,47,8.3 指針 8.3.5 指針運(yùn)算,pb-1,pb,pb+1,pb+2,*(pb-1)或pb-1,*pb或pb0,*(pb+1)或pb1,*(pb+2)或pb2,long *pb,48,8.3 指針 8.3.5 指針運(yùn)算,指針變量的關(guān)系運(yùn)算,關(guān)系運(yùn)算 指向相同類型數(shù)據(jù)的指針之間可以進(jìn)行各種關(guān)系運(yùn)算。 指向不同數(shù)據(jù)類型的指針,以及指針與一般整數(shù)變量之間的關(guān)系運(yùn)算是無(wú)意義的。 指針可以和零之間進(jìn)行等于或不等于的關(guān)系運(yùn)算。 例如:p=0或p!=0 賦值運(yùn)算 向指針變量賦的值必須是地址常量或變量,不能是普通整數(shù)。但可以賦值為整數(shù)0,表示空指針。,49,8.3 指針 8.3.5 指針運(yùn)算,8.3.6 用指針處理數(shù)組元素,聲明與賦值 例:int a10, *pa; pa= 通過(guò)指針引用數(shù)組元素 經(jīng)過(guò)上述聲明及賦值后: *pa就是a0,*(pa+1)就是a1,. ,*(pa+i)就是ai. ai, *(pa+i), *(a+i), pai都是等效的。 不能寫 a+,因?yàn)閍是數(shù)組首地址是常量。,50,8.3 指針,例8-10(教材例6-7),51,6.2 指針 6.2.6 用指針處理數(shù)組元素,設(shè)有一個(gè)int型數(shù)組a,有10個(gè)元素。用三種方法輸出各元素: 使用數(shù)組名和下標(biāo) 使用數(shù)組名和指針運(yùn)算 使用指針變量,例8-10 (續(xù)) 使用數(shù)組名和下標(biāo),52,6.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 ai “ “; cout endl; return 0; ,例8-10 (續(xù)) 使用數(shù)組名指針運(yùn)算,53,6.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; return 0; ,例8-10 (續(xù)) 使用指針變量,54,6.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; ,8.3.7 指針數(shù)組,數(shù)組的元素是指針型 例:Point *pa2; 由pa0,pa1兩個(gè)指針組成,55,8.3 指針,例8-11(教材例6-8) 利用指針數(shù)組存放單位矩陣,56,8.3 指針 8.3.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 ;,例8-11(續(xù)),57,8.3 指針 8.3.7 指針數(shù)組,cout “Matrix test:“ endl; /輸出單位矩陣 for (int i = 0; i 3; i+) for (int j = 0; j 3; j+) cout pLineij “ “; cout endl; return 0; ,輸出結(jié)果為: Matrix test: 1,0,0 0,1,0 0,0,1,例8-12(教材例6-9) 二維數(shù)組舉例,58,8.3 指針 8.3.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+) cout *(*(array2 + i) + j) “ “; /逐個(gè)輸出二維數(shù)組第i行元素值 cout endl; return 0; ,59,例8-12 (續(xù)),運(yùn)行結(jié)果: 11 12 13 21 22 23 31 32 33,8.3 指針 8.3.7 指針數(shù)組,60,指針數(shù)組 vs 二維數(shù)組,8.3 指針 8.3.7 指針數(shù)組,pLine0,pLine1,pLine2,(a) 指針數(shù)組,array20,array21,array22,array2,二維數(shù)組,pLine,8.3.8 用指針作為函數(shù)參數(shù),以地址方式傳遞數(shù)據(jù),可以用來(lái)返回函數(shù)處理結(jié)果。 實(shí)參是數(shù)組名時(shí)形參可以是指針。,61,8.3 指針,例8-13(教材例6-10),62,8.3 指針 8.3.8 用指針作為函數(shù)參數(shù),題目:讀入三個(gè)浮點(diǎn)數(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; ,例8-13 (續(xù)),63,8.3 指針 8.3.8 用指針作為函數(shù)參數(shù),int main() cout x; splitFloat(x, ,64,例8-13 (續(xù)),運(yùn)行結(jié)果: Enter 3 floating point numbers 4.7 Integer Part = 4 Fraction Part = 0.7 8.913 Integer Part = 8 Fraction Part = 0.913 -4.7518 Integer Part = -4 Fraction Part = -0.7518,8.3 指針 8.3.8 用指針作為函數(shù)參數(shù),例8-14 輸出數(shù)組元素的內(nèi)容和地址,65,8.3 指針 8.3.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 pointers“ endl; for (int i = 0; i n; i+) cout “ Address for index “ i “ is “ p + i; cout “ Value is “ *(p + i) endl; ,例8-14 (續(xù)),66,8.3 指針 8.3.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; ,67,例8-14 (續(xù)),運(yùn)行結(jié)果: In main, address of array is 0012FF50 In func, address of array is 0012FF50 Accessing array using pointers Address for index 0 is 0012FF50 Value is 50 Address for index 1 is 0012FF54 Value is 60 Address for index 2 is 0012FF58 Value is 70 Address for index 3 is 0012FF5C Value is 80 Address for index 4 is 0012FF60 Value is 90,8.3 指針 8.3.8 用指針作為函數(shù)參數(shù),例8-15 指向常量的指針做形參,68,8.3 指針 8.3.8 用指針作為函數(shù)參數(shù),#include using 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 (int i = 1; i n; i+) cout “, “ *(p+i); cout “ “ endl; ,8.3.9 指針型函數(shù),當(dāng)函數(shù)的返回值是地址時(shí),該函數(shù)就是指針形函數(shù)。 聲明形式 存儲(chǔ)類型 數(shù)據(jù)類型 *函數(shù)名(),69,8.3 指針,8.3.10 指向函數(shù)的指針,聲明形式 存儲(chǔ)類型 數(shù)據(jù)類型 (*函數(shù)指針名)(); 含義: 數(shù)據(jù)指針指向數(shù)據(jù)存儲(chǔ)區(qū),而函數(shù)指針指向的是程序代碼存儲(chǔ)區(qū)。,70,8.3 指針,例8-16(教材例6-11) 函數(shù)指針,71,8.3 指針 8.3.10 指向函數(shù)的指針,#include using 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 endl; ,例8-16 (續(xù)),const float PI = 3.14159f; const float TWO_PI = PI * 2.0f; int main() /主函數(shù) void (*functionPointer)(float); /函數(shù)指針 printStuff(PI); functionPointer = printStuff; functionPointer(PI); /函數(shù)指針調(diào)用 functionPointer = printMessage; functionPointer(TWO_PI); /函數(shù)指針調(diào)用 functionPointer(13.0); /函數(shù)指針調(diào)用 functionPointer = printFloat; functionPointer(PI); /函數(shù)指針調(diào)用 printFloat(PI); return 0; ,72,8.3 指針 8.3.10 指向函數(shù)的指針,73,例8-16 (續(xù)),運(yùn)行結(jié)果: This is the print stuff function. This is the print stuff function. The data to be listed is 6.28318 The data to be listed is 13 The data to be printed is 3.14159 The data to be printed is 3.14159,8.3 指針 8.3.10 指向函數(shù)的指針,8.3.11 對(duì)象指針,聲明形式 類名 *對(duì)象指針名; 例: Point a(5,10); Piont *ptr; ptr=,74,8.3 指針,例8-17(教材例6-12) 使用指針來(lái)訪問(wèn)Point類的成員,/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; /返回x int getY() const return y; /返回y private: /私有數(shù)據(jù) int x, y; ;,75,8.3 指針 8.3.11 對(duì)象指針的一般概念,例8-17 (續(xù)),76,int main() /主函數(shù) Point a(4, 5); /定義并初始化對(duì)象a Point *p1 = ,8.3 指針 8.3.11 對(duì)象指針,this指針,隱含于每一個(gè)類的成員函數(shù)中的特殊指針。 明確地指出了成員函數(shù)當(dāng)前所操作的數(shù)據(jù)所屬的對(duì)象。 當(dāng)通過(guò)一個(gè)對(duì)象調(diào)用成員函數(shù)時(shí),系統(tǒng)先將該對(duì)象的地址賦給this指針,然后調(diào)用成員函數(shù),成員函數(shù)對(duì)對(duì)象的數(shù)據(jù)成員進(jìn)行操作時(shí),就隱含使用了this指針。,77,8.3 指針 8.3.11 對(duì)象指針,this指針 (續(xù)),例如:Point類的getX函數(shù)中的語(yǔ)句: return x; 相當(dāng)于: return this-x;,78,
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 學(xué)校母嬰室管理制度
- 學(xué)校類設(shè)備管理制度
- 學(xué)校鍋爐工管理制度
- 學(xué)生手衛(wèi)生管理制度
- 安培訓(xùn)教學(xué)管理制度
- 安裝小班組管理制度
- 官方自媒體管理制度
- 實(shí)施不閉環(huán)管理制度
- 實(shí)驗(yàn)室控制管理制度
- 客服全流程管理制度
- 貴州貴安發(fā)展集團(tuán)有限公司筆試
- DG∕TJ 08-53-2016 行道樹栽植技術(shù)規(guī)程
- 供應(yīng)鏈管理在電網(wǎng)企業(yè)物資管理中的應(yīng)用
- 2025版特種金屬礦山股權(quán)收購(gòu)與轉(zhuǎn)讓合同2篇
- 《螺栓連接多層全裝配式混凝土墻板結(jié)構(gòu)技術(shù)規(guī)程》
- 【MOOC】《電工技術(shù)》(北京科技大學(xué))中國(guó)大學(xué)MOOC慕課答案
- 輸血科內(nèi)部審核檢查表
- 《綠色低碳鋁評(píng)價(jià)導(dǎo)則及追溯指南》T CNIA 0245-2024
- 冶金員工安全培訓(xùn)
- 腹股溝疝護(hù)理新進(jìn)展
- 食品標(biāo)準(zhǔn)操作規(guī)程
評(píng)論
0/150
提交評(píng)論