string、vector、数组和指针课件_第1页
string、vector、数组和指针课件_第2页
string、vector、数组和指针课件_第3页
string、vector、数组和指针课件_第4页
string、vector、数组和指针课件_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

string、vector、數組和指針3.1標準庫string類型3.1.1對象與變數一般情況下,為了與內置類型變數相區別,稱複雜數據類型的變數為對象(object),或稱某某數據類型對象。廣義講,常量、變數都稱為對象,狹義講,對象僅指複雜數據類型的變數,在本書中,沿用對象廣義概念,類變數稱為對象,基本數據類型的變數稱為對象,常量也稱為對象。

3.1.2string對象的定義和初始化為了在程式中使用string類型,必須包含string頭檔,並導入名字空間,如下:#include<string>usingstd::string;標準庫string是類類型,類類型對象通過構造函數初始化,構造函數是一個特殊的類成員函數,在類對象初始化的時候執行。3.1.2string對象的定義和初始化表3-1string的幾個常用構造函數string的幾個常用構造函數strings1;缺省構造函數,生成一個空字元串s1strings2(s1);拷貝構造函數,將s2初始化為s1的副本strings3("value");將s3初始化為一個字串字面值的副本strings4(n,'c');將s4初始化為包含n個'c'字元的字串3.1.3string對象的輸入輸出【例3.1】string對象的輸入和輸出操作。#include<iostream>#include<string>usingnamespacestd;//usingstd::string;intmain(){strings1,s2;//定義s1、s2,並初始化s1、s2為空字元串

//依次讀取字串一賦給s1,字串二賦給s2cin>>s1>>s2; cout<<s1<<s2<<endl; //輸出s1和s2return0;}3.1.4string對象的操作對象成員包括該數據類型定義的成員函數和內部數據成員,要調用一個對象的成員函數,或者引用一個對象的內部數據成員,通過“.”運算符,表示如下:對象名.數據成員或者對象名.成員函數名(參數表)前者引用的是數據成員,後者調用成員函數,這裏,“.”是一個運算符,功能是表示對象的成員。表3-2常用的string操作常用的string操作s.size()、s.length()返回s中字元的個數s.empty()如果s為空串,則返回true,否則返回falses.max_size()返回字元的可能最大個數s.capacity()返回重新分配之前的字元容量s.reserve()保留一定量記憶體以容納一定數量的字元==、!=、<、<=、>、>=、pare()按字典序比較字串=、s.assign()字串賦值s.erase()清空字元串s1+s2把s1和s2連接成一個新字串,返回新生成的字串+=、s.append()在尾部添加字元s[n]、s.at(n)存取s中位置為n的字元,位置從0開始計數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()將內容以字元數組形式返回s.begin()、s.end()提供類似STL的迭代器支持s.rbegin()、s.rend()逆向迭代器s.get_allocator()返回配置器…………3.1.4string對象的操作1.string的大小和容量函數一個C++字串存在3種大小,相應的函數分別是:函數size()和length()等價,都返回string對象中字元個數。函數empty()判斷字串是否為空,判斷字串是否空也可以利用函數size()或者length(),將長度與0比較;函數max_size(),所獲取的大小是當前字串最多能容納的字元數,和機器本身的限制或者字串所在位置連續記憶體的大小有關系,例如,在某臺PC上:cout<<s.max_size()<<endl;輸出:4294967293;3.1.4string對象的操作函數capacity(),重新分配記憶體之前string所能包含的最大字符數,另一個相關的函數是reserve(),reserve()為string對象重新分配記憶體,重新分配的大小由其參數決定。3.1.4string對象的操作【例3.2】string的大小和容量函數的使用。#include<iostream>#include<string>usingnamespacestd;intmain(){ strings("HelloWorld!"); //s初始化為"HelloWorld!" 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; return0;}3.1.4string對象的操作2.string關係運算str1、str2比較,不失一般性,假設str1.length()<str2.length(),str2比str1長,如果str1與str2前面部分相同,則str1小於str2。如果str1和str2的字元不同,則比較第一個不匹配的字元。string類定義了常見的關係運算符(==、!=、<、<=、>、>=),關係運算符比較兩個string對象時採用大小寫敏感的字典序策略。3.1.4string對象的操作例如:stringsubStr="Hello"; stringphrase="HelloWorld";stringstr="Hi";如果兩兩比較,則subStr小於phrase,str大於subStr,str大於phrase。

