C++第3章_string、vector、數(shù)組和指針_第1頁(yè)
C++第3章_string、vector、數(shù)組和指針_第2頁(yè)
C++第3章_string、vector、數(shù)組和指針_第3頁(yè)
C++第3章_string、vector、數(shù)組和指針_第4頁(yè)
C++第3章_string、vector、數(shù)組和指針_第5頁(yè)
已閱讀5頁(yè),還剩72頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、C+程序設(shè)計(jì)程序設(shè)計(jì)第3章 string、vector、數(shù)組和指針 3.1 3.1 標(biāo)準(zhǔn)庫(kù)標(biāo)準(zhǔn)庫(kù)stringstring類型類型 3.2 3.2 標(biāo)準(zhǔn)庫(kù)標(biāo)準(zhǔn)庫(kù)vectorvector類型類型 3.3 3.3 數(shù)組數(shù)組 3.4 3.4 指針指針 3.5 typedef3.5 typedef 3.6 3.6 本章小結(jié)本章小結(jié) 第第3 3章章 string、vector、數(shù)組和指針、數(shù)組和指針3.1 3.1 標(biāo)準(zhǔn)庫(kù)標(biāo)準(zhǔn)庫(kù)string類型類型3.1.1 對(duì)象與變量一般情況下,為了與內(nèi)置類型變量相區(qū)別,稱復(fù)雜數(shù)據(jù)類型的變量為對(duì)象(object),或稱某某數(shù)據(jù)類型對(duì)象。廣義講,常量、變量都稱為對(duì)象,狹義講

2、,對(duì)象僅指復(fù)雜數(shù)據(jù)類型的變量,在本書中,沿用對(duì)象廣義概念,類變量稱為對(duì)象,基本數(shù)據(jù)類型的變量稱為對(duì)象,常量也稱為對(duì)象。 3.1.2 3.1.2 string對(duì)象的定義和初始化對(duì)象的定義和初始化為了在程序中使用string類型,必須包含string頭文件,并導(dǎo)入名字空間,如下:#include using std:string;標(biāo)準(zhǔn)庫(kù)string是類類型,類類型對(duì)象通過構(gòu)造函數(shù)初始化,構(gòu)造函數(shù)是一個(gè)特殊的類成員函數(shù),在類對(duì)象初始化的時(shí)候執(zhí)行。3.1.2 3.1.2 string對(duì)象的定義和初始化對(duì)象的定義和初始化表3-1 string的幾個(gè)常用構(gòu)造函數(shù)string的幾個(gè)常用構(gòu)造函數(shù)string

3、s1; 缺省構(gòu)造函數(shù),生成一個(gè)空字符串s1string s2(s1); 拷貝構(gòu)造函數(shù),將s2初始化為s1的副本string s3(value); 將s3初始化為一個(gè)字符串字面值的副本string s4(n, c);將s4初始化為包含n個(gè)c字符的字符串3.1.3 3.1.3 string對(duì)象的輸入輸出對(duì)象的輸入輸出【例 3.1】string對(duì)象的輸入和輸出操作。#include #include using namespace std;/ using std:string;int main( ) string s1, s2;/ 定義s1、s2,并初始化s1、s2為空字符串 / 依次讀取字符串一賦

4、給s1,字符串二賦給s2 cin s1 s2; cout s1 s2 endl;/ 輸出s1和s2 return 0;3.1.4 3.1.4 string對(duì)象的操作對(duì)象的操作對(duì)象成員包括該數(shù)據(jù)類型定義的成員函數(shù)和內(nèi)部數(shù)據(jù)成員,要調(diào)用一個(gè)對(duì)象的成員函數(shù),或者引用一個(gè)對(duì)象的內(nèi)部數(shù)據(jù)成員,通過“.”運(yùn)算符,表示如下:對(duì)象名.數(shù)據(jù)成員或者對(duì)象名.成員函數(shù)名(參數(shù)表)前者引用的是數(shù)據(jù)成員,后者調(diào)用成員函數(shù),這里,“.”是一個(gè)運(yùn)算符,功能是表示對(duì)象的成員。 表3-2 常用的string操作常用的常用的string操作操作s.size( )、s.length( )返回返回s中字符的個(gè)數(shù)中字符的個(gè)數(shù)s.emp

5、ty( )如果如果s為空串,則返回為空串,則返回true,否則返回,否則返回falses.max_size( )返回字符的可能最大個(gè)數(shù)返回字符的可能最大個(gè)數(shù)s.capacity( )返回重新分配之前的字符容量返回重新分配之前的字符容量s.reserve( )保留一定量?jī)?nèi)存以容納一定數(shù)量的字符保留一定量?jī)?nèi)存以容納一定數(shù)量的字符=、!=、=、pare( )按字典序比較字符串按字典序比較字符串=、s.assign( )字符串賦值字符串賦值s.erase( )清空字符串清空字符串s1 + s2把把s1和和s2連接成一個(gè)新字符串,返回新生成的字符串連接成一個(gè)新字符串,返回新生成的字符串+=、s.appe

