第5章構(gòu)造數(shù)據(jù)類型
《第5章構(gòu)造數(shù)據(jù)類型》由會員分享,可在線閱讀,更多相關(guān)《第5章構(gòu)造數(shù)據(jù)類型(101頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程第第11章章C+輸輸入入輸輸出出流流第第5 5章章 構(gòu)造數(shù)據(jù)類型構(gòu)造數(shù)據(jù)類型5.1 枚舉類型枚舉類型 1. 枚舉類型的定義:枚舉類型的定義: “枚舉枚舉”是指將變量所有可能的取值一一列舉出來,變量的取值只限于列舉出來的常量。 枚舉類型的聲明的一般形式如下 : 枚舉類型名以及枚舉常量為標(biāo)識符,遵循標(biāo)識符的取名規(guī)則。 在定義一個枚舉類型時,定義了多個常量,供枚舉類型變量取值,稱此常量為枚舉常量枚舉常量。當(dāng)沒給各枚舉常量指定值時,其值依次默認(rèn)為0、1、2、;在定義枚舉類型時,也可使用賦值另行指定枚舉常量的值。 enum 枚舉類型名 枚舉常量1, 枚舉常量2, 枚舉
2、常量n;枚舉!枚舉!C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.1 枚舉類型枚舉類型枚舉類型的定義:枚舉類型的定義:例1: enum weekday SUN, MON, TUE, WED, THU, FRI, SAT ; 定義了7個枚舉常量以及枚舉類型weekday。枚舉常量具有默認(rèn)的整數(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。對于指定值后面的沒有指
3、定值的枚舉常量,編譯器會將前一個常量值加1(下一個整數(shù))賦給它,所以Chongqing的值為6。C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.1 枚舉類型枚舉類型枚舉類型的定義說明枚舉類型的定義說明: :枚舉類型定義了以后就可以使用枚舉常量、使用用枚舉類型來定義變量,定義枚舉變量的方法與定義其它變量的方法一樣。 例如: enum city city1, city2; city city1, city2; 用兩種不同方法定義了city1、city2兩個枚舉類型的變量名。 枚舉類型變量也可以在定義枚舉類型的同時定義例如:enum cityBeijing,Shangha
4、i,Tianjin=5,Chongqingcity1, city2; 在定義枚舉類型的同時定義枚舉類型變量可以省略枚舉類型 例如:enum Beijing,Shanghai,Tianjin=5,Chongqing city1, city2; 在定義變量時,可以順便給出初值,若不給初值,默認(rèn)初值為隨機(jī)的無意義的數(shù)。 C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.1 枚舉類型枚舉類型枚舉類型的使用:枚舉類型的使用: 用枚舉類型建立枚舉變量后就可以對枚舉變量實(shí)施賦值以及進(jìn)行其它運(yùn)算了,對枚舉變量進(jìn)行賦值,其值要求為同一枚舉類型要求為同一枚舉類型。否則,在編譯時出錯。 例
5、如: weekday d1,d2,d3,d4; d1=SUN; d2=6; /錯誤,因整數(shù)6不是枚舉常量,可以寫成d2=(weekday)6; d3=Shanghai; /錯誤 枚舉常量、枚舉類型的變量可進(jìn)行算術(shù)運(yùn)算、關(guān)系運(yùn)算可進(jìn)行算術(shù)運(yùn)算、關(guān)系運(yùn)算。 對枚舉類型實(shí)施算術(shù)、關(guān)系運(yùn)算時,枚舉值轉(zhuǎn)換成整型值參加運(yùn)算,結(jié)果為整型值。所以,如果要將結(jié)果賦給枚舉變量,還要將結(jié)果轉(zhuǎn)換成枚舉值。 例如:d1=d1+2; /是錯誤的,因?yàn)榻Y(jié)果為int型。 需要將它強(qiáng)制轉(zhuǎn)換強(qiáng)制轉(zhuǎn)換成枚舉型: d1=(weekday)(d1+2);C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.1 枚
6、舉類型枚舉類型枚舉類型的使用:枚舉類型的使用: 枚舉常量、枚舉類型的變量可直接進(jìn)行各種形式的關(guān)系運(yùn)可直接進(jìn)行各種形式的關(guān)系運(yùn)算算。 例如: if(city1=3) ; if(city2=Beijing); if(Shanghai=1); if(city1SUN); 枚舉類型變量不能直接進(jìn)行輸入不能直接進(jìn)行輸入 例如: cind1; /錯誤C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第4章章函函數(shù)數(shù)F注意注意: : 枚舉常量是常量,不是變量,所以不能對枚舉常量進(jìn)行賦值。 例如: 在上例中不能進(jìn)行賦值 Shanghai=Beijing; 枚舉常量的值不是列舉的字符串,其值為整數(shù)。 編譯器對賦給枚舉變量
7、的對象(數(shù))進(jìn)行類型檢查,如類型不相符則發(fā)出警告。 當(dāng)類型相 同,而值超出此類枚舉類型枚舉常量范圍時,也是正常的。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è)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)
8、據(jù)類類型型【例【例5-15-1】輸入城市代號,輸出城市名稱。 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; I
9、nput a city number (-1 to exit):1Shanghai8Invalid city number!-1 C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型枚舉類型的使用枚舉類型的使用5.1 枚舉類型枚舉類型5.2 數(shù)組數(shù)組 數(shù)組:數(shù)組: 數(shù)組是一組在內(nèi)存中依次連續(xù)存放依次連續(xù)存放的、具有同一類型同一類型的數(shù)據(jù)變量所組成的集合體。其中的每個變量稱為數(shù)組元素,它們屬于同一種數(shù)據(jù)類型,數(shù)組元素用數(shù)組名與帶方括號的數(shù)組下標(biāo)下標(biāo)一起標(biāo)識。數(shù)組可以是一維的,也可以是多維的。特點(diǎn):特點(diǎn): 若干個同類型若干個同類型的數(shù)據(jù)元素,并且各個數(shù)據(jù)元素之間存在某種次序關(guān)系
10、次序關(guān)系。這類數(shù)據(jù)有一個共同的特點(diǎn):它們有若干個同類型的數(shù)據(jù)元素,并且各個數(shù)據(jù)元素之間存在某種次序關(guān)系。 C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.2.1 一維數(shù)組定義與使用一維數(shù)組定義與使用 一維數(shù)組定義的一般形式為:一維數(shù)組定義的一般形式為: 說明:說明: 數(shù)組元素的類型可以是void型以外的任何一種基本數(shù)據(jù)類型,也可以是已經(jīng)定義過的構(gòu)造數(shù)據(jù)類型; 數(shù)組名是用戶自定義的標(biāo)識符,用來表示數(shù)組的名稱,代表數(shù)組元素在內(nèi)存中的起始地址,是一個地址常量。 常量表達(dá)式必須是unsigned int類型的正整數(shù)。表示數(shù)組的大小或長度,也就是數(shù)組所包含數(shù)據(jù)元素的個數(shù)。 是
11、數(shù)組下標(biāo)運(yùn)算符,在數(shù)組定義時用來限定數(shù)組元素的個數(shù)。數(shù)據(jù)類型 數(shù)組名常量表達(dá)式;C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型F注意注意: : 數(shù)組屬于構(gòu)造數(shù)據(jù)類型,在使用之前必須先進(jìn)行類型定義。5.2.1 一維數(shù)組定義與使用一維數(shù)組定義與使用 數(shù)組元素的類型可以是void型以外的任何一種基本數(shù)據(jù)類型,也可以是已經(jīng)定義過的構(gòu)造數(shù)據(jù)類型; 例如:下面定義了2個不同類型的數(shù)組: int a5; /定義了一個5個元素的整型數(shù)組a weekday b10; /定義了一個10個元素的枚舉數(shù)組b,weekday為已定義的枚舉型。 數(shù)據(jù)類型相同的多個數(shù)組可以在同一條語句中予以定義。
12、例如: int a110, a220; /同時定義了兩個整型數(shù)組 數(shù)據(jù)類型相同的的簡單變量和數(shù)組也可以在一個語句中定義。例如: int x, a20; /同時定義了一個整型變量和一個整型數(shù)組 C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.2.1 一維數(shù)組定義與使用一維數(shù)組定義與使用 數(shù)組定義之后,系統(tǒng)會將從內(nèi)存中為其分配一塊連續(xù)的存儲空間一塊連續(xù)的存儲空間,從第1個數(shù)據(jù)元素開始依次存放依次存放各個數(shù)組元素。例如,定義的數(shù)組a其內(nèi)存排列(分配)示意圖如圖5-1所示。. 例如: int a5; /定義了一個5個元素的整型數(shù)組a C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第
13、第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型 假設(shè)地址 內(nèi)容 符號地址 103410A0 103410A4 103410A8 103410AC 103410B0 a a+1 a+2 a+3 a+4 5*sizeof(int) a0 a1 a2 a3 a4 5.2.1 一維數(shù)組定義與使用一維數(shù)組定義與使用 一維數(shù)組初始化:一維數(shù)組初始化: 是指在定義數(shù)組的同時給數(shù)組中的元素賦值。其一般語法形式為:其一般語法形式為: 初值1,初值2, 初值n稱為初值表,初值之間用逗號,分隔, 所有初值用 括起來。 初值可以是一個變量表達(dá)式變量表達(dá)式,初值與數(shù)組元素的對應(yīng)關(guān)系是:初值i給數(shù)組第i個元素;所以,初值個數(shù)n不能超過
14、數(shù)組的大小。 若初值表中初值個數(shù)(項(xiàng)數(shù))小于數(shù)組的大小,則未指定值的數(shù)組元素被賦值為0 0;但初值表中項(xiàng)數(shù)不能為0。例如: weekday b10=MON,WED,FRI; 當(dāng)對全部數(shù)組元素賦初值時,可以省略數(shù)組的大小可以省略數(shù)組的大小,此時數(shù)組的實(shí)際大小就是初值列表中初值的個數(shù)。例如: char str = a, b, c, d, e ; /數(shù)組str的實(shí)際大小為5。 在函數(shù)中定義數(shù)組時,如果沒有給出初值表,數(shù)組不被初始化,其數(shù)組元素的值為隨機(jī)值隨機(jī)值;在函數(shù)外定義數(shù)組如果沒有初始化,其數(shù)組元素的值為0。 數(shù)組初值表的可以用一個逗號逗號結(jié)尾,其效果與沒有逗號一樣。 數(shù)據(jù)類型 數(shù)組名 常量表達(dá)
15、式 =初值1, 初值2, 初值n;C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.2.1 一維數(shù)組定義與使用一維數(shù)組定義與使用 對一維數(shù)組實(shí)施的存取操作有兩類:存取數(shù)組元素存取數(shù)組元素與讀取數(shù)組元素讀取數(shù)組元素的地址的地址。數(shù)組元素是通過數(shù)組名及下標(biāo)來標(biāo)識的,這種帶下標(biāo)的數(shù)組元素也稱為下標(biāo)變量下標(biāo)變量,下標(biāo)變量可以象簡單變量一樣參與各種運(yùn)算。 存取一維數(shù)組元素的一般語法形式為: 說明:說明: 下標(biāo)表達(dá)式可以是變量表達(dá)式變量表達(dá)式,用來標(biāo)識數(shù)組元素;不同于數(shù)組定義時用來確定數(shù)組長度的常量表達(dá)式。 當(dāng)定義了一個長度為n的一維數(shù)組a,C+規(guī)定數(shù)組的下標(biāo)從從0 0開始開始,
16、依次為0、1、2、3、n-1。對應(yīng)的數(shù)組元素分別是a0、a1、an-1,因此下標(biāo)表達(dá)式的值要在0,n-1范圍內(nèi)。例如: a1+2=100; / 將數(shù)組a的第4個元素賦值100。 數(shù)組名 下標(biāo)表達(dá)式; C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.2.1 一維數(shù)組定義與使用一維數(shù)組定義與使用 【例【例5-25-2】學(xué)生成績排序。分析分析:學(xué)生成績由鍵盤輸入,當(dāng)輸入一個負(fù)數(shù)時,輸入完畢。 采用直觀的“選擇排序法選擇排序法”進(jìn)行排序,基本步驟如下: 將a0依次與a1-an-1比較,選出大者與a0交換;最后a0為 a0-an-1中最大者; 將a1依次與a2-an-1比較,
17、選出大者與a1交換;最后a1為 a1-an-1中最大者; 同理,從i=2到i=n-1, 將ai依次與ai+1-an-1比較,選出較大 者存于ai中。C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型123456789101112131415161718/* p5_2.cpp * 數(shù)組應(yīng)用-選擇排序 */#includeusing namespace std;int main() const int MaxN=5; int n,aMaxN,i,j; for (n=0;nan; /輸入數(shù)組元素 if (an0) break; for (i=0;in;i+) coutai,t;
18、 coutnnendl;數(shù)組定義數(shù)組定義數(shù)組使用數(shù)組使用C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型1920212223242526272829303132 /對數(shù)組元素逐趟進(jìn)行選擇排序 for (i=0;in-1;i+) for (j=i+1;jn;j+) /從待排序序列待排序序列中選擇一個最大的數(shù)組元素 if (aiaj) int t; t=ai; /交換交換數(shù)組元素 ai=aj; aj=t; for (i=0;in;i+)coutai“,t”; /顯示排序結(jié)果 return 0; 80 90 95 70 -195 90 80 70 C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)
19、教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.2.1 一維數(shù)組定義與使用一維數(shù)組定義與使用 4. 4. 數(shù)組的地址數(shù)組的地址 數(shù)組元素的地址通過數(shù)組名通過數(shù)組名來讀取,其格式如下: 由于其地址不是實(shí)際的地址值不是實(shí)際的地址值,稱這個地址表達(dá)式為符號地址表達(dá)式符號地址表達(dá)式。例如: 一維數(shù)組元素a5的符號地址表達(dá)式為a+5。 若a是一個int型數(shù)組,數(shù)組的符號地址表達(dá)式a+n所表達(dá)的地址是第n+1個元素an的地址,代表的實(shí)際地址值為:a+n*sizeof(int) 而不是:a+n。 C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型數(shù)組名+整型表達(dá)式;5.2.1 一維數(shù)組
20、定義與使用一維數(shù)組定義與使用 C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型F使用數(shù)組要使用數(shù)組要注意注意: : 在使用數(shù)組時最常犯的錯誤是數(shù)組元素越界,包括上標(biāo)越界和下標(biāo)越界。上標(biāo)越界是指數(shù)組元素的訪問地址值超過了數(shù)組的起始地址;下標(biāo)越界是指數(shù)組元素的訪問地址越過了數(shù)組中最后一個數(shù)組元素的地址。對于這種錯誤,編譯器無法知道,往往在運(yùn)行時出錯。因此在程序設(shè)計(jì)時應(yīng)格外注意。 數(shù)組名是一個地址常量,不能作為左值(賦值的目標(biāo))。因此,不能將一個數(shù)組整體拷貝給另外一個數(shù)組。 例如: int a5,c5,i; a=c;/錯誤! 正確的方法是將對應(yīng)的元素進(jìn)行拷貝,見下列程序段:
21、for(i=0;i5;i+) ai=ci; /將數(shù)組c中元素的值拷貝到數(shù)組c的對應(yīng)元素中 在函數(shù)中,可以將一個一維數(shù)組作為函數(shù)的形式參數(shù),用來接受一個一維數(shù)組傳遞過來的地址。 5.2.2 二維數(shù)組的定義與使用二維數(shù)組的定義與使用 二維數(shù)組的定義的一般形式為: 其中: 常量表達(dá)式1為第1維的元素的個數(shù),常量表達(dá)式2為第2維元素的個數(shù)。 二維數(shù)組amn是以長度為n的一維數(shù)組為元素的數(shù)組,因此,等價于如下定義方式:例如: int M23; 定義了一個整型二維數(shù)組M,數(shù)組M也可以用下列方式定義: typedef int M13; / 定義了一個一維整型數(shù)組M1; M1 M2; / 以M1為類型定義數(shù)組
22、M數(shù)據(jù)類型 數(shù)組名常量表達(dá)式2常量表達(dá)式1; C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型typedef 數(shù)據(jù)類型 一維數(shù)組名常量表達(dá)式1;一維數(shù)組名 二維數(shù)組名常量表達(dá)式2;5.2.2 二維數(shù)組的定義與使用二維數(shù)組的定義與使用 如果一維數(shù)組描述排列成一行一行的數(shù)據(jù),那么,二維數(shù)組則描述若干行這樣的數(shù)據(jù)。因此,二維數(shù)組可以看作是數(shù)學(xué)上的一個矩陣。第1維元素個數(shù)為矩陣的列數(shù),第2維元素個數(shù)為矩陣的行數(shù)。 二維數(shù)組的定義格式可以寫成: 定義一個二維數(shù)組后,系統(tǒng)為它分配一塊連續(xù)連續(xù)的內(nèi)存空間。 二維數(shù)組amn占內(nèi)存空間的計(jì)算公式為: 數(shù)據(jù)類型 數(shù)組名行數(shù)列數(shù); C+語語言
23、言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型sizeof(數(shù)組名);或 m*sizeof(a0); 或 m*n*sizeof(數(shù)據(jù)類型)5.2.2 二維數(shù)組的定義與使用二維數(shù)組的定義與使用 既然一個二維數(shù)組是由若干個一維數(shù)組排列構(gòu)成,二維數(shù)組在內(nèi)存中的排列順序?yàn)?先順序排列每個一維元素先順序排列每個一維元素, ,構(gòu)成一維數(shù)組構(gòu)成一維數(shù)組;再將各個一維數(shù)組順序排列,構(gòu)成二維數(shù)組。 int M23的排列順序?yàn)椋合认葘?個int元素排列組成2個一維數(shù)組M0, M1。 M0:M00,M01,M02 M1:M10,M11,M12 再再將2個一維數(shù)組排成一個二維數(shù)組。 M: M0, M1
24、 數(shù)組M在內(nèi)存中的排列圖如圖所示。C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型 實(shí)際地址 內(nèi)容 符號地址 103B2000 M00 M, M0 103B2004 M01 M0+1 103B2008 M02 M0+2 103B200C M10 M1 103B2010 M11 M1+1 103B2014 M12 M1+2 5.2.2 二維數(shù)組的定義與使用二維數(shù)組的定義與使用 二維數(shù)組的初始化二維數(shù)組的初始化 :其中初值表具有兩種形式:嵌套的初值表,線性初值表。 (1)(1) 嵌套初值表嵌套初值表以二維數(shù)組Mmn為例,嵌套初值表的格式為: 嵌套初值表由一維初值表嵌套構(gòu)成,
25、各層構(gòu)成規(guī)則與一維數(shù)組的初值表相同。 例如: int M34=1,2,3,4,3,4,5,6,5,6,7,8; /M數(shù)組元素被全部初始化 int a23=1,0,0,1; /初始化了部分?jǐn)?shù)組元素 int b3=1,2,3,; /初始化了全部數(shù)組元素 int d3=1,3,5,5,7,9; /初始化了全部數(shù)組元素,省略了高維元素個數(shù) 數(shù)據(jù)類型 數(shù)組名 常量表達(dá)式2常量表達(dá)式1=初值表; C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型M的初值表=M0初值表,M1初值表,Mm-1初值表Mi初值表=Mi0初值表, Mi1初值表,Min-1初值表;i從0到m-1;5.2.2 二
26、維數(shù)組的定義與使用二維數(shù)組的定義與使用(2 2)線形初值表)線形初值表 線形初值表與一維數(shù)組的初值表相同,初值表的項(xiàng)數(shù)不超過各維元素個數(shù)的乘積(總元素個數(shù))。 數(shù)組元素按內(nèi)存排列順序依次從初值表中取值,下列各數(shù)組使用了線形初值表,結(jié)果與使用嵌套初值表相同。 例如: int M34=1,2,3,4,3,4,5,6,5,6,7,8; /M數(shù)組元素被全部初始化 int a23=1,0,0,0,1,1; /初始化了全部數(shù)組元素, 一部分元素未給初值 int b 3=1,0,0,0,0,0; /初始化了全部數(shù)組元素, 省略了高維元素個數(shù) 當(dāng)使用線形初值表而省略高維元素個數(shù)時,高維元素個數(shù)為: 例如: i
27、nt b 3=1,0,0,0;/高維元素個數(shù)為2C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型 向上取整數(shù)(線形初值表項(xiàng)數(shù)/低維元素個數(shù)) 5.2.2 二維數(shù)組的定義與使用二維數(shù)組的定義與使用(3 3)二維數(shù)組的存取二維數(shù)組的存取 存取維數(shù)組元素的格式為: 說明:說明: 行下標(biāo)表達(dá)式與列下標(biāo)表達(dá)式的值同樣從0開始,aij表示數(shù)組的第i+1行、第j+1列的元素。由于數(shù)組元素是變量,可以對其進(jìn)行各種各種操作。 數(shù)組元素如果定義數(shù)組amn, 即數(shù)組第1維大小為n, 第2維大小為m。aij的排列位置與在內(nèi)存中的地址計(jì)算公式如下: 例如: a, a0: 為數(shù)組a的起始地址, 即
28、a00的地址; ai+j: 為數(shù)組的第i+1行的第j+1元素的地址,即aij的地址; C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型數(shù)組名 行下標(biāo)表達(dá)式 列下標(biāo)表達(dá)式aij的排列位置=第1維大小n*i+j+1;aij的地址=a的起始地址+(第1維大小n*i+j)*sizeof(數(shù)據(jù)類型)1234567891011121314151617181920/* p5_3.cpp * 求學(xué)生多門功課的總分,并求所有學(xué)生各門功課的平均分 */#includeusing namespace std;int main() const int MaxN=100,CourseN=5; i
29、nt n,scoreMaxNCourseN+1=0; float averCourseN+1=0; for (n=0;nMaxN;n+) /輸入學(xué)生成績 for(int j=0;jscorenj; if (scoren00) break; /輸入-1,結(jié)束輸入 for (int i=0;in;i+) /計(jì)算每個學(xué)生的總分 for(int j=0;jCourseN;j+) scoreiCourseN=scoreiCourseN+scoreij; 二維數(shù)組定義二維數(shù)組定義并初始化并初始化二維數(shù)組使用二維數(shù)組使用C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型21222324
30、2526272829303132333436363738 for (int j=0;jCourseN+1;j+) /計(jì)算每門課程的平均分 for (int i=0; in; i+) averj=averj+scoreij; averj=averj/n; for (i=0;in;i+) /輸出每個人的成績與總分 for(int j=0;jCourseN+1;j+) coutscoreijt; coutendl; cout-endl; for (i=0;iCourseN+1;i+) /輸出每門功課的平均分 coutaverit; coutendl; return 0; 70 71 72 73 74
31、82 83 84 85 8692 93 94 95 96-1 0 0 0 070 71 72 73 74 36082 83 84 85 86 42092 93 94 95 96 470-81.3333 82.3333 83.3333 84.3333 85.3333 416.667 C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.2.3 多維數(shù)組多維數(shù)組 (1 1)三維以及高于三維的數(shù)組稱為多維數(shù)組三維以及高于三維的數(shù)組稱為多維數(shù)組 多維數(shù)組的定義與二維數(shù)組類似,可以一次定義,也可以逐步由低維數(shù)組定義。 例如: int b234; /定義了一個三維數(shù)組 也可用下列方式
32、步定義: typedef int B134; B1 b2; 多維數(shù)組在內(nèi)存的排列方式同樣是先排低維數(shù)組,由低向高依次排列由低向高依次排列。如:b234的排列順序?yàn)椋?b00:b000,b001,b002,b003 b0 b01:b010,b011,b012,b013b b02:b020,b021,b022,b023 b10:b100,b101,b102,b103 b1 b11:b110,b111,b112,b113 b12:b120,b121,b122,b123C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.2.3 多維數(shù)組多維數(shù)組 (2)多維數(shù)組的初始化與存取)多
33、維數(shù)組的初始化與存取多維數(shù)組的初始化形式與二維數(shù)組類似:有嵌套初值表、線性初值表兩種形式。使用線性初值表初始化時,數(shù)組元素按內(nèi)存排列順序依次從初值表中取值。對多維數(shù)組進(jìn)行存取包括對數(shù)組元素的存取和對數(shù)組元素的地址的讀取,當(dāng)一個多維數(shù)組的下標(biāo)數(shù)與維數(shù)相同時,為對數(shù)組元素的存取。當(dāng)下標(biāo)個數(shù)小于維數(shù)時表示的是一個地址,表示地址時,下標(biāo)也不能越界。 如:下列都是b234的地址表達(dá)式。 b1; /b100的地址; b2; /錯誤,下標(biāo)越界; b0+1; /與b01相同,b010的地址。 b12; /b120的地址 b12+4; /b124的地址,但數(shù)組b中沒有b124這個元素, 故指向了其它地方。 C+
34、語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型123456789101112131415161718/* 5_4.cpp * 多維數(shù)組的各種地址表達(dá)式 */#includeusing namespace std;int main() const int K=3,M=4,N=5; int k=2,m=3,n=4; short int bKMN; coutAdd of b: &b=&bendl; cout b=bendl; cout &b000=&b000endl; coutAdd of bk: &bk=&bkendl; cout bk=bkendl; cout b+k =(
35、b+k)endl; cout &b0+k=(&b0+k)endl; cout &bk00=&bk00endl;C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型1920212223242526272829303132coutAdd of bkm: &bkm=&bkmendl;cout bkm=bkmendl;cout bk+m =(bk+m)endl;cout &b00+k*M+m=(&b00+k*M+m)endl;cout &bkm0=&bkm0endl;cout &b00+(k*sizeof(b0)/sizeof(b00)+m=;cout(&b00+(k*sizeof
36、(b0)/sizeof(b00)+m)endl;coutAdd of bkmn: &bkmn=&bkmnendl;cout bkm+n=(bkm+n)endl;cout &b000+k*M*N+m*N+n=(&b000+k*M*N+m*N+n)endl;cout &b000+(sizeof(b0)*k+sizeof(b00)*m)/sizeof(b000)+n=;cout(&b000+(sizeof(b0)*k+sizeof(b00)*m)/sizeof(b000)+n)endl;return 0; Add of b: &b=0012FEF0Add of b: &b=0012FEF0 b=00
37、12FEF0 b=0012FEF0 &b000=0012FEF0 &b000=0012FEF0Add of bk: &bk=0012FF40Add of bk: &bk=0012FF40 bk=0012FF40 bk=0012FF40 b+k =0012FF40 b+k =0012FF40 &b0+k=0012FF40 &b0+k=0012FF40 &bk00=0012FF40 &bk00=0012FF40Add of bkm: &bkm=0012FF5EAdd of bkm: &bkm=0012FF5E bkm=0012FF5E bkm=0012FF5E bk+m =0012FF5E bk+
38、m =0012FF5E &b00+k &b00+k* *M+m=0012FF5EM+m=0012FF5E &bkm0=0012FF5E &bkm0=0012FF5E &b00+(k &b00+(k* *sizeof(b0)/sizeof(b00)+m=0012FF5Esizeof(b0)/sizeof(b00)+m=0012FF5EAdd of bkmn: &bkmn=0012FF66Add of bkmn: &bkmn=0012FF66 bkm+n=0012FF66 bkm+n=0012FF66 &b000+k*M*N+m*N+n=0012FF66 &b000+(sizeof(b0)*k+s
39、izeof(b00)*m)/sizeof(b000)+n=0012FF66 C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.2.4 數(shù)組與函數(shù)數(shù)組與函數(shù) 數(shù)組名數(shù)組名是一個地址,不能當(dāng)作一個左值,但是可以作為函數(shù)的形參,接受實(shí)參傳送來的地址。當(dāng)形參接受實(shí)參傳送來的地址后,形參數(shù)組與實(shí)參共享內(nèi)存中的一塊空間共享內(nèi)存中的一塊空間。函數(shù)體通過形參對數(shù)組內(nèi)容的改變會直接作用到實(shí)參上。數(shù)組名作為形參是數(shù)組應(yīng)用的一個重要方面。 注意注意: (1)(1)使用數(shù)組名傳遞地址時,雖然傳遞是地址,但形參與實(shí)參的地址 (數(shù)組)類型應(yīng)一致類型應(yīng)一致。 (2)(2)形式參數(shù)中數(shù)組元素個數(shù)沒有
40、給定沒有給定,因此,在函數(shù)體中,對數(shù)組存取的下標(biāo)可以為任意值而不會出現(xiàn)編譯錯誤。但是,當(dāng)這個下標(biāo)超過超過了實(shí)參數(shù)組的元素個數(shù)范圍時,存取的就不是實(shí)參數(shù)組中的內(nèi)容了。 C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型12345678910111213141516171819/*利用對一個多維數(shù)組的某列排序函數(shù),將學(xué)生某門功課的成績分班級排序 */#includeusing namespace std;const col=5;enum dir Asc,Des;/遞增,遞減void sort(int acol, int n, int Cn, dir D) /排序 int tc
41、ol; /用于暫存一行數(shù)據(jù) for (int i=0;in-1;i+) for (int j=i+1;jn;j+) /從待排序序列中選擇一個最大(小)的數(shù)組元素 if (aiCnajCn&D=Asc) memcpy(t,ai,sizeof(t); /交換數(shù)組行 memcpy(ai,aj,sizeof(t); memcpy(aj,t,sizeof(t); C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型數(shù)組作為函數(shù)形式參數(shù)數(shù)組作為函數(shù)形式參數(shù) 222324252627282930313233343536373839404142 43int main() const Cou
42、rseN=5; int n,scoreCourseN=20060101, 1, 82, 86, 0, 20060203, 2, 80, 80, 0, 20060204, 2, 86, 90, 0, 20060205, 2, 90, 83, 0, 20060102, 1, 75, 86, 0; n=sizeof(score)/sizeof(score0); for (int i=0;in;i+) /計(jì)算每個學(xué)生的總分 for(int j=2;jCourseN-1;j+) scoreiCourseN-1=scoreiCourseN-1+scoreij; sort(score,n,4,Des); /
43、按總分降序排序 sort(score,n,1,Asc); /按班號的升序排序,前面排序還有作用嗎? for (i=0;in;i+) /輸出每個人的成績與總分 for(int j=0;jCourseN;j+) coutscoreijt; coutendl; return 0; 20060101200601011 18282868616816820060102200601021 17575868616116120060204200602042 28686909017617620060205200602052 29090838317317320060203200602032 280808080160
44、160 C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型數(shù)組作為函數(shù)形式參數(shù)數(shù)組作為函數(shù)形式參數(shù) 5.2.5 字符數(shù)組與字符串字符數(shù)組與字符串 存放字符型數(shù)據(jù)的數(shù)組稱為字符數(shù)組字符數(shù)組。字符數(shù)組也分為一維數(shù)組和多維數(shù)組。 前述的數(shù)組的定義及初始化同樣適用于字符數(shù)組,除此以外,C+對字符數(shù)組的初始化還可以使用字符串形式。 1.1.用字符進(jìn)行初始化用字符進(jìn)行初始化 例如: char s1 =C,h,i,n,a; char s2 4=H,o,w,a,r,e,y,o,u; 2.用字符串進(jìn)行初始化用字符串進(jìn)行初始化 例如: char s3 =China; char s4 4=ho
45、w, are, you; C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型3. 3. 字符數(shù)組的使用字符數(shù)組的使用 字符數(shù)組也是數(shù)組,我們同樣可以通過數(shù)組名及下標(biāo)引用數(shù)組中的元素。 為方便對字符與字符串的處理,C+提供了許多專門處理字符與字符串的函數(shù),這些函數(shù)原型在各自的頭文件中定義。 下表列出了常用的字符與字符串處理函數(shù)的調(diào)用方法與功能簡介,函數(shù)原形與詳細(xì)的功能可以從C+編譯器的幫助文檔中獲得。函數(shù)的用法函數(shù)的用法函數(shù)的用法函數(shù)的用法函數(shù)的用法函數(shù)的用法strlen(字符串)返回字符串的長度(不包括0) Cstring strset(字符數(shù)組, 字符C)將字符數(shù)組中的
46、所有字符都設(shè)為指定字符C, 并以0結(jié)尾strlwr(字符串)將字符串中的所有字符轉(zhuǎn)換成小寫字符strupr(字符串)將字符串中的所有字符轉(zhuǎn)換成大寫字符strcmp(串s1, 串s2)比較兩個字符串的大小,即按從左到右的順序逐個比較對應(yīng)字符的ASCII碼值。若s1大于s2,返回1;若s1小于s2,返回-1;若s1等于s2,返回0。串s1、s2可以是字符串常量C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.2.5 字符數(shù)組與字符串字符數(shù)組與字符串 常用字符與字符串處理函數(shù)常用字符與字符串處理函數(shù)函數(shù)的用法函數(shù)的用法函數(shù)的用法函數(shù)的用法函數(shù)的用法函數(shù)的用法 strcpy(
47、串s1, 串s2) 將字符串s2拷貝到s1所指的存儲空間中,然后返回s1。 其中, 串s2可以是字符串常量 Cstring strcat(串s1, 串s2)返回字符串的長度(不包括0) Ctype toupper(字符)將字符數(shù)組中的所有字符都設(shè)為指定字符C, 并以0結(jié)尾tolower(字符)將字符串中的所有字符轉(zhuǎn)換成小寫字符Cstdlibatoi(字符串)將字符串中的所有字符轉(zhuǎn)換成大寫字符atol(字符串)比較兩個字符串的大小,即按從左到右的順序逐個比較對應(yīng)字符的ASCII碼值。若s1大于s2,返回1;若s1小于s2,返回-1;若s1等于s2,返回0。串s1、s2可以是字符串常量 atof(
48、字符串)將字符串s2拷貝到s1所指的存儲空間中,然后返回s1。 其中, 串s2可以是字符串常量 C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.2.5 字符數(shù)組與字符串字符數(shù)組與字符串 常用字符與字符串處理函數(shù)常用字符與字符串處理函數(shù)12345678910111213141516171819/* p5_6.cpp * 字符串排序與查找 */#includeusing namespace std;const NameLen=20;void order(char nameNameLen,int n)/字符串排序 char tempNameLen; for(int i=0
49、;in-1;i+)/選擇排序 for(int j=i+1;j0)/比較兩個字符串的大小 strcpy(temp,namei);/字符串交換 strcpy(namei,namej); strcpy(namej,temp); C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型2021222324252627282930313233343536373839404142434445int find(char nameNameLen,int n,char searchnameNameLen) for(int i=0;i0) /未找完,但找不到,返回0 return 0; retur
50、n 0; /找完,找不到,返回0int main()char NameTabNameLen=GongJing,LiuNa,HuangPin,ZhouZijun,LianXiaolei,ChenHailing,CuiPeng,LiuPing;char searchnameNameLen;int n=sizeof(NameTab)/NameLen;order(NameTab,n);for(int i=0;in;i+) /輸出排序后的各姓名couti+1tNameTabiendl;coutsearchname;if(n=find(NameTab,n,searchname)coutPosition:n
51、endl;elsecoutNot found!endl;return 0; C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.3 指針指針 指針是C+語言最重要特性之一,也是C+的主要難點(diǎn)。 指針提供了一種較為直觀的地址地址操作的手段,正確地使用指針,可以方便、靈活而有效地組織和表示復(fù)雜的數(shù)據(jù)。 指針在C+程序中扮演著非常重要的角色,從某種程度上而言,如果不能深刻的理解深刻的理解指針的概念,正確而有效的掌握指針,就不可能真正學(xué)好C+,但是指針也是我們最容易產(chǎn)生困惑并導(dǎo)致程序出錯的原因之一。 C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.3
52、 指針指針1. 1. 地址與指針地址與指針地址:地址: 當(dāng)定義一個變量后,內(nèi)存中將會劃出一塊由若干個存儲單元組成的區(qū)域,用于保存該變量的數(shù)據(jù)。在內(nèi)存里每個存儲單元都有各自的編號,稱為地址地址。指針:指針: 在C+中,提供了指針指針類型,它是一種用于存放內(nèi)存單元地址的變量類型,地址就存儲在這種指針類型的變量中。正因?yàn)橹羔樧兞看鎯Φ氖堑刂罚盟鼇碇该鲀?nèi)存單元,所以形象地稱這種地址變量為指針指針。 C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.3 指針指針2. 2. 指針變量的定義指針變量的定義 每存儲一個地址,就要定義一個指針變量。定義指針變量的格式如下: 數(shù)據(jù)類型是
53、指針變量所指向?qū)ο蟮臄?shù)據(jù)類型,它可以是基本數(shù)據(jù)類型,也可以是構(gòu)造數(shù)據(jù)類型以及void 類型。 變量名是用戶自定義的標(biāo)識符。 *表示聲明的變量是一個指針變量,而不是普通變量。 例如: int *ip; /定義了一個int型的指針變量ip float *fp; /定義了一個float型指針變量fp typedef int A10; A *ap; / 定義了一個A類型的指針變量ap sizeof(ip)=sizeof(fp)=sizeof(ap)=4; 數(shù)據(jù)類型 * 變量名; C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.3 指針指針 3 3指針的初始化與賦值指針的初始
54、化與賦值 定義了一個指針,只是得到了一個用于存儲地址的指針變量。若指針變量既沒有初始化,也沒有賦值,其地址值是一個隨機(jī)的數(shù)。 (1)不要將一個非地址常量、變量以及無意義的實(shí)際地址賦給指針變量。如: int *p=100; /錯誤,100是一個int型常量,不是一個地址常量。 int *p=(char *)100; /危險(xiǎn)!100是一個無意義的實(shí)際地址, 可能指向危險(xiǎn)區(qū)域。(2 2)可以使用一個已初始化的指針去給另一個指針賦值,但類型必須一致如果不一致,可 進(jìn)行強(qiáng)制類型轉(zhuǎn)換。 char *p=NULL; int *ip=(int *)p+100; /將char型指針強(qiáng)制轉(zhuǎn)化成int型指針。(3
55、3)對于基本數(shù)據(jù)類型的變量、數(shù)組元素我們可以使用取地址運(yùn)算符&來獲得它們的地址, 但是也只有類型一致才能賦值。 int a10; /定義int型數(shù)組 int *i_pointer=a; /定義并初始化int型指針 (4 4)有一種特殊的void類型指針,可以存儲任何的類型地址;但將一個void類型的地址賦值 給非void類型的指針變量,要使用類型強(qiáng)制轉(zhuǎn)換。 void v; /錯誤,不能定義void類型的變量 void *vp; /定義void類型的指針 數(shù)據(jù)類型 *指針變量名=初始地址表達(dá)式; C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.3 指針指針4 4指針運(yùn)
56、算指針運(yùn)算 指針變量存放的是地址地址,因此指針的運(yùn)算實(shí)際上就是地址的運(yùn)算指針的運(yùn)算實(shí)際上就是地址的運(yùn)算,但正是由于指針的這一特殊性,使指針?biāo)苓M(jìn)行的運(yùn)算受到了一定的限制。指針通常進(jìn)行下列幾種運(yùn)算:賦值運(yùn)算、取值運(yùn)算、算術(shù)運(yùn)算、相減運(yùn)算、比較運(yùn)算。 (1 1)* * 和和& &運(yùn)算運(yùn)算 * *稱為指針運(yùn)算符指針運(yùn)算符。出現(xiàn)在數(shù)據(jù)定義語句中時,* 在數(shù)據(jù)類型與變量之間,是一個二二元運(yùn)算符元運(yùn)算符,用來定義指針變量;出現(xiàn)指針變量表達(dá)式左邊左邊時,是一個一元運(yùn)算符,表示訪問指針?biāo)笇ο蟮膬?nèi)容所指對象的內(nèi)容。 例如: int a4=1,2,3; int *ip=&a2; cout*ip; / 輸出ip指
57、向單元的內(nèi)容,內(nèi)容為整型數(shù)3 *ip=100; / 將100賦給a2;C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.3 指針指針(2 2)指針與整數(shù)的加減運(yùn)算)指針與整數(shù)的加減運(yùn)算 指針的加減運(yùn)算與普通變量的加減運(yùn)算不同,由于指針存儲的是變量的內(nèi)存地址,指針加上或減去一個整數(shù)n,表示指針從當(dāng)前位置向后或向前移動n個sizeof(數(shù)據(jù)類型)長度的存儲單元。因此對于不同的數(shù)據(jù)類型,n的實(shí)際大小就不同。 例如程序段: int b234; typedef char A10; int *p1=b10; int *p2=(int *)b1; int *p3=(int *)(b
58、+1); double *pd=(double *)p3; A *pa=(A *)p3; coutp1,p2,p3,pd,paendl; coutp1+1,p2+1,p3+1,pd+1,pa+1endl; 0013FF80, 0013FF80, 0013FF80, 0013FF80, 0013FF800013FF80, 0013FF80, 0013FF80, 0013FF80, 0013FF800013FF84, 0013FF84, 0013FF84, 0013FF88, 0013FF8A C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.3 指針指針(3 3)指針自
59、增、自減運(yùn)算)指針自增、自減運(yùn)算 指針的自增、自減運(yùn)算是指針加減運(yùn)算的特例。指針的自增或自減表示指針從當(dāng)前位置向后或向前移動sizeof(數(shù)據(jù)類型)長度的存儲單元。 例如:程序段: int *p, *q, a=5; p=&a; p+; /指針p后移4個字節(jié) *p+; /先讀取p指向的變量a的值5,然后使指針p后移4個字節(jié) (*p)+; /讀取p指向的變量a的值,然后使p指向的變量a自增1 *+p; /先使指針p后移4個字節(jié),然后讀取p指向的變量的值 +*p; /將p指向的變量a自增1 *q+=*p+; /這是一種常用的表達(dá)式,依次執(zhí)行:*q=*p, q+, p+(4 4)兩指針相減)兩指針相減
60、 當(dāng)兩個指針指向同一數(shù)組時指向同一數(shù)組時,兩個指針的相減才有意義才有意義。兩個指針相減的結(jié)果為一整數(shù),表示兩個指針之間數(shù)組元素的個數(shù)。 C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.3 指針指針(5 5)兩個指針的比較運(yùn)算)兩個指針的比較運(yùn)算 兩個指針的比較一般用于下列兩種情況:一是比較兩個指針?biāo)赶虻膶ο笤趦?nèi)存中的位置關(guān)系位置關(guān)系;二是判斷指針是否為空指針空指針。 5 5 void void類型指針類型指針 指向void類型的指針是一種不確定類型不確定類型的指針,它可以指向任何類型的變量可以指向任何類型的變量。實(shí)際使用void型指針時,只有通過強(qiáng)制類型轉(zhuǎn)換強(qiáng)制類
61、型轉(zhuǎn)換才能使void型指針得到具體變量的值。在沒有轉(zhuǎn)換前沒有轉(zhuǎn)換前void型指針不能不能進(jìn)行指針的算術(shù)運(yùn)算。 例如: void *vp; /定義了一個void型指針vp int i=6, *ip; vp=&i; / vp指向整型變量i cout“i=”*vpendl; / 錯誤 couti=*(int *)vpendl; ip=(int *)vp; /ip指向vp指向的變量i couti=*ipendl; C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.3.2 指針與字符串指針與字符串 字符型指針:字符型指針: 用于存放字符型變量的地址,而字符串的本質(zhì)是以字符串的本
62、質(zhì)是以00結(jié)尾的字符數(shù)組結(jié)尾的字符數(shù)組,一個字符型指針存儲了字符數(shù)組的第一個元素的地址,也就存儲了字符串的地址,這個指針就指向了字符串。 在定義一個字符數(shù)組時,可以將一個字符串常量作為初值,但將字符串常量作為初值賦給字符數(shù)組和將字符串常量作為初值初值賦給字符指針變量,二者的含義是不同的。例如: char str5=abcd; char *p_str=abcd;在上述字符串定義有下列不同: (1) (1) 字符數(shù)組str5被賦值為“abcd”,因此,數(shù)組str的五個數(shù)組元素的值分別為 字符a、b、c、d和0。字符指針p_str被賦值為“abcd”,則意味著 指針指針p_strp_str的值的值為
63、字符串常量abcd的第一個字符第一個字符a在內(nèi)存中的地址。 (2) (2) 字符指針p_str比str多分配了一個存儲地址的空間多分配了一個存儲地址的空間,用于存儲字符串的首地 址。 C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.3.3 5.3.3 指針與數(shù)組指針與數(shù)組 1.1.使用指針操作符使用指針操作符* *存取數(shù)組存取數(shù)組 指針的加減運(yùn)算的特點(diǎn)指針的加減運(yùn)算的特點(diǎn)使得指針操作符特別適合處理存儲在一段連一段連續(xù)內(nèi)存空間續(xù)內(nèi)存空間中的同類型數(shù)據(jù)。這樣,使用指針操作符來對數(shù)組及其元素進(jìn)行操作就非常方便。(1) (1) 一維數(shù)組的指針操作一維數(shù)組的指針操作 當(dāng)定義數(shù)
64、組一維數(shù)組T aN (T為類型),下式為存取數(shù)組元素ai的等效方式: *(a+i); 而a+i為ai的地址。(2) (2) 多維數(shù)組的指針操作多維數(shù)組的指針操作 對于多維數(shù)組,使用指針同樣可以靈活訪問數(shù)組元素。若定義數(shù)組T bKM, 下式為存取數(shù)組元素aij的等效方式等效方式: 例如: *(*(b+i)+j); 其中: *(b+i)+j為bij的地址,即&bij; *(b+i)為bi0的地址,即bi,也是bi0地址; C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.3.3 5.3.3 指針與數(shù)組指針與數(shù)組 2.2.指針數(shù)組指針數(shù)組 指針數(shù)組是以指針變量為元素指針變量
65、為元素的數(shù)組,指針數(shù)組的每個元素都是同一類型的指針變量。 在指針數(shù)組的定義中有兩個運(yùn)算符:*和 ,運(yùn)算符運(yùn)算符 的的優(yōu)先級高于優(yōu)先級高于* *,所以*pN等價于*( pN),p N表示一個數(shù)組,而*表示數(shù)組元素為指針變量。例如: int *p_a5; 定義了一個指針數(shù)組,其中有5個數(shù)組元素,每個數(shù)組元素都是一個int類型的指針。 F注意注意: : 對指針數(shù)組的存取同樣可以使用指針方式、數(shù)組方式、以及指針與數(shù)組結(jié)合的方式。一維指針數(shù)組與二維指針數(shù)組對應(yīng),可采用存取二維數(shù)組的方式存取。 指針數(shù)組的每一個元素都是一個指針,因此必須先賦值先賦值,后引用后引用。C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第
66、5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.3.3 5.3.3 指針與數(shù)組指針與數(shù)組 3 3)數(shù)組指針)數(shù)組指針 數(shù)組指針是指向數(shù)組的指針。 雖然運(yùn)算符 的優(yōu)先級高于*,但是,在數(shù)組指針的定義式中,(* 指針名)改變了這種優(yōu)先級,它表明定義的首先是一個指針,然后才是什么類型的指針。例如: int (* a_p) 5;等效于下列定義方式: typedef int I_A5; I_A *a_p;C+語語言言程程序序設(shè)設(shè)計(jì)計(jì)教教程程 第第5章章構(gòu)構(gòu)造造數(shù)數(shù)據(jù)據(jù)類類型型5.3.4 5.3.4 多重指針多重指針 如果已經(jīng)定義了一個指針類型,我們再定義一個指針,用于指向已經(jīng)定義的指針變量,后面定義的指針變量就是一個指向指針的指針變量,簡稱指向指指向指針的指針針的指針,這樣的指針也稱二重二重( (級級) )指針指針。 三重及以上三重及以上的指針統(tǒng)稱為多重指針多重指針。例如: int *pp; 定義了一個二級指針變量,等效于下列定義方式: typedef int * P; P *p; 二級指針常用來指向一個指針數(shù)組。例: int a23=1,2,3,4,5,6; /聲明并初始化二維數(shù)組 int *p_a3; /
- 溫馨提示:
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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 隱蔽工程驗(yàn)收要點(diǎn)
- 給排水中水泵揚(yáng)程與壓力的關(guān)系
- 水泥廠燒成回轉(zhuǎn)窯中控操作問題解答
- 地暖安裝注意事項(xiàng)
- 水泥廠中控操作自動化專業(yè)試題(附答案)
- 防水套管的應(yīng)用與分類
- 施工現(xiàn)場職業(yè)健康管理制度
- 常見基坑工程的支護(hù)方式
- 水泥包裝車間各崗位職責(zé)
- 打樁機(jī)的種類
- 水泥磨操作員試題(附答案)
- 鋼結(jié)構(gòu)工程量計(jì)算注意事項(xiàng)
- 水泥控制工試題(附答案)
- 水泥生產(chǎn)工藝類知識考試題(附答案)-
- 鋼結(jié)構(gòu)安裝施工安全技術(shù)交底范文