3.1.4string對象的操作string類還支持比較成員函數compare(),compare()支持用索引值和長度定位子串來進行比較,返回一個整數,如:strings("abcd");strings2("ab");pare("abcd"); //將s("abcd")和"abcd"比較,相等,返回0pare("dcba"); //將s("abcd")和"dcba"比較,返回一個小於0的值pare(s2);

//將s("abcd")和s2("ab")比較,返回大於0的值pare(s);

//相等,返回0//將s(“abcd”)中“ab”和s(“abcd”)中“cd”比較,返回值小於0S.compare(0,2,s,2,2);//將s(“abcd”)中的“bc”和“bcx”中的”bc”比較,返回0S.compare(1,2,”bcx”,2);3.1.4string對象的操作string對象的賦值有兩種方式,一是使用操作符運算符=,如:stringstrTo,strFrom;strTo=strFrom;3.string對象的賦值3.1.4string對象的操作strings;stringstr("Hello");s.assign(str); s.assign("feeling");s.assign(str,0,3); //把"Hel"賦給s,索引從0開始//把str從索引2到結尾賦給s,即把"llo"賦給ss.assign(str,2,string::npos); s.assign(5,'t');二是使用成員函數assign(),assign()支持靈活的字串賦值。3.1.4string對象的操作4.string對象相加相加指字串連接,支持string對象和string對象、string對象與constchar*對象、string對象與char對象,可以通過使用加運算符(+)或複合賦值運算符(+=)連接,結果生成一個新的string對象,例如strings1("Hello");strings2("World\n");下麵通過加法生成新的string對象:strings3=s1+s2;//s3是:HelloWorld\n string+string//s4是:HelloKitty string+字串字面值strings4=s1+"Kitty"; 3.1.4string對象的操作如果要把s2直接追加到s1末尾,可以使用+=運算符:s1+=s2; //相當於s1=s1+s2string加法返回的是string對象,和流輸入輸出(>>、<<)返回流對象類似,可以串接使用,如下:strings1,s2;cin>>s1>>s2;s1=s1+","+s2;cout<<s1<<","<<s2<<endl;3.1.4string對象的操作5.string對象的字元元素存取string類型支持通過下標運算符[]或者通過at()函數訪問其中的字元元素,下標運算符[]需要一個size_type類型的值,作為“下標”或“索引”,以標明要訪問字元的位置,string對象的下標從0開始,如果s是一個string對象且s不空,則s[0]就是字串的第一個字元,s[1]就表示第二個字元,而s[s.size()-1]則表示s的最後一個字元。3.1.4string對象的操作【例3.12】string對象的字元元素存取操作。#include<iostream>#include<string>usingnamespacestd;intmain(){strings("somestring");for(string::size_typeix=0;ix!=s.size();++ix){ cout<<s[ix]<<endl; }for(string::size_typeindex=0;index!=s.size();++index){ cout<<s.at(index)<<endl; }