6、nd( )在尾部添加字符在尾部添加字符sn、s.at(n)存取存取s中位置為中位置為n的字符,位置從的字符,位置從0開始計(jì)數(shù)開始計(jì)數(shù)find( )、rfind( )、substr( )、find_first_of、find_first_not_of、find_last_of和和find_last_not_of子串查找子串查找s.insert( )插入字符插入字符s.replace( )字符串替換字符串替換s.swap( )交換兩個(gè)字符串的內(nèi)容交換兩個(gè)字符串的內(nèi)容、getline( )從從stream讀取某值讀取某值s.c_str( )將內(nèi)容以將內(nèi)容以c_string返回返回s.data( )將

7、內(nèi)容以字符數(shù)組形式返回將內(nèi)容以字符數(shù)組形式返回s.begin( )、s.end( )提供類似提供類似STL的迭代器支持的迭代器支持s.rbegin( )、s.rend( )逆向迭代器逆向迭代器s.get_allocator( )返回配置器返回配置器3.1.4 3.1.4 string對(duì)象的操作對(duì)象的操作1.string的大小和容量函數(shù)一個(gè)C+字符串存在3種大小,相應(yīng)的函數(shù)分別是:l函數(shù)size( )和length( )等價(jià),都返回string對(duì)象中字符個(gè)數(shù)。函數(shù)empty( )判斷字符串是否為空,判斷字符串是否空也可以利用函數(shù)size( )或者length( ),將長(zhǎng)度與0比較;l函數(shù)max_

8、size( ),所獲取的大小是當(dāng)前字符串最多能容納的字符數(shù),和機(jī)器本身的限制或者字符串所在位置連續(xù)內(nèi)存的大小有關(guān)系,例如,在某臺(tái)PC上:cout s.max_size( ) endl; 輸出:4294967293;3.1.4 3.1.4 string對(duì)象的操作對(duì)象的操作l函數(shù)capacity( ),重新分配內(nèi)存之前 string所能包含的最大字符數(shù),另一個(gè)相關(guān)的函數(shù)是reserve( ),reserve( )為string對(duì)象重新分配內(nèi)存,重新分配的大小由其參數(shù)決定。3.1.4 3.1.4 string對(duì)象的操作對(duì)象的操作【例 3.2】string的大小和容量函數(shù)的使用。#include #i

9、nclude using namespace std;int main( ) string s(Hello World!);/ s初始化為Hello World!cout s.length( ) endl;cout s.size( ) endl;cout s.capacity( ) endl;cout s.max_size( ) endl;if ( s.empty( ) ) cout s 是空串 endl;else cout s 長(zhǎng)度是 s.size( ) endl;return 0;3.1.4 3.1.4 string對(duì)象的操作對(duì)象的操作2.string關(guān)系運(yùn)算lstr1、str2比較,不失

10、一般性,假設(shè)str1.length() str2.length(),str2比str1長(zhǎng),如果str1與str2前面部分相同,則 str1小于str2。l如果str1和str2的字符不同,則比較第一個(gè)不匹配的字符。string類定義了常見的關(guān)系運(yùn)算符(=、!=、=),關(guān)系運(yùn)算符比較兩個(gè)string對(duì)象時(shí)采用大小寫敏感的字典序策略。3.1.4 3.1.4 string對(duì)象的操作對(duì)象的操作例如:string subStr = Hello;string phrase = Hello World;string str = Hi;如果兩兩比較,則subStr小于phrase,str大于subStr,st

11、r大于phrase。 3.1.4 3.1.4 string對(duì)象的操作對(duì)象的操作string類還支持比較成員函數(shù)compare( ),compare( )支持用索引值和長(zhǎng)度定位子串來進(jìn)行比較,返回一個(gè)整數(shù),如:string s(abcd);string s2(ab);pare(abcd);/ 將s(abcd)和abcd比較,相等,返回pare(dcba);/ 將s(abcd)和dcba比較,返回一個(gè)小于0的值pare( s2 );/ 將s(abcd)和s2(ab)比較,返回大于0的值pare(s);/ 相等,返回0/將s(“abcd”)中“ab”和s(“abcd”)中“cd”比較,返回值小于0S

12、.compare(0,2,s,2,2);/將s(“abcd”)中的“bc”和“bcx”中的”bc”比較,返回0S.compare(1,2,”bcx”,2);3.1.4 3.1.4 string對(duì)象的操作對(duì)象的操作string對(duì)象的賦值有兩種方式,一是使用操作符運(yùn)算符=,如:string strTo, strFrom;strTo = strFrom;3.string對(duì)象的賦值3.1.4 3.1.4 string對(duì)象的操作對(duì)象的操作string s;string str (Hello);s.assign(str);s.assign(feeling);s.assign(str, 0, 3);/ 把H

13、el賦給s,索引從0開始/ 把str從索引2到結(jié)尾賦給s,即把llo賦給ss.assign(str, 2, string:npos);s.assign(5, t);二是使用成員函數(shù)assign( ),assign( )支持靈活的字符串賦值。3.1.4 3.1.4 string對(duì)象的操作對(duì)象的操作4.string對(duì)象相加相加指字符串連接,支持string對(duì)象和string對(duì)象、string對(duì)象與const char*對(duì)象、string對(duì)象與char對(duì)象,可以通過使用加運(yùn)算符(+)或復(fù)合賦值運(yùn)算符(+=)連接,結(jié)果生成一個(gè)新的string對(duì)象,例如string s1(Hello );string

