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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

3、s1; 缺省構造函數(shù),生成一個空字符串s1string s2(s1); 拷貝構造函數(shù),將s2初始化為s1的副本string s3(value); 將s3初始化為一個字符串字面值的副本string s4(n, c);將s4初始化為包含n個c字符的字符串3.1.3 3.1.3 string對象的輸入輸出對象的輸入輸出【例 3.1】string對象的輸入和輸出操作。#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對象的操作對象的操作對象成員包括該數(shù)據(jù)類型定義的成員函數(shù)和內部數(shù)據(jù)成員,要調用一個對象的成員函數(shù),或者引用一個對象的內部數(shù)據(jù)成員,通過“.”運算符,表示如下:對象名.數(shù)據(jù)成員或者對象名.成員函數(shù)名(參數(shù)表)前者引用的是數(shù)據(jù)成員,后者調用成員函數(shù),這里,“.”是一個運算符,功能是表示對象的成員。 表3-2 常用的string操作常用的常用的string操作操作s.size( )、s.length( )返回返回s中字符的個數(shù)中字符的個數(shù)s.emp

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

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

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

8、size( ),所獲取的大小是當前字符串最多能容納的字符數(shù),和機器本身的限制或者字符串所在位置連續(xù)內存的大小有關系,例如,在某臺PC上:cout s.max_size( ) endl; 輸出:4294967293;3.1.4 3.1.4 string對象的操作對象的操作l函數(shù)capacity( ),重新分配內存之前 string所能包含的最大字符數(shù),另一個相關的函數(shù)是reserve( ),reserve( )為string對象重新分配內存,重新分配的大小由其參數(shù)決定。3.1.4 3.1.4 string對象的操作對象的操作【例 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 長度是 s.size( ) endl;return 0;3.1.4 3.1.4 string對象的操作對象的操作2.string關系運算lstr1、str2比較,不失

10、一般性,假設str1.length() str2.length(),str2比str1長,如果str1與str2前面部分相同,則 str1小于str2。l如果str1和str2的字符不同,則比較第一個不匹配的字符。string類定義了常見的關系運算符(=、!=、=),關系運算符比較兩個string對象時采用大小寫敏感的字典序策略。3.1.4 3.1.4 string對象的操作對象的操作例如: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對象的操作對象的操作string類還支持比較成員函數(shù)compare( ),compare( )支持用索引值和長度定位子串來進行比較,返回一個整數(shù),如:string s(abcd);string s2(ab);pare(abcd);/ 將s(abcd)和abcd比較,相等,返回pare(dcba);/ 將s(abcd)和dcba比較,返回一個小于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對象的操作對象的操作string對象的賦值有兩種方式,一是使用操作符運算符=,如:string strTo, strFrom;strTo = strFrom;3.string對象的賦值3.1.4 3.1.4 string對象的操作對象的操作string s;string str (Hello);s.assign(str);s.assign(feeling);s.assign(str, 0, 3);/ 把H

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

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

15、.4 string對象的操作對象的操作5.string對象的字符元素存取string類型支持通過下標運算符 或者通過at( )函數(shù)訪問其中的字符元素,下標運算符 需要一個size_type類型的值,作為“下標”或“索引”,以標明要訪問字符的位置,string對象的下標從0開始,如果s是一個string對象且s不空,則s0就是字符串的第一個字符,s1就表示第二個字符,而ss.size( )-1則表示s的最后一個字符。 3.1.4 3.1.4 string對象的操作對象的操作【例 3.12】string對象的字符元素存取操作。#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 標準庫標準庫vector類型類型vector稱為容器,因為vector能夠像容器一樣存放各種數(shù)據(jù)類型的對象,不過,同一個vector中的所有對象都必須是相同數(shù)據(jù)類型,格式是將數(shù)據(jù)類型放在ve

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

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

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

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

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

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

23、就是“尾插”。/ 從標準輸入讀入單詞并存儲到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對象的操作對象的操作3.vector的下標操作vector支持通過下標運算符 或者通過at( )函數(shù)訪問元素,索引的數(shù)據(jù)類型是vector:size_type,下標從0開始,如果ivec是一個vector對象且ivec不空,則ivec0就是ivec的第一個字符,ivec1