return0;}3.2標準庫vector類型vector稱為容器,因為vector能夠像容器一樣存放各種數據類型的對象,不過,同一個vector中的所有對象都必須是相同數據類型,格式是將數據類型放在vector後面的尖括弧中,例如:vector<int>ivec; //ivec可存取int類型的元素vector<string>svec; //svec可存取string類型元素3.2.1vector對象的定義和初始化為了在程式中使用vector類型,必須包含vector頭檔,並導入名字空間,如下:#include<vector>usingstd::vector;vector<int>ivec;如果不導入名字空間,則需要通過域限定符::引用vector:std::vector<int>ivec;3.2.1vector對象的定義和初始化vector的幾個常用構造函數vector<T>v1;創建一個空的vector,此vector保存類型為T的對象vector<T>v2(v1);v2是v1的一個副本vector<T>v3(n,i);用元素個數和元素值初始化vector對象,v3包含n個值為i的元素vector<T>v4(n);創建一個vector,含有n個元素,元素按缺省值初始化vector<T>v(beg,end);創建一個下標上下界為[beg,end)半閉半開區間的vector表3-3vector類型的幾個常用構造函數3.2.1vector對象的定義和初始化vector<T>v1創建一個T類型的空的vector對象。vector<T>v2(v1)用vector對象v1初始化對象v2時,v2中每一個元素都初始化為v1中相應元素的副本,v1和v2必須同元素類型。vector<int>ivec1;

//ivec1可存放int類型的元素vector<int>ivec2(ivec1);

//通過從ivec1複製元素來創建ivec2vector<string>svec(ivec1);

//錯誤:svec的元素類型是string3.2.1vector對象的定義和初始化vector<T>v3(n,i)用元素個數和元素值初始化vector對象。vector<int>ivec4(10,-1);創建一個包含10個int類型數據的vector,每個元素都初始化為-1;vector<string>svec(10,"hi!");創建一個包含10個string類型數據的vector,每個元素都初始化為"hi!"。3.2.1vector對象的定義和初始化vector<T>v4(n)創建一個包含n個T類型數據的vector對象,vector中元素的初始化,取決於vector中存儲的元素的數據類型,如果vector保存基本數據類型的元素(如int、float),則用0初始化每個元素。vector<float>fvec(10); //10個元素,初始化為0如果vector保存的是含有構造函數的類類型的元素(string),則用該類型的缺省構造函數初始化每個元素:vector<string>svec(10);//10個元素,初始化為空字元串3.2.2vector對象的操作表3-4常用的vector操作常用的vector操作v.empty()如果v為空,則返回true,否則返回falsev.size()返回v中實際元素的個數v.push_back(elem)在v的末尾增加一個值為elem的元素v[index]、v.at(index)返回v中索引為index的元素v.begin()、v.end()指向迭代器中的第一個和最後一個數據地址v.erase(pos)刪除pos位置的數據,傳回下一個數據的位置v.erase(beg,end)刪除[beg,end)區間的數據,傳回下一個數據的位置v.pop_back()刪除最後一個數據…………3.2.2vector對象的操作vector的大小和容量函數vector的empty()和size()函數與string類似,size()返回vector相應的size_type類型,注意,使用size_type類型時,必須同時包含vector的元素類型:vector::size_type //錯誤vector<int>::size_type //正確2.向vector中添加元素3.2.2vector對象的操作push_back()函數將一個新元素添加到vector對象的後面,也就是“尾插”。//從標準輸入讀入單詞並存儲到vector中#include<vector>usingstd::vector;stringword;vector<string>svec; //空vectorfor(inti=0;i<10;i++){ cin>>word; svec.push_back(word); //word尾插到svec中}3.2.2vector對象的操作3.vector的下標操作vector支持通過下標運算符[]或者通過at()函數訪問元素,索引的數據類型是vector<T>::size_type,下標從0開始,如果ivec是一個vector<int>對象且ivec不空,則ivec[0]就是ivec的第一個字元,ivec[1]表示第二個字元,ivec[ivec.size()-1]表示ivec的最後一個元素。vector的at()函數會檢查索引參數的範圍,如果索引無效,會拋出out_of_range異常。3.2.2vector對象的操作【例3.4】vector的操作示例一。#include<iostream>#include<vector>usingnamespacestd;intmain(){ vector<int>ivec;//空vector//索引數據類型是vector<T>::size_type,這裏是vector<int>::size_type for(vector<int>::size_typeindex=0;index<7;++index){ ivec.push_back(index); //尾插

} for(vector<int>::size_typeidx=0;idx!=ivec.size();++idx){ cout<<ivec[idx]<<",";//下標運算符[] } cout<<endl; for(vector<int>::size_typeix=0;ix!=ivec.size();++ix){ ivec.at(ix)=ix*ix; cout<<ivec.at(ix)<<",";//at()函數

} cout<<endl;