14、s2(Worldn);下面通過加法生成新的string對(duì)象:string s3 = s1 + s2; / s3是:Hello Worldnstring + string/ s4是:Hello Kitty string + 字符串字面值string s4 = s1 + Kitty;3.1.4 3.1.4 string對(duì)象的操作對(duì)象的操作如果要把s2直接追加到s1末尾,可以使用+=運(yùn)算符:s1 += s2;/ 相當(dāng)于s1 = s1 + s2string加法返回的是string對(duì)象,和流輸入輸出(、 s1 s2;s1 = s1 + , + s2;cout s1 , s2 endl;3.1.4 3.1

15、.4 string對(duì)象的操作對(duì)象的操作5.string對(duì)象的字符元素存取string類型支持通過下標(biāo)運(yùn)算符 或者通過at( )函數(shù)訪問其中的字符元素,下標(biāo)運(yùn)算符 需要一個(gè)size_type類型的值,作為“下標(biāo)”或“索引”,以標(biāo)明要訪問字符的位置,string對(duì)象的下標(biāo)從0開始,如果s是一個(gè)string對(duì)象且s不空,則s0就是字符串的第一個(gè)字符,s1就表示第二個(gè)字符,而ss.size( )-1則表示s的最后一個(gè)字符。 3.1.4 3.1.4 string對(duì)象的操作對(duì)象的操作【例 3.12】string對(duì)象的字符元素存取操作。#include #include using namespace st

16、d;int main( ) string s(some string); for (string:size_type ix = 0; ix != s.size( ); +ix) cout six endl; for (string:size_type index = 0; index != s.size( ); +index) cout s.at(index) endl; return 0;3.2 3.2 標(biāo)準(zhǔn)庫(kù)標(biāo)準(zhǔn)庫(kù)vector類型類型vector稱為容器,因?yàn)関ector能夠像容器一樣存放各種數(shù)據(jù)類型的對(duì)象,不過,同一個(gè)vector中的所有對(duì)象都必須是相同數(shù)據(jù)類型,格式是將數(shù)據(jù)類型放在ve

17、ctor后面的尖括號(hào)中,例如:vector ivec; / ivec可存取int類型的元素vector svec; / svec可存取string類型元素3.2.1 3.2.1 vector對(duì)象的定義和初始化對(duì)象的定義和初始化為了在程序中使用vector類型,必須包含vector頭文件,并導(dǎo)入名字空間,如下:#include using std:vector;vector ivec;如果不導(dǎo)入名字空間,則需要通過域限定符:引用vector:std:vector ivec;3.2.1 3.2.1 vector對(duì)象的定義和初始化對(duì)象的定義和初始化vector的幾個(gè)常用構(gòu)造函數(shù)vector v1;創(chuàng)

18、建一個(gè)空的vector,此vector保存類型為T的對(duì)象vector v2(v1);v2是v1的一個(gè)副本vector v3(n, i);用元素個(gè)數(shù)和元素值初始化vector對(duì)象,v3包含n個(gè)值為i的元素vector v4(n);創(chuàng)建一個(gè)vector,含有n個(gè)元素,元素按缺省值初始化vector v(beg,end);創(chuàng)建一個(gè)下標(biāo)上下界為beg, end)半閉半開區(qū)間的vector表3-3 vector類型的幾個(gè)常用構(gòu)造函數(shù)3.2.1 3.2.1 vector對(duì)象的定義和初始化對(duì)象的定義和初始化lvector v1創(chuàng)建一個(gè)T類型的空的vector對(duì)象。lvector v2(v1)用vector對(duì)

19、象v1初始化對(duì)象v2時(shí),v2中每一個(gè)元素都初始化為v1中相應(yīng)元素的副本,v1和v2必須同元素類型。vector ivec1; / ivec1可存放int類型的元素vector ivec2(ivec1); / 通過從ivec1復(fù)制元素來創(chuàng)建ivec2vector svec(ivec1); / 錯(cuò)誤:svec的元素類型是string3.2.1 3.2.1 vector對(duì)象的定義和初始化對(duì)象的定義和初始化lvector v3(n, i)用元素個(gè)數(shù)和元素值初始化vector對(duì)象。vector ivec4(10, -1);創(chuàng)建一個(gè)包含10個(gè)int類型數(shù)據(jù)的vector,每個(gè)元素都初始化為-1;vecto

20、r svec(10, hi!);創(chuàng)建一個(gè)包含10個(gè)string類型數(shù)據(jù)的vector,每個(gè)元素都初始化為hi!。3.2.1 3.2.1 vector對(duì)象的定義和初始化對(duì)象的定義和初始化lvector v4(n)創(chuàng)建一個(gè)包含n個(gè)T類型數(shù)據(jù)的vector對(duì)象,vector中元素的初始化,取決于vector中存儲(chǔ)的元素的數(shù)據(jù)類型,如果vector保存基本數(shù)據(jù)類型的元素(如int、float),則用0初始化每個(gè)元素。vector fvec(10); / 10個(gè)元素,初始化為0如果vector保存的是含有構(gòu)造函數(shù)的類類型的元素(string),則用該類型的缺省構(gòu)造函數(shù)初始化每個(gè)元素:vector sve