24、表示第二個字符,ivecivec.size( )-1表示ivec的最后一個元素。 vector的at( )函數(shù)會檢查索引參數(shù)的范圍,如果索引無效,會拋出out_of_range異常。3.2.2 3.2.2 vector對象的操作對象的操作【例 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 , ; / 下標運算符 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;運行結果:0, 1, 2, 3, 4, 5, 6,0, 1, 4, 9, 16, 25, 3

26、6,3.2.2 3.2.2 vector對象的操作對象的操作下標只能索引已存在的元素,必須是已存在的元素才能用下標運算符進行索引,試圖索引不存在的元素將產生運行時錯誤,例如:vector ivec; / 空vectorcout ivec0; / 錯誤:ivec中尚沒有元素vector ivec2(10);/ ivec2包含10個元素/ 錯誤:索引越界,ivec元素的索引范圍:09cout ivec10; 4.下標操作不添加元素3.2.2 3.2.2 vector對象的操作對象的操作因為不能索引尚不存在的元素,所以,不能通過vector的下標賦值添加元素,如下:vector ivec; / 空v

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

28、vector中最后一個元素,如果vector為空,則相當于什么也沒做。 3.2.2 3.2.2 vector對象的操作對象的操作【例 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對象的操作對象的操作 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;運行結果: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ù)組程序設計中,在處理相互間有關聯(lián)的變量(如數(shù)列、矩陣等)時,通過數(shù)組把多個相同類型的變量

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

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

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

34、果沒有指定數(shù)組元素的初值,則數(shù)組元素的初始化規(guī)則如下:基本數(shù)據(jù)類型數(shù)組,如果在函數(shù)體外定義,則其元素均初始化為0,如果在函數(shù)體內定義,則其元素不初始化。int A5; / 基本數(shù)據(jù)類型數(shù)組float B10, C20;/ 遵循變量初始化規(guī)則3.3.3 3.3.3 字符數(shù)組字符數(shù)組字符數(shù)組是指數(shù)組元素是字符的一類數(shù)組,可以用來存放多個字符,也可用來存放字符串??梢杂靡唤M由花括號括起來、逗號隔開的字符字面值進行初始化,也可以用一個字符串字面值進行初始化。字符串字面值包含一個額外的空字符(0),標志字符串結束。當使用字符串字面值來初始化創(chuàng)建的新字符數(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)編譯時的錯誤:char ca45 = Hello ;/ 錯誤:數(shù)組ca4有6個元素3.3.4 3.3.4 數(shù)組元素的訪問數(shù)組元素的訪問與vector不同,一個數(shù)組不能用另外一個數(shù)組初始化,也不能將一個數(shù)組直接賦值給另一個數(shù)組:int ia = 0, 1, 2, 3;int ia24;int ia4(ia);/ 錯誤:數(shù)組不能用另外一個數(shù)組初始化ia2 =

36、ia;/ 錯誤:不能將數(shù)組賦值給另外一個數(shù)組數(shù)組元素用下標運算符 來訪問,數(shù)組元素也是從0開始計數(shù)。3.3.4 3.3.4 數(shù)組元素的訪問數(shù)組元素的訪問【例 3.6】數(shù)組元素的復制與輸出。#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),對數(shù)組元素逐個復制for(size_t index = 0; index 5; index+) / 通過循環(huán),對數(shù)組元素逐個輸出 cout ia2index “, ”

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

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

39、賦初值,則定義數(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ù)組的應用【例 3.7】5個學生,3門課程,學號及成績如表3-5所示,編程求每個學生的平

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

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

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

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

44、時初始化可以用“=”:類型名 指針變量 = &變量;類型名 指針變量 = 指針變量;類型名 指針變量 = 0; / 這里的0可以是0值常量表達式或者初始化列表:類型名 指針變量(&變量);類型名 指針變量(指針變量);類型名 指針變量(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值常量表達式/ 用編譯時可獲得0值的const常量c_val初始化p6int *p6(c_ival);3.4.1 3.4.1 指針的定義與初始化指針的定義與初始化3.關于初始化的幾點說明l數(shù)據(jù)類型匹配的對象的地址l同類型的另一個有效指針l另一對象的下一地址l0值常量表達式。指針使用前必須初始化或者賦值,若使用未初始化的指針,會將指針中存放的不確定值視為地址,操縱該內存地址的數(shù)據(jù),會導致程序運行時崩潰,對指針進行初始化(或賦值)只能使用以下4種類型的值:3.4.2 3.4.2 void*指針指針 C+支持一種特殊的指針類型voi

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

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

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

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

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

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論