return0;}運行結果:0,1,2,3,4,5,6,0,1,4,9,16,25,36,3.2.2vector對象的操作下標只能索引已存在的元素,必須是已存在的元素才能用下標運算符進行索引,試圖索引不存在的元素將產生運行時錯誤,例如:vector<int>ivec; //空vectorcout<<ivec[0]; //錯誤:ivec中尚沒有元素vector<int>ivec2(10); //ivec2包含10個元素//錯誤:索引越界,ivec元素的索引範圍:0…9cout<<ivec[10];4.下標操作不添加元素3.2.2vector對象的操作因為不能索引尚不存在的元素,所以,不能通過vector的下標賦值添加元素,如下:vector<int>ivec; //空vectorfor(vector<int>::size_typeix=0;ix!=10;++ix)ivec[ix]=ix+3; //應用程式錯誤ivec是空的vector對象,添加元素正確寫法應該是:vector<int>ivec; //空vectorfor(vector<int>::size_typeix=0;ix!=10;++ix)ivec.push_back(ix+3); //尾插3.2.2vector對象的操作5.刪除vector中的元素vector提供了erase()、pop_back()刪除vector中的元素,pop_back()功能是刪除vector中最後一個元素,如果vector為空,則相當於什麼也沒做。3.2.2vector對象的操作【例3.14】vector的操作示例二。#include<iostream>#include<vector>usingnamespacestd;intmain(){ vector<int>ivec; vector<int>::size_typeix; for(ix=0;ix!=10;++ix) ivec.push_back(ix+1); //填充ivec for(ix=0;ix!=ivec.size();++ix) cout<<ivec.at(ix)<<","; //輸出ivec cout<<endl; ivec.pop_back(); //ivec.pop_back()3.2.2vector對象的操作for(ix=0;ix!=ivec.size();++ix) cout<<ivec.at(ix)<<","; cout<<endl; vector<int>::iteratorbeg=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<int>::iteratorend=ivec.end(); ivec.erase(beg+3,end-2); //erase(beg,end) for(ix=0;ix!=ivec.size();++ix) cout<<ivec.at(ix)<<","; cout<<endl;

return0;}運行結果: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.1數組的定義數組定義的一般形式為:類型說明符數組名[常量運算式],…;類型說明符可以是除引用類型外的任意數據類型,數組名是識別字,方括號中的常量運算式是數組元素個數,稱為數組的長度,例如:intA[5]; //定義int類型數組A,有5個元素//定義float類型數組B和C,長度分別為10和20floatB[10],C[20];

charch[20];//定義char類型數組ch,有20個元素3.3.1數組的定義不能用變數定義元素的個數,數組要求在定義時有確定的數據類型和長度,以便分配存儲空間,例如:#defineFD5intmain(){ intA[3+2],B[7+FD]; …}是合法的,下述數組定義是錯誤的:intmain(){ intn=5; intA[n];//錯誤:定義時,數組長度不可以是變數