21、c(10); / 10 個(gè)元素,初始化為空字符串3.2.2 3.2.2 vector對(duì)象的操作對(duì)象的操作表3-4 常用的vector操作常用的vector操作v.empty( )如果v為空,則返回true,否則返回falsev.size( )返回v中實(shí)際元素的個(gè)數(shù)v.push_back(elem)在v的末尾增加一個(gè)值為elem的元素vindex 、v.at(index)返回v中索引為index的元素v.begin( )、v.end( )指向迭代器中的第一個(gè)和最后一個(gè)數(shù)據(jù)地址v.erase(pos)刪除pos位置的數(shù)據(jù),傳回下一個(gè)數(shù)據(jù)的位置v.erase(beg, end)刪除beg, end)

22、區(qū)間的數(shù)據(jù),傳回下一個(gè)數(shù)據(jù)的位置v.pop_back( )刪除最后一個(gè)數(shù)據(jù)3.2.2 3.2.2 vector對(duì)象的操作對(duì)象的操作 vector的大小和容量函數(shù)vector的empty( )和size( )函數(shù)與string類似,size( )返回vector相應(yīng)的size_type類型,注意,使用size_type類型時(shí),必須同時(shí)包含vector的元素類型:vector:size_type/ 錯(cuò)誤vector:size_type / 正確2.向vector中添加元素3.2.2 3.2.2 vector對(duì)象的操作對(duì)象的操作push_back( )函數(shù)將一個(gè)新元素添加到vector對(duì)象的后面,也

23、就是“尾插”。/ 從標(biāo)準(zhǔn)輸入讀入單詞并存儲(chǔ)到vector中#include using std:vector;string word;vector svec;/ 空vectorfor (int i = 0; i word;svec.push_back(word);/ word尾插到svec中3.2.2 3.2.2 vector對(duì)象的操作對(duì)象的操作3.vector的下標(biāo)操作vector支持通過下標(biāo)運(yùn)算符 或者通過at( )函數(shù)訪問元素,索引的數(shù)據(jù)類型是vector:size_type,下標(biāo)從0開始,如果ivec是一個(gè)vector對(duì)象且ivec不空,則ivec0就是ivec的第一個(gè)字符,ivec1

24、表示第二個(gè)字符,ivecivec.size( )-1表示ivec的最后一個(gè)元素。 vector的at( )函數(shù)會(huì)檢查索引參數(shù)的范圍,如果索引無效,會(huì)拋出out_of_range異常。3.2.2 3.2.2 vector對(duì)象的操作對(duì)象的操作【例 3.4】vector的操作示例一。#include #include using namespace std;int main( ) vector ivec; / 空vector/ 索引數(shù)據(jù)類型是vector:size_type,這里是vector:size_typefor (vector:size_type index = 0; index 7; +

25、index) ivec.push_back(index) ; / 尾插for (vector:size_type idx = 0; idx != ivec.size( ); +idx) cout ivecidx , ; / 下標(biāo)運(yùn)算符 cout endl;for (vector:size_type ix = 0; ix != ivec.size( ); +ix) ivec.at(ix) = ix * ix;cout ivec.at(ix) , ; / at( )函數(shù)cout endl;return 0;運(yùn)行結(jié)果:0, 1, 2, 3, 4, 5, 6,0, 1, 4, 9, 16, 25, 3

26、6,3.2.2 3.2.2 vector對(duì)象的操作對(duì)象的操作下標(biāo)只能索引已存在的元素,必須是已存在的元素才能用下標(biāo)運(yùn)算符進(jìn)行索引,試圖索引不存在的元素將產(chǎn)生運(yùn)行時(shí)錯(cuò)誤,例如:vector ivec; / 空vectorcout ivec0; / 錯(cuò)誤:ivec中尚沒有元素vector ivec2(10);/ ivec2包含10個(gè)元素/ 錯(cuò)誤:索引越界,ivec元素的索引范圍:09cout ivec10; 4.下標(biāo)操作不添加元素3.2.2 3.2.2 vector對(duì)象的操作對(duì)象的操作因?yàn)椴荒芩饕胁淮嬖诘脑?,所以,不能通過vector的下標(biāo)賦值添加元素,如下:vector ivec; / 空v

27、ectorfor (vector:size_type ix = 0; ix != 10; +ix) ivecix = ix + 3; / 應(yīng)用程序錯(cuò)誤ivec是空的vector對(duì)象,添加元素正確寫法應(yīng)該是:vector ivec; / 空vectorfor (vector:size_type ix = 0; ix != 10; +ix) ivec.push_back( ix + 3 ); / 尾插3.2.2 3.2.2 vector對(duì)象的操作對(duì)象的操作5.刪除vector中的元素vector提供了erase( )、pop_back( )刪除vector中的元素,pop_back( )功能是刪除