…}3.3.2數組的初始化數組的初始化是在定義數組的同時,為其元素提供一組用逗號分隔的初值,初值用花括弧{}括起來,稱為初始化列表。constunsignedarray_size=5;intia[array_size]={0,1,2,3,4};初始化賦值的一般形式為:類型說明符數組名[常量運算式]={值,值,…值}當{}中值的個數少於元素個數時,只給前面部分元素賦值,例如:inta[10]={0,1,2,3,4};3.3.2數組的初始化另外,只能給元素逐個提供初值,例如:給5個元素全部賦初值1,只能寫為:inta[5]={1,1,1,1,1};而不能寫為:inta[5]=1;給全部元素賦值,則在數組定義中,可以不給出數組元素的個數,例如:inta[5]={1,2,3,4,5};可寫為:inta[]={1,2,3,4,5}; //編譯器自動確定數組長度5因為顯式初始化,編譯器會根據列出的元素個數確定數組長度。3.3.2數組的初始化在數組定義時,如果沒有指定數組元素的初值,則數組元素的初始化規則如下:基本數據類型數組,如果在函數體外定義,則其元素均初始化為0,如果在函數體內定義,則其元素不初始化。intA[5]; //基本數據類型數組floatB[10],C[20]; //遵循變數初始化規則3.3.3字元數組字元數組是指數組元素是字元的一類數組,可以用來存放多個字元,也可用來存放字串。可以用一組由花括弧括起來、逗號隔開的字元字面值進行初始化,也可以用一個字串字面值進行初始化。字串字面值包含一個額外的空字元(‘\0’),標誌字串結束。當使用字串字面值來初始化創建的新字元數組時,將在新數組中加入空字元。charca1[]={‘C’,‘+’,‘+’};//未追加空字元charca2[]={'C','+','+','\0'};//顯式追加空字元'\0'//用字符串字面值初始化的數組,其末位包含'\0'charca3[]="C++";3.3.3字元數組例如,下麵的初始化式將出現編譯時的錯誤:charca4[5]="Hello"; //錯誤:數組ca4有6個元素3.3.4數組元素的訪問與vector不同,一個數組不能用另外一個數組初始化,也不能將一個數組直接賦值給另一個數組:intia[]={0,1,2,3};intia2[4];intia4[](ia); //錯誤:數組不能用另外一個數組初始化ia2=ia; //錯誤:不能將數組賦值給另外一個數組數組元素用下標運算符[]來訪問,數組元素也是從0開始計數。3.3.4數組元素的訪問【例3.6】數組元素的複製與輸出。#include<iostream>usingnamespacestd;intmain(){ intia[]={0,1,2,3,4}; intia2[5]; for(size_tix=0;ix<5;ix++){ ia2[ix]=ia[ix];//通過迴圈,對數組元素逐個複製

} for(size_tindex=0;index<5;index++){//通過迴圈,對數組元素逐個輸出

cout<<ia2[index]<<“,”;

} cout<<endl; return0;}運行結果:0,1,2,3,4,3.3.5二維數組與多維數組C++語言支持多維數組,多維數組的元素有多個下標。

二維數組的定義二維數組是一個m行n列矩陣,二維數組定義的一般形式是:類型說明符數組名[<m>][<n>],…;其中:m、n是常量運算式,m為數組行數,n為數組列數,分別是數組第1維和第2維的長度,例如inta[3][4];二維數組元素的訪問形式為:數組名[下標1][下標2],例如:a[1][2]表示數組a的第2行3列的元素。3.3.5二維數組與多維數組二維數組初始化二維數組可以看作元素是一維數組的數組,即其每一個元素是一個一維數組,二維數組初始化的方法有:給所有元素賦初值。給數組的所有元素賦初值的方法有兩種,方法一:{{0行初值},{1行初值},…,{m行初值}}即每行一個花括弧,花括弧間用逗號分隔,全部初值再用一個花括弧,例如:inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};3.3.5二維數組與多維數組方法二:{0行初值,1行初值,…,m行初值}所有初值放在一個花括弧中,按數組排列的順序給各元素賦初值,例如:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};注意:若對所有元素都賦初值,則定義數組時行數可不指定,而列數必須指定,例如:inta[][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};或:inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};3.3.5二維數組與多維數組部分元素賦初值{{0行部分初值},{1行部分初值},…,{m行部分初值}}例如:inta[3][4]={{1,2},{5},{9,10,11}};3.3.5二維數組與多維數組二維數組的應用【例3.7】5個學生,3門課程,學號及成績如表3-5所示,編程求每個學生的平均成績,並輸出每個學生的學號、3門課程成績和平均成績。學生成績表學號數學英語C++程式設計平均成績100190808510027075801003657075100485506010058090703.3.5二維數組與多維數組#include<iostream>usingnamespacestd;intmain(){ intA[5]; //存儲學號