28、vector中最后一個(gè)元素,如果vector為空,則相當(dāng)于什么也沒做。 3.2.2 3.2.2 vector對(duì)象的操作對(duì)象的操作【例 3.14】vector的操作示例二。#include #include using namespace std;int main( ) vector ivec;vector:size_type ix;for (ix = 0; ix != 10; +ix)ivec.push_back( ix + 1 ); / 填充ivecfor (ix = 0; ix != ivec.size( ); +ix)cout ivec.at(ix) , ;/ 輸出iveccout en

29、dl;ivec.pop_back( );/ ivec.pop_back( )3.2.2 3.2.2 vector對(duì)象的操作對(duì)象的操作 for (ix = 0; ix != ivec.size( ); +ix)cout ivec.at(ix) , ;cout endl;vector:iterator beg = ivec.begin( );ivec.erase(beg + 4);/ erase( pos )for (ix = 0; ix != ivec.size( ); +ix)cout ivec.at(ix) , ;cout endl;beg = ivec.begin( );vector:it

30、erator end = ivec.end( );ivec.erase(beg + 3, end - 2);/ erase(beg, end)for (ix = 0; ix != ivec.size( ); +ix)cout ivec.at(ix) , ;cout endl;return 0;運(yùn)行結(jié)果:1, 2, 3, 4, 5, 6, 7, 8, 9, 10,1, 2, 3, 4, 5, 6, 7, 8, 9,1, 2, 3, 4, 6, 7, 8, 9,1, 2, 3, 8, 9,3.3 3.3 數(shù)組數(shù)組程序設(shè)計(jì)中,在處理相互間有關(guān)聯(lián)的變量(如數(shù)列、矩陣等)時(shí),通過數(shù)組把多個(gè)相同類型的變量

31、有序地組織起來,可以提高編程效率,改善代碼的可讀性 。數(shù)組的作用3.3.1 3.3.1 數(shù)組的定義數(shù)組的定義數(shù)組定義的一般形式為:類型說明符 數(shù)組名 常量表達(dá)式, ;類型說明符可以是除引用類型外的任意數(shù)據(jù)類型,數(shù)組名是標(biāo)識(shí)符,方括號(hào)中的常量表達(dá)式是數(shù)組元素個(gè)數(shù),稱為數(shù)組的長(zhǎng)度,例如:int A5; / 定義int類型數(shù)組A,有5個(gè)元素/ 定義float類型數(shù)組B和C,長(zhǎng)度分別為10和20float B10, C20; char ch20; / 定義char類型數(shù)組ch,有20個(gè)元素3.3.1 3.3.1 數(shù)組的定義數(shù)組的定義不能用變量定義元素的個(gè)數(shù),數(shù)組要求在定義時(shí)有確定的數(shù)據(jù)類型和長(zhǎng)度,以便

32、分配存儲(chǔ)空間,例如:#define FD 5int main( ) int A3 + 2, B7 + FD;是合法的,下述數(shù)組定義是錯(cuò)誤的:int main( ) int n = 5;int An; / 錯(cuò)誤:定義時(shí),數(shù)組長(zhǎng)度不可以是變量3.3.2 3.3.2 數(shù)組的初始化數(shù)組的初始化數(shù)組的初始化是在定義數(shù)組的同時(shí),為其元素提供一組用逗號(hào)分隔的初值,初值用花括號(hào) 括起來,稱為初始化列表。const unsigned array_size = 5;int iaarray_size = 0, 1, 2, 3, 4;初始化賦值的一般形式為:類型說明符 數(shù)組名常量表達(dá)式 = 值,值,值當(dāng) 中值的個(gè)數(shù)少

33、于元素個(gè)數(shù)時(shí),只給前面部分元素賦值,例如:int a10 = 0, 1, 2, 3, 4;3.3.2 3.3.2 數(shù)組的初始化數(shù)組的初始化另外,只能給元素逐個(gè)提供初值,例如:給5個(gè)元素全部賦初值1,只能寫為:int a5 = 1, 1, 1, 1, 1 ;而不能寫為:int a5 = 1;給全部元素賦值,則在數(shù)組定義中,可以不給出數(shù)組元素的個(gè)數(shù),例如:int a5 = 1, 2, 3, 4, 5;可寫為:int a = 1, 2, 3, 4, 5;/ 編譯器自動(dòng)確定數(shù)組長(zhǎng)度5因?yàn)轱@式初始化,編譯器會(huì)根據(jù)列出的元素個(gè)數(shù)確定數(shù)組長(zhǎng)度。3.3.2 3.3.2 數(shù)組的初始化數(shù)組的初始化在數(shù)組定義時(shí),如

34、果沒有指定數(shù)組元素的初值,則數(shù)組元素的初始化規(guī)則如下:基本數(shù)據(jù)類型數(shù)組,如果在函數(shù)體外定義,則其元素均初始化為0,如果在函數(shù)體內(nèi)定義,則其元素不初始化。int A5; / 基本數(shù)據(jù)類型數(shù)組float B10, C20;/ 遵循變量初始化規(guī)則3.3.3 3.3.3 字符數(shù)組字符數(shù)組字符數(shù)組是指數(shù)組元素是字符的一類數(shù)組,可以用來存放多個(gè)字符,也可用來存放字符串??梢杂靡唤M由花括號(hào)括起來、逗號(hào)隔開的字符字面值進(jìn)行初始化,也可以用一個(gè)字符串字面值進(jìn)行初始化。字符串字面值包含一個(gè)額外的空字符(0),標(biāo)志字符串結(jié)束。當(dāng)使用字符串字面值來初始化創(chuàng)建的新字符數(shù)組時(shí),將在新數(shù)組中加入空字符。char ca1 =

35、 C, +, +; / 未追加空字符char ca2 = C, +, +, 0; / 顯式追加空字符0/ 用字符串字面值初始化的數(shù)組,其末位包含0char ca3 = C+; 3.3.3 3.3.3 字符數(shù)組字符數(shù)組例如,下面的初始化式將出現(xiàn)編譯時(shí)的錯(cuò)誤:char ca45 = Hello ;/ 錯(cuò)誤:數(shù)組ca4有6個(gè)元素3.3.4 3.3.4 數(shù)組元素的訪問數(shù)組元素的訪問與vector不同,一個(gè)數(shù)組不能用另外一個(gè)數(shù)組初始化,也不能將一個(gè)數(shù)組直接賦值給另一個(gè)數(shù)組:int ia = 0, 1, 2, 3;int ia24;int ia4(ia);/ 錯(cuò)誤:數(shù)組不能用另外一個(gè)數(shù)組初始化ia2 =

36、ia;/ 錯(cuò)誤:不能將數(shù)組賦值給另外一個(gè)數(shù)組數(shù)組元素用下標(biāo)運(yùn)算符 來訪問,數(shù)組元素也是從0開始計(jì)數(shù)。3.3.4 3.3.4 數(shù)組元素的訪問數(shù)組元素的訪問【例 3.6】數(shù)組元素的復(fù)制與輸出。#include using namespace std;int main( ) int ia = 0, 1, 2, 3, 4;int ia25;for(size_t ix = 0; ix 5; ix+) ia2ix = iaix;/ 通過循環(huán),對(duì)數(shù)組元素逐個(gè)復(fù)制for(size_t index = 0; index 5; index+) / 通過循環(huán),對(duì)數(shù)組元素逐個(gè)輸出 cout ia2index “, ”

37、; cout endl;return 0;運(yùn)行結(jié)果:0, 1, 2, 3, 4,3.3.5 3.3.5 二維數(shù)組與多維數(shù)組二維數(shù)組與多維數(shù)組+語(yǔ)言支持多維數(shù)組,多維數(shù)組的元素有多個(gè)下標(biāo)。 l二維數(shù)組的定義二維數(shù)組是一個(gè)m行n列矩陣,二維數(shù)組定義的一般形式是: 類型說明符 數(shù)組名 , ;其中:m、n是常量表達(dá)式,m為數(shù)組行數(shù),n為數(shù)組列數(shù),分別是數(shù)組第1維和第2維的長(zhǎng)度,例如int a34; 二維數(shù)組元素的訪問形式為:數(shù)組名下標(biāo)1下標(biāo)2,例如:a12表示數(shù)組a的第2行3列的元素。3.3.5 3.3.5 二維數(shù)組與多維數(shù)組二維數(shù)組與多維數(shù)組l二維數(shù)組初始化二維數(shù)組可以看作元素是一維數(shù)組的數(shù)組,即其

38、每一個(gè)元素是一個(gè)一維數(shù)組,二維數(shù)組初始化的方法有:n給所有元素賦初值。給數(shù)組的所有元素賦初值的方法有兩種,方法一:0行初值, 1行初值, , m行初值即每行一個(gè)花括號(hào),花括號(hào)間用逗號(hào)分隔,全部初值再用一個(gè)花括號(hào),例如:int a34 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ;3.3.5 3.3.5 二維數(shù)組與多維數(shù)組二維數(shù)組與多維數(shù)組方法二:0行初值, 1行初值, , m行初值所有初值放在一個(gè)花括號(hào)中,按數(shù)組排列的順序給各元素賦初值,例如:int a34 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12;注意:若對(duì)所有元素都

39、賦初值,則定義數(shù)組時(shí)行數(shù)可不指定,而列數(shù)必須指定,例如:int a 4 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ;或:int a 4 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12;3.3.5 3.3.5 二維數(shù)組與多維數(shù)組二維數(shù)組與多維數(shù)組n部分元素賦初值0行部分初值, 1行部分初值, , m行部分初值 例如:int a34 = 1, 2, 5, 9, 10, 11 ;3.3.5 3.3.5 二維數(shù)組與多維數(shù)組二維數(shù)組與多維數(shù)組l二維數(shù)組的應(yīng)用【例 3.7】5個(gè)學(xué)生,3門課程,學(xué)號(hào)及成績(jī)?nèi)绫?-5所示,編程求每個(gè)學(xué)生的平