floatS[5][4];//

存儲5個學生3門課成績和平均成績

inti,j; for(i=0;i<5;i++){ cin>>A[i]; //輸入5個學生的學號

for(j=0;j<3;j++) cin>>S[i][j]; //輸入3門課成績

} for(i=0;i<5;i++){//計算每個學生的平均成績

S[i][3]=(S[i][0]+S[i][1]+S[i][2])/3; }

3.3.5二維數組與多維數組for(i=0;i<5;i++){ cout<<A[i]<<""; //輸出學號//輸出每個學生的3門課程成績和平均成績

for(j=0;j<4;j++)

cout<<S[i][j]<<""; cout<<endl; }return0;}3.4指針在C++中,將系統為變數、數組、函數等分配的記憶體首地址稱為指針,C++支持通過指針操縱記憶體單元,在程式中,用一個變數來存放指針,存放指針的變數稱為指針變數,在不引起混淆的時候,將指針變數簡稱指針,將記憶體首地址簡稱為記憶體地址或者地址。3.4.1指針的定義與初始化1.指針的定義指針變數的定義(聲明)指明該變數所能指向的對象的數據類型,使用符號*把一個識別字聲明為指針:int*ip1,*ip2;//ip1和ip2定義為指向int類型對象的指針double*dp; //dp指向一個double類型對象的指針string *pstring;//pstring指向一個string類型對象的指針//pvec指向一個vector<int>類型對象的指針vector<int> *pvec;3.4.1指針的定義與初始化在指針聲明時,可用空格將數據類型、*、指針名三者分隔開來,以下的3種寫法等價,都將pstr聲明為指向string類型對象的指針變數:string*pstr;string*pstr;string*pstr;可在同一行語句中聲明指針和同類型的變數,例如://dp2是double類型指針,dp是double類型變數doubledp,*dp2;在同一行語句中聲明多個指針,必須在每個變數識別字前都加符號*,例如:string*ps1,*ps2; //ps1、ps2是string類型指針3.4.1指針的定義與初始化2.指針的初始化指針變數存放變數的記憶體地址,為取得變數地址,C++提供了取地址運算符&。指針定義時初始化可以用“=”:類型名指針變數=&變數;類型名指針變數=指針變數;類型名指針變數=0;//這裏的0可以是0值常量運算式或者初始化列表:類型名指針變數(&變數);類型名指針變數(指針變數);類型名指針變數(0);3.4.1指針的定義與初始化intival;constintc_ival=0;//用變數ival的地址,如:0x22ff74初始化指針p1和p2int*p1=&ival,*p2(&ival);//用指針p1初始化指針p3,p2初始化p4int*p3=p1,*p4(p2);