40、均成績(jī),并輸出每個(gè)學(xué)生的學(xué)號(hào)、3門課程成績(jī)和平均成績(jī)。 學(xué)生成績(jī)表學(xué)號(hào)數(shù)學(xué)英語(yǔ)C+程序設(shè)計(jì)平均成績(jī)100190808510027075801003657075100485506010058090703.3.5 3.3.5 二維數(shù)組與多維數(shù)組二維數(shù)組與多維數(shù)組#include using namespace std;int main( ) int A5;/ 存儲(chǔ)學(xué)號(hào)float S54; / 存儲(chǔ)5個(gè)學(xué)生3門課成績(jī)和平均成績(jī)int i, j;for (i = 0; i Ai;/ 輸入5個(gè)學(xué)生的學(xué)號(hào)for (j = 0; j Sij; / 輸入3門課成績(jī)for (i = 0; i 5; i+) /

41、計(jì)算每個(gè)學(xué)生的平均成績(jī)Si3 = (Si0 + Si1 + Si2) / 3;3.3.5 3.3.5 二維數(shù)組與多維數(shù)組二維數(shù)組與多維數(shù)組for (i = 0; i 5; i+) cout Ai ;/ 輸出學(xué)號(hào) / 輸出每個(gè)學(xué)生的3門課程成績(jī)和平均成績(jī) for (j = 0; j 4; j+) cout Sij ;cout endl;return 0;3.4 3.4 指針指針在C+中,將系統(tǒng)為變量、數(shù)組、函數(shù)等分配的內(nèi)存首地址稱為指針,C+支持通過指針操縱內(nèi)存單元,在程序中,用一個(gè)變量來存放指針,存放指針的變量稱為指針變量,在不引起混淆的時(shí)候,將指針變量簡(jiǎn)稱指針,將內(nèi)存首地址簡(jiǎn)稱為內(nèi)存地址或者

42、地址。3.4.1 3.4.1 指針的定義與初始化指針的定義與初始化1.指針的定義指針變量的定義(聲明)指明該變量所能指向的對(duì)象的數(shù)據(jù)類型,使用符號(hào) * 把一個(gè)標(biāo)識(shí)符聲明為指針:int *ip1, *ip2; / ip1和ip2定義為指向int類型對(duì)象的指針double *dp; / dp指向一個(gè)double類型對(duì)象的指針string *pstring; / pstring指向一個(gè)string類型對(duì)象的指針/pvec指向一個(gè)vector類型對(duì)象的指針vector*pvec; 3.4.1 3.4.1 指針的定義與初始化指針的定義與初始化在指針聲明時(shí),可用空格將數(shù)據(jù)類型、* 、指針名三者分隔開來,以

43、下的3種寫法等價(jià),都將pstr聲明為指向string類型對(duì)象的指針變量:string* pstr;string *pstr;string * pstr;可在同一行語(yǔ)句中聲明指針和同類型的變量,例如:/ dp2是double類型指針,dp是double類型變量double dp, *dp2; 在同一行語(yǔ)句中聲明多個(gè)指針,必須在每個(gè)變量標(biāo)識(shí)符前都加符號(hào)*,例如:string *ps1, *ps2; / ps1、ps2是string類型指針3.4.1 3.4.1 指針的定義與初始化指針的定義與初始化2.指針的初始化指針變量存放變量的內(nèi)存地址,為取得變量地址,C+提供了取地址運(yùn)算符&。指針定義

44、時(shí)初始化可以用“=”:類型名 指針變量 = &變量;類型名 指針變量 = 指針變量;類型名 指針變量 = 0; / 這里的0可以是0值常量表達(dá)式或者初始化列表:類型名 指針變量(&變量);類型名 指針變量(指針變量);類型名 指針變量(0);3.4.1 3.4.1 指針的定義與初始化指針的定義與初始化int ival;const int c_ival = 0;/ 用變量ival的地址,如:0 x22ff74初始化指針p1和p2int *p1 = &ival, *p2(&ival); / 用指針p1初始化指針p3,p2初始化p4int *p3 = p1, *p4(

45、p2); int *p5 = 0;/ 用0初始化p5,此處0可以是0值常量表達(dá)式/ 用編譯時(shí)可獲得0值的const常量c_val初始化p6int *p6(c_ival);3.4.1 3.4.1 指針的定義與初始化指針的定義與初始化3.關(guān)于初始化的幾點(diǎn)說明l數(shù)據(jù)類型匹配的對(duì)象的地址l同類型的另一個(gè)有效指針l另一對(duì)象的下一地址l0值常量表達(dá)式。指針使用前必須初始化或者賦值,若使用未初始化的指針,會(huì)將指針中存放的不確定值視為地址,操縱該內(nèi)存地址的數(shù)據(jù),會(huì)導(dǎo)致程序運(yùn)行時(shí)崩潰,對(duì)指針進(jìn)行初始化(或賦值)只能使用以下4種類型的值:3.4.2 3.4.2 void*指針指針 C+支持一種特殊的指針類型voi

46、d*,它可以保存任何類型對(duì)象的地址:double obj = 3.14;double *pd = &obj;void *pv = &obj;/ void*指針pv可以保存任何類型對(duì)象的地址pv = pd;/ pd也可以是任何類型的指針void*表明該指針與一地址值相關(guān),但不清楚存儲(chǔ)在此地址上的對(duì)象的類型,不允許直接使用void*指針操縱其所指向的對(duì)象。void*指針只支持幾種有限的操作:與另一個(gè)指針進(jìn)行比較,向函數(shù)傳遞void*指針或從函數(shù)返回void*指針,以及給另一個(gè)void*指針賦值。3.4.3 3.4.3 指針變量的運(yùn)算指針變量的運(yùn)算1.指針變量賦值運(yùn)算指針變量賦值運(yùn)算

47、就是將變量的地址賦給指針變量,形式如下:指針變量 = &變量;指針變量 = 指針變量;例如:int ival(30);int *p1, *p2, *p3; / 指針定義p1 = &ival; / 賦值p2 = p1; / 賦值3.4.3 3.4.3 指針變量的運(yùn)算指針變量的運(yùn)算2.指針的解引用運(yùn)算與取址運(yùn)算符&對(duì)應(yīng),C+提供指針運(yùn)算符 *(解引用運(yùn)算符),*運(yùn)算獲取指針?biāo)傅膶?duì)象。3.4.3 3.4.3 指針變量的運(yùn)算指針變量的運(yùn)算【例 3.8】指針的解引用運(yùn)算。#include #includeusing namespace std;int main( ) strin

48、g s(Hello World!); string *sp = &s; cout *sp endl; / 輸出:Hello World! *sp = goodbye;/ 字符串s 的內(nèi)容改成 goodbye string s2 (see you later.); sp = &s2;/ sp指向字符串s2 cout *sp endl; / 輸出:see you later. return 0;運(yùn)行結(jié)果:Hello World!see you later.3.4.3 3.4.3 指針變量的運(yùn)算指針變量的運(yùn)算3.指針與數(shù)組一個(gè)數(shù)組A在內(nèi)存占據(jù)一塊連續(xù)的內(nèi)存單元,數(shù)組名A就是這塊連續(xù)內(nèi)

49、存單元的首地址,數(shù)組元素根據(jù)元素的數(shù)據(jù)類型依次占據(jù)若干連續(xù)的內(nèi)存單元,設(shè)有數(shù)組A、以及相同數(shù)據(jù)類型的指針p,若將數(shù)組名A賦給指針p(p = A;),則p指向這個(gè)數(shù)組的首地址,同時(shí)p也指向這個(gè)數(shù)組的第1個(gè)元素A0的首地址,int A = 0, 2, 4, 6, 8;int *p = A;/ p指向A0,A = &A03.4.3 3.4.3 指針變量的運(yùn)算指針變量的運(yùn)算如果希望使指針指向數(shù)組中的某個(gè)元素,則可使用下標(biāo)運(yùn)算符定位該元素,然后用取地址運(yùn)算符&獲取其地址:p = &A3;/ p指向數(shù)組A中的第4個(gè)元素當(dāng)指針變量指向數(shù)組首地址或者數(shù)組中的某個(gè)元素后,C+支持通過指針

50、算術(shù)運(yùn)算存取數(shù)組中的任意元素。3.4.3 3.4.3 指針變量的運(yùn)算指針變量的運(yùn)算4.指針?biāo)阈g(shù)運(yùn)算指針的算術(shù)運(yùn)算包括指針的自加(+)、自減(-)、加整型數(shù)值n和減整型數(shù)值n操作,在指針上加上(或減去)一個(gè)整型數(shù)值n等價(jià)于獲得一個(gè)新指針,該新指針指向指針原來指向的元素之后(或之前)的第n個(gè)元素,如:int A = 0, 2, 4, 6, 8;int *p = A; / p指向A0,A = &A0int *p2 = p + 4;/ p2 指向A43.4.3 3.4.3 指針變量的運(yùn)算指針變量的運(yùn)算int *p4 = p + 5; / p加上數(shù)組長(zhǎng)度得數(shù)組A的超出末端指針數(shù)組的超出末端指針通

51、常用來當(dāng)作哨兵,和指向數(shù)組的其它指針比較,以判斷是否已經(jīng)處理完數(shù)組中的所有元素,或者作為指針?biāo)阈g(shù)運(yùn)算的操作數(shù)。對(duì)數(shù)組的超出末端進(jìn)行解引用操作,將導(dǎo)致程序崩潰。指針?biāo)阈g(shù)運(yùn)算必須保證計(jì)算出來的新指針指向同一個(gè)數(shù)組的元素,或指向該數(shù)組末端的下一單元,例如上面數(shù)組A只有5個(gè)元素,則在p上加10是錯(cuò)誤的:/ 錯(cuò)誤,指針超出了數(shù)組末端及數(shù)組末端的下一個(gè)單元int *p3 = p + 10;3.4.3 3.4.3 指針變量的運(yùn)算指針變量的運(yùn)算指針減法操作,必須保證兩個(gè)指針指向同一數(shù)組,或是同一個(gè)數(shù)組的超出末端指針:ptrdiff_t n = p2 - p; / 4l自加運(yùn)算格式:+;將指針指向下一個(gè)元素,即 = + sizeof()。3.4.3 3.4.3 指針變量的運(yùn)算指針變量的運(yùn)算【例 3.9】指針的算術(shù)運(yùn)算。#include using namespace std;int ma

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論