int*p5=0;//用0初始化p5,此處0可以是0值常量運算式//用編譯時可獲得0值的const常量c_val初始化p6int*p6(c_ival);3.4.1指針的定義與初始化3.關於初始化的幾點說明數據類型匹配的對象的地址同類型的另一個有效指針另一對象的下一地址0值常量運算式。指針使用前必須初始化或者賦值,若使用未初始化的指針,會將指針中存放的不確定值視為地址,操縱該記憶體地址的數據,會導致程式運行時崩潰,對指針進行初始化(或賦值)只能使用以下4種類型的值:3.4.2void*指針C++支持一種特殊的指針類型void*,它可以保存任何類型對象的地址:doubleobj=3.14;double*pd=&obj;void*pv=&obj; //void*指針pv可以保存任何類型對象的地址pv=pd; //pd也可以是任何類型的指針void*表明該指針與一地址值相關,但不清楚存儲在此地址上的對象的類型,不允許直接使用void*指針操縱其所指向的對象。void*指針只支持幾種有限的操作:與另一個指針進行比較,向函數傳遞void*指針或從函數返回void*指針,以及給另一個void*指針賦值。3.4.3指針變數的運算1.指針變數賦值運算指針變數賦值運算就是將變數的地址賦給指針變數,形式如下:指針變數=&變數;指針變數=指針變數;例如:intival(30);int*p1,*p2,*p3;//指針定義p1=&ival;//賦值p2=p1;//賦值3.4.3指針變數的運算2.指針的解引用運算與取址運算符&對應,C++提供指針運算符*(解引用運算符),*運算獲取指針所指的對象。3.4.3指針變數的運算【例3.8】指針的解引用運算。#include<iostream>#include<string>usingnamespacestd;intmain(){strings("HelloWorld!");string*sp=&s;cout<<*sp<<endl; //輸出:HelloWorld!*sp="goodbye";//字串s的內容改成goodbyestrings2("seeyoulater.");sp=&s2; //sp指向字串s2cout<<*sp<<endl; //輸出:seeyoulater.

return0;}運行結果:HelloWorld!seeyoulater.3.4.3指針變數的運算3.指針與數組一個數組A在內存佔據一塊連續的記憶體單元,數組名A就是這塊連續記憶體單元的首地址,數組元素根據元素的數據類型依次佔據若干連續的記憶體單元,設有數組A、以及相同數據類型的指針p,若將數組名A賦給指針p(p=A;),則p指向這個數組的首地址,同時p也指向這個數組的第1個元素A[0]的首地址,intA[]={0,2,4,6,8};int*p=A; //p指向A[0],A=&A[0]3.4.3指針變數的運算如果希望使指針指向數組中的某個元素,則可使用下標運算符定位該元素,然後用取地址運算符&獲取其地址:p=&A[3]; //p指向數組A中的第4個元素當指針變數指向數組首地址或者數組中的某個元素後,C++支持通過指針算術運算存取數組中的任意元素。3.4.3指針變數的運算4.指針算術運算指針的算術運算包括指針的自加(++)、自減(--)、加整型數值n和減整型數值n操作,在指針上加上(或減去)一個整型數值n等價於獲得一個新指針,該新指針指向指針原來指向的元素之後(或之前)的第n個元素,如:intA[]={0,2,4,6,8};int*p=A; //p指向A[0],A=&A[0]int*p2=p+4; //p2指向A[4]3.4.3指針變數的運算int*p4=p+5;//p加上數組長度得數組A的超出末端指針數組的超出末端指針通常用來當作哨兵,和指向數組的其他指針比較,以判斷是否已經處理完數組中的所有元素,或者作為指針算術運算的運算元。對數組的超出末端進行解引用操作,將導致程式崩潰。指針算術運算必須保證計算出來的新指針指向同一個數組的元素,或指向該數組末端的下一單元,例如上面數組A只有5個元素,則在p上加10是錯誤的://錯誤,指針超出了數組末端及數組末端的下一個單元int*p3=p+10; 3.4.3指針變數的運算指針減法操作,必須保證兩個指針指向同一數組,或是同一個數組的超出末端指針:ptrdiff_tn=p2-p; //4自加運算格式:<指針變數>++;將指針指向下一個元素,即<指針變數>=<指針變數>+sizeof(<指針變數類型>)。3.4.3指針變數的運算【例3.9】指針的算術運算。#include<iostream>usingnamespacestd;intmain(){ doublea[]={3.0,8.2,5.5,9.3}; double*p=&a[0]; //p指向a[0]元素

cout<<p<<endl; p++; //p指向下一個元素,即a[1] cout<<p<<endl; cout<<"sizeof(double)="<<sizeof(double)<<endl;

return0;}輸出:001

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论