版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第六章數組指針與字符串信息學院陳晉音C++語言程序設計1第六章數組指針與字符串信息學院陳晉音C++語言程序本章主要內容數組指針動態(tài)存儲分配指針與數組指針與函數字符串2本章主要內容數組2數組的概念數組是具有一定順序關系的若干相同類型變量的集合體,組成數組的變量稱為該數組的元素。數組屬于構造類型。3數組的概念數組是具有一定順序關系的若干相同類型變量的集合體,一維數組的聲明與引用一維數組的聲明類型說明符數組名[常量表達式];
例如:inta[10];
表示a為整型數組,有10個元素:a[0]...a[9]引用必須先聲明,后使用。只能逐個引用數組元素,而不能一次引用整個數組
例如:a[0]=a[5]+a[7]-a[2*3]數組名的構成方法與一般變量名相同。4一維數組的聲明與引用一維數組的聲明引用數組名的構成方法與一般例6.1一維數組的聲明與引用#include<iostream>usingnamespacestd;intmain(){ intA[10],B[10]; inti; for(i=0;i<10;i++) {
A[i]=i*2-1;
B[10-i-1]=A[i]; }for(i=0;i<10;i++){ cout<<"A["<<i<<"]="<<A[i]; cout<<"B["<<i<<"]="<<B[i]<<endl; }}5例6.1一維數組的聲明與引用#include<iostr一維數組的存儲順序數組元素在內存中順次存放,它們的地址是連續(xù)的。例如:具有10個元素的數組a,在內存中的存放次序如下:數組名字是數組首元素的內存地址。數組名是一個常量,不能被賦值。a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a6一維數組的存儲順序數組元素在內存中順次存放,它們的地址是連續(xù)一維數組的初始化可以在編譯階段使數組得到初值:在聲明數組時對數組元素賦以初值。
例如:inta[10]={0,1,2,3,4,5,6,7,8,9};可以只給一部分元素賦初值。
例如:inta[10]={0,1,2,3,4};在對全部數組元素賦初值時,可以不指定數組長度。
例如:inta[]={1,2,3,4,5};7一維數組的初始化可以在編譯階段使數組得到初值:7#include<iostream>usingnamespacestd;intmain(){ inti; staticintf[20]={1,1};//初始化第0、1個數 for(i=2;i<20;i++)f[i]=f[i-2]+f[i-1];//求第2~19個數 for(i=0;i<20;i++)//輸出,每行5個數// { if(i%5==0)cout<<endl;
out.width(12);//設置輸出寬度為12 cout<<f[i]; }}例:用數組來處理求Fibonacci數列問題8#include<iostream>例:用數組來處理求Fib二維數組的聲明及引用數據類型標識符[常量表達式1][常量表達式2]…;例:inta[5][3];表示a為整型二維數組,其中第一維有5個下標(0~4),第二維有3個下標(0~2)9二維數組的聲明及引用數據類型標識符[常量表達式1][常量存儲順序按行存放,上例中數組a的存儲順序為:
二維數組的聲明類型說明符數組名[常量表達式][常量表達式]例如:floata[3][4];a00a01a02a03a10a11a12a13a20a21a22a23a[0]——a00a01a02a03a[1]——a10a11a12a13
a[2]——a20a21a22a23a可以理解為:引用例如:b[1][2]=a[2][3]/2
下標不要越界二維數組的聲明及引用10存儲順序二維數組的聲明a00a01a02a03a1將所有數據寫在一個{}內,按順序賦值例如:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};分行給二維數組賦初值例如:inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};可以對部分元素賦初值例如:inta[3][4]={{1},{0,6},{0,0,11}};二維數組的初始化11將所有數據寫在一個{}內,按順序賦值二維數組的初始化11數組作為函數參數數組元素作實參,與單個變量一樣。數組名作參數,形、實參數都應是數組名,類型要一樣,傳送的是數組首地址。對形參數組的改變會直接影響到實參數組。12數組作為函數參數數組元素作實參,與單個變量一樣。12例6-2使用數組名作為函數參數主函數中初始化一個矩陣并將每個元素都輸出,然后調用子函數,分別計算每一行的元素之和,將和直接存放在每行的第一個元素中,返回主函數之后輸出各行元素的和。13例6-2使用數組名作為函數參數主函數中初始化一個矩陣并將每#include<iostream>usingnamespacestd;voidRowSum(intA[][4],intnrow){ intsum; for(inti=0;i<nrow;i++) { sum=0;
for(intj=0;j<4;j++)
sum+=A[i][j]; cout<<"Sumofrow"<<i
<<"is"<<sum<<endl;A[i][0]=sum; }}1414#include<iostream>1414intmain(){ intTable[3][4]={{1,2,3,4},{2,3,4,5},{3,4,5,6}}; for(inti=0;i<3;i++) { for(intj=0;j<4;j++) cout<<Table[i][j]<<""; cout<<endl; } RowSum(Table,3);
for(inti=0;i<3;i++)
cout<<Table[i][0]}1515intmain()1515運行結果:123423453456Sumofrow0is10Sumofrow1is14Sumofrow2is181014181616運行結果:1616例6-5指針的聲明、賦值與使用#include<iostream>usingnamespacestd;intmain(){ int*i_pointer; //聲明int型指針i_pointer inti; //聲明int型數i i_pointer=&i; //取i的地址賦給i_pointer i=10; //int型數賦初值 cout<<"Outputinti="<<i<<endl; //輸出int型數的值 cout<<"Outputintpointeri="<<*i_pointer<<endl; //輸出int型指針所指地址的內容}程序運行的結果是:Outputinti=10Outputintpointeri=1017例6-5指針的聲明、賦值與使用#include<iost指向數組元素的指針聲明與賦值例:inta[10],*pa;pa=&a[0];或pa=a;通過指針引用數組元素經過上述聲明及賦值后:*pa就是a[0],*(pa+1)就是a[1],...,*(pa+i)就是a[i].a[i],*(pa+i),*(a+i),pa[i]都是等效的。a++;18指向數組元素的指針聲明與賦值a++;18例6-7(P174)設有一個int型數組a,有10個元素。用三種方法輸出各元素:使用數組名和下標使用數組名和指針運算使用指針變量19例6-7(P174)設有一個int型數組a,有10個元素。intmain(){inta[10];inti;for(i=0;i<10;i++)cin>>a[i];cout<<endl;for(i=0;i<10;i++)cout<<a[i];}使用數組名和下標2020使用數組名和下標2020intmain(){inta[10];inti;for(i=0;i<10;i++)cin>>a[i];cout<<endl;for(i=0;i<10;i++)cout<<*(a+i);}使用數組名指針運算21使用數組名指針運算21使用指針變量intmain(){inta[10];int*p,i;for(i=0;i<10;i++)cin>>a[i];cout<<endl;for(p=a;p<(a+10);p++)cout<<*p;}22使用指針變量22指針數組數組的元素是指針型例:Point*pa[2];//存放指針的數組
由pa[0],pa[1]兩個指針組成23指針數組數組的元素是指針型23例6-8利用指針數組存放單位矩陣(P176)#include<iostream>usingnamespacestd;intmain(){ intline1[]={1,0,0};//聲明數組,矩陣的第一行 intline2[]={0,1,0};//聲明數組,矩陣的第二行 intline3[]={0,0,1};//聲明數組,矩陣的第三行 int*p_line[3]; //聲明整型指針數組 p_line[0]=line1; //初始化指針數組元素 p_line[1]=line2; p_line[2]=line3;24例6-8利用指針數組存放單位矩陣(P176)#inclu //輸出單位矩陣cout<<"Matrixtest:"<<endl; for(inti=0;i<3;i++) //對指針數組元素循環(huán) { for(intj=0;j<3;j++) //對矩陣每一行循環(huán) {cout<<p_line[i][j]<<"";} cout<<endl; }}輸出結果為:Matrixtest:1,0,00,1,00,0,12525 //輸出單位矩陣輸出結果為:2525例6-9二維數組舉例#include<iostream>usingnamespacestd;intmain(){ intarray2[2][3]={{11,12,13},{21,22,23}};for(inti=0;i<2;i++){cout<<*(array2+i)<<endl; for(intj=0;j<3;j++){cout<<*(*(array2+i)+j)<<"";//或者cout<<array2[i][j]<<"";} cout<<endl; }}0X0065FDE011,12,130X0065FDEC21,22,2326例6-9二維數組舉例#include<iostream以指針作為函數參數以地址方式傳遞數據,可以用來返回函數處理結果。實參是數組名時形參可以是指針。27以指針作為函數參數以地址方式傳遞數據,可以用來返回函數處理結例6.10(P178)題目:讀入三個浮點數,將整數部分和小數部分分別輸出#include<iostream>usingnamespacestd;voidsplitfloat(floatx,int*intpart,float*fracpart){//形參intpart、fracpart是指針
*intpart=int(x);
//取x的整數部分
*fracpart=x-*intpart;
//取x的小數部分}28例6.10(P178)題目:讀入三個浮點數,將整數部分和小intmain(){ inti,n; floatx,f;
cout<<"Enterthree(3)floatingpointnumbers"<<endl; for(i=0;i<3;i++) { cin>>x; splitfloat(x,&n,&f);//變量地址做實參 cout<<"IntegerPartis"<<n
<<"FractionPartis"<<
f<<endl; }}2929intmain()2929運行結果:Enterthree(3)floatingpointnumbers4.7IntegerPartis4FractionPartis0.78.913IntegerPartis8FractionPartis0.913-4.7518IntegerPartis-4FractionPartis-0.75183030運行結果:3030例:輸出數組元素的內容和地址#include<iostream>#include<iomanip>usingnamespacestd;voidArray_Ptr(long*P,intn){ inti; cout<<"Infunc,addressofarrayis"
<<unsignedlong(P)<<endl; cout<<"Accessingarrayinthefunctionusingpointers"
<<endl; for(i=0;i<n;i++) { cout<<"Addressforindex"<<i<<"is"
<<unsignedlong(P+i); cout<<"Valueis"<<*(P+i)<<endl; }}31例:輸出數組元素的內容和地址#include<iostrintmain(){ longlist[5]={50,60,70,80,90};
cout<<"Inmain,addressofarrayis"<<unsignedlong(list)<<endl; cout<<endl;
Array_Ptr(list,5);}32intmain()32運行結果:Inmain,addressofarrayis6684132Infunc,addressofarrayis6684132AccessingarrayinthefunctionusingpointersAddressforindex0is6684132Valueis50Addressforindex1is6684136Valueis60Addressforindex2is6684140Valueis70Addressforindex3is6684144Valueis80Addressforindex4is6684148Valueis903333運行結果:3333指向常量的指針做形參#include<iostream>usingnamespacestd;constintN=6;voidprint(constint*p,intn);intmain(){intarray[N];for(inti=0;i<N;i++)cin>>array[i];print(array,N);}34指向常量的指針做形參#include<iostream>34voidprint(constint*p,intn){cout<<"{"<<*p;for(inti=1;i<n;i++)cout<<"."<<*(p+i);cout<<"}"<<endl;}3535voidprint(constint*p,intn指針型函數當函數的返回值是地址時,該函數就是指針形函數。聲明形式存儲類型數據類型*函數名()36指針型函數當函數的返回值是地址時,該函數就是指針形函數。36聲明形式存儲類型數據類型(*函數指針名)();
含義:數據指針指向數據存儲區(qū),而函數指針指向的是程序代碼存儲區(qū)。指向函數的指針37聲明形式指向函數的指針37例6-11函數指針#include<iostream>usingnamespacestd;voidprint_stuff(floatdata_to_ignore);voidprint_message(floatlist_this_data);voidprint_float(floatdata_to_print);void(*function_pointer)(float); intmain() { floatpi=(float)3.14159; floattwo_pi=(float)2.0*pi;38例6-11函數指針#include<iostream>38print_stuff(pi);
function_pointer=print_stuff;function_pointer(pi);function_pointer=print_message;function_pointer(two_pi);function_pointer(13.0);function_pointer=print_float;function_pointer(pi);print_float(pi);}3939print_stuff(pi);3939voidprint_stuff(floatdata_to_ignore){ cout<<"Thisistheprintstufffunction.\n";}voidprint_message(floatlist_this_data){ cout<<"Thedatatobelistedis"<<list_this_data<<endl;}voidprint_float(floatdata_to_print){ cout<<"Thedatatobeprintedis"<<data_to_print<<endl;}4040voidprint_stuff(floatdata_to運行結果:Thisistheprintstufffunction.Thisistheprintstufffunction.Thedatatobelistedis6.283180Thedatatobelistedis13.000000Thedatatobeprintedis3.141590Thedatatobeprintedis3.1415904141運行結果:4141對象數組(P163)聲明:類名數組名[元素個數];Personp[4];訪問方法:通過下標訪問數組名[下標].成員名
p[0].GetName();42對象數組(P163)聲明:42對象數組初始化數組中每一個元素對象被創(chuàng)建時,系統都會調用類構造函數初始化該對象。通過初始化列表賦值。例:
PointA[2]={Point(1,2),Point(3,4)};如果沒有為數組元素指定顯式初始值,數組元素便使用默認值初始化(調用默認構造函數)。43對象數組初始化數組中每一個元素對象被創(chuàng)建時,系統都會調用類構數組元素所屬類的構造函數不聲明構造函數,則采用默認構造函數。各元素對象的初值要求為相同的值時,可以聲明具有默認形參值的構造函數。各元素對象的初值要求為不同的值時,需要聲明帶形參的構造函數。當數組中每一個對象被刪除時,系統都要調用一次析構函數。44數組元素所屬類的構造函數不聲明構造函數,則采用默認構造函數。例6-3對象數組應用舉例//Point.h#if!defined(_POINT_H)#define_POINT_Hclass
Point{public:
Point();Point(intxx,intyy);~Point();voidMove(intx,inty);intGetX(){returnX;}intGetY(){returnY;}private:intX,Y;};#endif45例6-3對象數組應用舉例//Point.h45//6-2.cpp#include<iostream>usingnamespacestd;#include"Point.h"Point::Point(){X=Y=0;cout<<"DefaultConstructorcalled."<<endl;}Point::Point(intxx,intyy){X=xx;Y=yy;cout<<"Constructorcalled."<<endl;}Point::~Point(){cout<<"Destructorcalled."<<endl;}voidPoint::Move(intx,inty){X=x;Y=y;}4646//6-2.cpp4646#include<iostream>#include"Point.h"usingnamespacestd;intmain(){cout<<"Enteringmain..."<<endl;
PointA[2];for(inti=0;i<2;i++)
A[i].Move(i+10,i+20);cout<<"Exitingmain..."<<endl;
return0;}47Enteringmain...DefaultConstructorcalled.DefaultConstructorcalled.Exitingmain...Destructorcalled.Destructorcalled.47#include<iostream>47Enteringm對象指針的一般概念(P181)聲明形式類名*對象指針名;例PointA(5,10);Piont*ptr;ptr=&A;通過指針訪問對象成員對象指針名->成員名ptr->getx()相當于(*ptr).getx();48對象指針的一般概念(P181)聲明形式48對象指針應用舉例intmain(){PointA(5,10);
Point*ptr;ptr=&A; intx; x=ptr->GetX(); cout<<x<<endl;return0;}49對象指針應用舉例intmain()49this指針隱含于每一個類的成員函數中的特殊指針。明確地指出了成員函數當前所操作的數據所屬的對象。當通過一個對象調用成員函數時,系統先將該對象的地址賦給this指針,然后調用成員函數,成員函數對對象的數據成員進行操作時,就隱含使用了this指針。50this指針隱含于每一個類的成員函數中的特殊指針。50this指針例如:Point類的構造函數體中的語句:X=xx;Y=yy;相當于:this->X=xx;this->Y=yy;51this指針例如:Point類的構造函數體中的語句:51指向類的非靜態(tài)成員的指針通過指向成員的指針只能訪問公有成員聲明指向成員的指針聲明指向公有數據成員的指針類型說明符類名::*指針名; 聲明指向公有函數成員的指針類型說明符(類名::*指針名)(參數表);52指向類的非靜態(tài)成員的指針通過指向成員的指針只能訪問公有成員5指向類的非靜態(tài)成員的指針指向數據成員的指針說明指針應該指向哪個成員指針名=&類名::數據成員名;通過對象名(或對象指針)與成員指針結合來訪問數據成員對象名.*類成員指針名或:對象指針名—>*類成員指針名53指向類的非靜態(tài)成員的指針指向數據成員的指針53指向類的非靜態(tài)成員的指針指向函數成員的指針初始化指針名=類名::函數成員名;通過對象名(或對象指針)與成員指針結合來訪問函數成員(對象名.*類成員指針名)(參數表)或:(對象指針名—>*類成員指針名)(參數表)54指向類的非靜態(tài)成員的指針指向函數成員的指針54指向類的非靜態(tài)成員的指針例6-13訪問對象的公有成員函數的不同方式intmain() //主函數{ PointA(4,5); //聲明對象A Point*p1=&A; //聲明對象指針并初始化
int(Point::*p_GetX)()=Point::GetX;//聲明成員函數指針并初始化
cout<<(A.*p_GetX)()<<endl;//(1)使用成員函數指針訪問成員函數 cout<<(p1->GetX)()<<endl;//(2)使用對象指針訪問成員函數
cout<<A.GetX()<<endl;//(3)使用對象名訪問成員函數}55指向類的非靜態(tài)成員的指針例6-13訪問對象的公有成員函數指向類的靜態(tài)成員的指針對類的靜態(tài)成員的訪問不依賴于對象可以用普通的指針來指向和訪問靜態(tài)成員例6-14通過指針訪問類的靜態(tài)數據成員例6-15通過指針訪問類的靜態(tài)函數成員56指向類的靜態(tài)成員的指針對類的靜態(tài)成員的訪問不依賴于對象56例6-14通過指針訪問類的靜態(tài)數據成員#include<iostream>usingnamespacestd;classPoint //Point類聲明{public: //外部接口 Point(intxx=0,intyy=0){X=xx;Y=yy;countP++;}//構造函數 Point(Point&p); //拷貝構造函數 intGetX(){returnX;} intGetY(){returnY;}
staticintcountP; //靜態(tài)數據成員引用性說明private: //私有數據成員 intX,Y;};Point::Point(Point&p){ X=p.X;Y=p.Y;countP++;}intPoint::countP=0; //靜態(tài)數據成員定義性說明57例6-14通過指針訪問類的靜態(tài)數據成員#include<iintmain() //主函數{//聲明一個int型指針,指向類的靜態(tài)成員 int*count=&Point::countP; PointA(4,5); //聲明對象A cout<<"PointA,"<<A.GetX()<<","<<A.GetY();
//直接通過指針訪問靜態(tài)數據成員 cout<<"Objectid="<<*count<<endl; PointB(A); //聲明對象B cout<<"PointB,"<<B.GetX()<<","<<B.GetY();//直接通過指針訪問靜態(tài)數據成員 cout<<"Objectid="<<*count<<endl; }5858intmain() //主函數5858例6-15通過指針訪問類的靜態(tài)函數成員#include<iostream>usingnamespacestd;classPoint //Point類聲明{public: //外部接口 //其它函數略 staticvoidGetC()//靜態(tài)函數成員{cout<<"Objectid="<<countP<<endl;}private: //私有數據成員 intX,Y; staticintcountP; //靜態(tài)數據成員引用性說明};//函數實現略intPoint::countP=0; //靜態(tài)數據成員定義性說明59例6-15通過指針訪問類的靜態(tài)函數成員#include<iintmain() //主函數{//指向函數的指針,指向類的靜態(tài)成員函數 void(*gc)()=Point::GetC; PointA(4,5); //聲明對象A cout<<"PointA,"<<A.GetX()<<","<<A.GetY(); gc();//輸出對象序號,通過指針訪問靜態(tài)函數成員 PointB(A); //聲明對象B cout<<"PointB,"<<B.GetX()<<","<<B.GetY(); gc();//輸出對象序號,通過指針訪問靜態(tài)函數成員}6060intmain() //主函數6060動態(tài)申請內存操作符newnew類型名T(初值列表)功能:在程序執(zhí)行期間,申請用于存放T類型對象的內存空間,并依初值列表賦以初值。結果值:成功:T類型的指針,指向新分配的內存。失敗:0(NULL)61動態(tài)申請內存操作符newnew類型名T(初值列表)61釋放內存操作符deletedelete指針P功能:釋放指針P所指向的內存。P必須是new操作的返回值。62釋放內存操作符deletedelete指針P62例6-16動態(tài)創(chuàng)建對象舉例#include<iostream>usingnamespacestd;classPoint{public:Point(){X=Y=0;cout<<"DefaultConstructorcalled.\n";}Point(intxx,intyy){X=xx;Y=yy;cout<<"Constructorcalled.\n";}~Point(){cout<<"Destructorcalled.\n";}intGetX(){returnX;}intGetY(){returnY;} voidMove(intx,inty) {X=x;Y=y;}private:intX,Y;};63例6-16動態(tài)創(chuàng)建對象舉例#include<iostreaintmain(){cout<<"StepOne:"<<endl;Point*Ptr1=newPoint;deletePtr1;cout<<"StepTwo:"<<endl;Ptr1=newPoint(1,2);deletePtr1;return0;}運行結果:StepOne:DefaultConstructorcalled.Destructorcalled.StepTwo:Constructorcalled.Destructorcalled.6464intmain()運行結果:6464例6-17動態(tài)創(chuàng)建對象數組舉例#include<iostream>usingnamespacestd;classPoint{//類的聲明同例6-16,略};intmain(){Point*Ptr=newPoint[2];//創(chuàng)建對象數組Ptr[0].Move(5,10);//通過指針訪問數組元素的成員Ptr[1].Move(15,20);//通過指針訪問數組元素的成員cout<<"Deleting..."<<endl;delete[]Ptr;//刪除整個對象數組return0;}65例6-17動態(tài)創(chuàng)建對象數組舉例#include<iostre運行結果:DefaultConstructorcalled.DefaultConstructorcalled.Deleting...Destructorcalled.Destructorcalled.6666運行結果:6666例6-18動態(tài)數組類#include<iostream>usingnamespacestd;classPoint{//類的聲明同例6-16…};classArrayOfPoints{public:ArrayOfPoints(intn){numberOfPoints=n;points=newPoint[n];}~ArrayOfPoints(){cout<<"Deleting..."<<endl;numberOfPoints=0;delete[]points;}Point&Element(intn){returnpoints[n];}private:Point*points;intnumberOfPoints;};6767例6-18動態(tài)數組類#include<iostream>67intmain(){ intnumber; cout<<"Pleaseenterthenumberofpoints:"; cin>>number;//創(chuàng)建對象數組ArrayOfPointspoints(number);//通過指針訪問數組元素的成員points.Element(0).Move(5,10);//通過指針訪問數組元素的成員points.Element(1).Move(15,20);}6868intmain()6868運行結果如下:Pleaseenterthenumberofpoints:2DefaultConstructorcalled.DefaultConstructorcalled.Deleting...Destructorcalled.Destructorcalled.6969運行結果如下:6969動態(tài)創(chuàng)建多維數組new類型名T[下標表達式1][下標表達式2]…;如果內存申請成功,new運算返回一個指向新分配內存首地址的指針,是一個T類型的數組,數組元素的個數為除最左邊一維外各維下標表達式的乘積。例如:char(*fp)[3];fp=newchar[2][3];70動態(tài)創(chuàng)建多維數組new類型名T[下標表達式1][下標表達char(*fp)[3];fpfp+1fp[0][0]fp[0][1]fp[0][2]fp[1][0]fp[1][1]fp[1][2]7171char(*fp)[3];fpfp+1fp[0][0]fp例6-18動態(tài)創(chuàng)建多維數組#include<iostream>usingnamespacestd;intmain(){ float(*cp)[9][8]; inti,j,k; cp=newfloat[8][9][8]; for(i=0;i<8;i++) for(j=0;j<9;j++) for(k=0;k<9;k++) *(*(*(cp+i)+j)+k)=i*100+j*10+k;//通過指針訪問數組元素72例6-18動態(tài)創(chuàng)建多維數組#include<iostreamfor(i=0;i<8;i++) { for(j=0;j<9;j++) {for(k=0;k<8;k++) //將指針cp作為數組名使用,//通過數組名和下標訪問數組元素cout<<cp[i][j][k]<<""; cout<<endl; } cout<<endl; }}7373for(i=0;i<8;i++)7373用字符數組存儲和處理字符串字符數組的聲明和引用例:staticcharstr[8]={112,114,111,103,114,97,109,0};
staticcharstr[8]={'p','r','o','g','r','a','m','\0'};
staticcharstr[8]="program";
staticcharstr[]="program";字符串字符串常量,例如:"china"沒有字符串變量,用字符數組來存放字符串字符串以'\0'為結束標志字符數組的初始化74用字符數組存儲和處理字符串字符數組的聲明和引用例:stati例6-22輸出一個字符串#include<iostream>usingnamespacestd;intmain(){staticcharc[10]={'I','','a','m','','a','','b','o','y'};inti;for(i=0;i<10;i++) cout<<c[i];cout<<endl;}運行結果:Iamaboy75例6-22輸出一個字符串#include<iostream例6-23輸出一個鉆石圖形#include<iostream>usingnamespacestd;intmain(){staticchardiamond[][5]={{'','','*'},{'','*','','*'},{'*','','','','*'},{'','*','','*'},{'','','*'}}; inti,j; for(i=0;i<5;i++) {for(j=0;j<5&&diamond[i][j]!=0;j++) cout<<diamond[i][j]; cout<<endl; }}運行結果:
********
76例6-23輸出一個鉆石圖形#include<iostrea字符串的輸入/輸出方法逐個字符輸入輸出將整個字符串一次輸入或輸出
例:charc[]="China";
cout<<c;注意輸出字符不包括'\0'輸出字符串時,輸出項是字符數組名,輸出時遇到'\0'結束。輸入多個字符串時,以空格分隔;輸入單個字符串時其中不能有空格。77字符串的輸入/輸出方法77例如:程序中有下列語句:staticcharstr1[5],str2[5],str3[5];cin>>str1>>str2>>str3;運行時輸入數據:Howareyou?內存中變量狀態(tài)如下:str1:How\0str2:are\0str3:you?\07878例如:內存中變量狀態(tài)如下:7878若改為:staticcharstr[13];cin>>str;運行時輸入數據:Howareyou?內存中變量str內容如下:str:How\07979若改為:內存中變量str內容如下:7979用字符數組存儲和處理字符串注意!若有如下聲明:chara[4],*p1,*p2;錯誤的:
a="abc";
cin>>p1;正確的:
p1="abc";
p2=a;cin>>p2;80用字符數組存儲和處理字符串注意!若有如下聲明:80整行輸入字符串cin.getline(字符數組名St,字符個數N,結束符);功能:一次連續(xù)讀入多個字符(可以包括空格),直到讀滿N個,或遇到指定的結束符(默認為'\n')。讀入的字符串存放于字符數組St中。讀取但不存儲結束符。cin.get(字符數組名St,字符個數N,結束符);功能:一次連續(xù)讀入多個字符(可以包括空格),直到讀滿N個,或遇到指定的結束符(默認為'\n')。讀入的字符串存放于字符數組St中。
既不讀取也不存儲結束符。81整行輸入字符串cin.getline(字符數組名St,字符整行輸入字符串舉例#include<iostream>usingnamespacestd;voidmain(void){ charcity[80];
charstate[80]; inti; for(i=0;i<2;i++) {cin.getline(city,80,','); cin.getline(state,80,'\n'); cout<<"City:"<<city<<"State:"
<<state<<endl; }}82整行輸入字符串舉例#include<iostream>82運行結果Beijing,ChinaCity:BeijingCountry:ChinaShanghai,ChinaCity:ShanghaiCountry:China83運行結果Beijing,China83字符串處理函數strcat(連接),strcpy(復制),
strcmp(比較),strlen(求長度),
strlwr(轉換為小寫),
strupr(轉換為大寫)頭文件<cstring>84字符串處理函數strcat(連接),strcpy(復制),
例6.21string類應用舉例#include<string>#include<iostream>usingnamespacestd;voidtrueFalse(intx){cout<<(x?"True":"False")<<endl;}85例6.21string類應用舉例#include<strintmain(){stringS1="DEF",S2="123";charCP1[]="ABC";charCP2[]="DEF";cout<<"S1is"<<S1<<endl;cout<<"S2is"<<S2<<endl;cout<<"lengthofS2:"<<S2.length()<<endl;cout<<"CP1is"<<CP1<<endl;cout<<"CP2is"<<CP2<<endl;cout<<"S1<=CP1returned";
trueFalse(S1<=CP1);
cout<<"CP2<=S1returned";
trueFalse(CP2<=S1);
S2+=S1;cout<<"S2=S2+S1:"<<S2<<endl;cout<<"lengthofS2:"<<S2.length()<<endl;}8686intmain()8686本講完!8787第六章數組指針與字符串信息學院陳晉音C++語言程序設計88第六章數組指針與字符串信息學院陳晉音C++語言程序本章主要內容數組指針動態(tài)存儲分配指針與數組指針與函數字符串89本章主要內容數組2數組的概念數組是具有一定順序關系的若干相同類型變量的集合體,組成數組的變量稱為該數組的元素。數組屬于構造類型。90數組的概念數組是具有一定順序關系的若干相同類型變量的集合體,一維數組的聲明與引用一維數組的聲明類型說明符數組名[常量表達式];
例如:inta[10];
表示a為整型數組,有10個元素:a[0]...a[9]引用必須先聲明,后使用。只能逐個引用數組元素,而不能一次引用整個數組
例如:a[0]=a[5]+a[7]-a[2*3]數組名的構成方法與一般變量名相同。91一維數組的聲明與引用一維數組的聲明引用數組名的構成方法與一般例6.1一維數組的聲明與引用#include<iostream>usingnamespacestd;intmain(){ intA[10],B[10]; inti; for(i=0;i<10;i++) {
A[i]=i*2-1;
B[10-i-1]=A[i]; }for(i=0;i<10;i++){ cout<<"A["<<i<<"]="<<A[i]; cout<<"B["<<i<<"]="<<B[i]<<endl; }}92例6.1一維數組的聲明與引用#include<iostr一維數組的存儲順序數組元素在內存中順次存放,它們的地址是連續(xù)的。例如:具有10個元素的數組a,在內存中的存放次序如下:數組名字是數組首元素的內存地址。數組名是一個常量,不能被賦值。a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a93一維數組的存儲順序數組元素在內存中順次存放,它們的地址是連續(xù)一維數組的初始化可以在編譯階段使數組得到初值:在聲明數組時對數組元素賦以初值。
例如:inta[10]={0,1,2,3,4,5,6,7,8,9};可以只給一部分元素賦初值。
例如:inta[10]={0,1,2,3,4};在對全部數組元素賦初值時,可以不指定數組長度。
例如:inta[]={1,2,3,4,5};94一維數組的初始化可以在編譯階段使數組得到初值:7#include<iostream>usingnamespacestd;intmain(){ inti; staticintf[20]={1,1};//初始化第0、1個數 for(i=2;i<20;i++)f[i]=f[i-2]+f[i-1];//求第2~19個數 for(i=0;i<20;i++)//輸出,每行5個數// { if(i%5==0)cout<<endl;
out.width(12);//設置輸出寬度為12 cout<<f[i]; }}例:用數組來處理求Fibonacci數列問題95#include<iostream>例:用數組來處理求Fib二維數組的聲明及引用數據類型標識符[常量表達式1][常量表達式2]…;例:inta[5][3];表示a為整型二維數組,其中第一維有5個下標(0~4),第二維有3個下標(0~2)96二維數組的聲明及引用數據類型標識符[常量表達式1][常量存儲順序按行存放,上例中數組a的存儲順序為:
二維數組的聲明類型說明符數組名[常量表達式][常量表達式]例如:floata[3][4];a00a01a02a03a10a11a12a13a20a21a22a23a[0]——a00a01a02a03a[1]——a10a11a12a13
a[2]——a20a21a22a23a可以理解為:引用例如:b[1][2]=a[2][3]/2
下標不要越界二維數組的聲明及引用97存儲順序二維數組的聲明a00a01a02a03a1將所有數據寫在一個{}內,按順序賦值例如:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};分行給二維數組賦初值例如:inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};可以對部分元素賦初值例如:inta[3][4]={{1},{0,6},{0,0,11}};二維數組的初始化98將所有數據寫在一個{}內,按順序賦值二維數組的初始化11數組作為函數參數數組元素作實參,與單個變量一樣。數組名作參數,形、實參數都應是數組名,類型要一樣,傳送的是數組首地址。對形參數組的改變會直接影響到實參數組。99數組作為函數參數數組元素作實參,與單個變量一樣。12例6-2使用數組名作為函數參數主函數中初始化一個矩陣并將每個元素都輸出,然后調用子函數,分別計算每一行的元素之和,將和直接存放在每行的第一個元素中,返回主函數之后輸出各行元素的和。100例6-2使用數組名作為函數參數主函數中初始化一個矩陣并將每#include<iostream>usingnamespacestd;voidRowSum(intA[][4],intnrow){ intsum; for(inti=0;i<nrow;i++) { sum=0;
for(intj=0;j<4;j++)
sum+=A[i][j]; cout<<"Sumofrow"<<i
<<"is"<<sum<<endl;A[i][0]=sum; }}101101#include<iostream>1414intmain(){ intTable[3][4]={{1,2,3,4},{2,3,4,5},{3,4,5,6}}; for(inti=0;i<3;i++) { for(intj=0;j<4;j++) cout<<Table[i][j]<<""; cout<<endl; } RowSum(Table,3);
for(inti=0;i<3;i++)
cout<<Table[i][0]}102102intmain()1515運行結果:123423453456Sumofrow0is10Sumofrow1is14Sumofrow2is18101418103103運行結果:1616例6-5指針的聲明、賦值與使用#include<iostream>usingnamespacestd;intmain(){ int*i_pointer; //聲明int型指針i_pointer inti; //聲明int型數i i_pointer=&i; //取i的地址賦給i_pointer i=10; //int型數賦初值 cout<<"Outputinti="<<i<<endl; //輸出int型數的值 cout<<"Outputintpointeri="<<*i_pointer<<endl; //輸出int型指針所指地址的內容}程序運行的結果是:Outputinti=10Outputintpointeri=10104例6-5指針的聲明、賦值與使用#include<iost指向數組元素的指針聲明與賦值例:inta[10],*pa;pa=&a[0];或pa=a;通過指針引用數組元素經過上述聲明及賦值后:*pa就是a[0],*(pa+1)就是a[1],...,*(pa+i)就是a[i].a[i],*(pa+i),*(a+i),pa[i]都是等效的。a++;105指向數組元素的指針聲明與賦值a++;18例6-7(P174)設有一個int型數組a,有10個元素。用三種方法輸出各元素:使用數組名和下標使用數組名和指針運算使用指針變量106例6-7(P174)設有一個int型數組a,有10個元素。intmain(){inta[10];inti;for(i=0;i<10;i++)cin>>a[i];cout<<endl;for(i=0;i<10;i++)cout<<a[i];}使用數組名和下標107107使用數組名和下標2020intmain(){inta[10];inti;for(i=0;i<10;i++)cin>>a[i];cout<<endl;for(i=0;i<10;i++)cout<<*(a+i);}使用數組名指針運算108使用數組名指針運算21使用指針變量intmain(){inta[10];int*p,i;for(i=0;i<10;i++)cin>>a[i];cout<<endl;for(p=a;p<(a+10);p++)cout<<*p;}109使用指針變量22指針數組數組的元素是指針型例:Point*pa[2];//存放指針的數組
由pa[0],pa[1]兩個指針組成110指針數組數組的元素是指針型23例6-8利用指針數組存放單位矩陣(P176)#include<iostream>usingnamespacestd;intmain(){ intline1[]={1,0,0};//聲明數組,矩陣的第一行 intline2[]={0,1,0};//聲明數組,矩陣的第二行 intline3[]={0,0,1};//聲明數組,矩陣的第三行 int*p_line[3]; //聲明整型指針數組 p_line[0]=line1; //初始化指針數組元素 p_line[1]=line2; p_line[2]=line3;111例6-8利用指針數組存放單位矩陣(P176)#inclu //輸出單位矩陣cout<<"Matrixtest:"<<endl; for(inti=0;i<3;i++) //對指針數組元素循環(huán) { for(intj=0;j<3;j++) //對矩陣每一行循環(huán) {cout<<p_line[i][j]<<"";} cout<<endl; }}輸出結果為:Matrixtest:1,0,00,1,00,0,1112112 //輸出單位矩陣輸出結果為:2525例6-9二維數組舉例#include<iostream>usingnamespacestd;intmain(){ intarray2[2][3]={{11,12,13},{21,22,23}};for(inti=0;i<2;i++){cout<<*(array2+i)<<endl; for(intj=0;j<3;j++){cout<<*(*(array2+i)+j)<<"";//或者cout<<array2[i][j]<<"";} cout<<endl; }}0X0065FDE011,12,130X0065FDEC21,22,23113例6-9二維數組舉例#include<iostream以指針作為函數參數以地址方式傳遞數據,可以用來返回函數處理結果。實參是數組名時形參可以是指針。114以指針作為函數參數以地址方式傳遞數據,可以用來返回函數處理結例6.10(P178)題目:讀入三個浮點數,將整數部分和小數部分分別輸出#include<iostream>usingnamespacestd;voidsplitfloat(floatx,int*intpart,float*fracpart){//形參intpart、fracpart是指針
*intpart=int(x);
//取x的整數部分
*fracpart=x-*intpart;
//取x的小數部分}115例6.10(P178)題目:讀入三個浮點數,將整數部分和小intmain(){ inti,n; floatx,f;
cout<<"Enterthree(3)floatingpointnumbers"<<endl; for(i=0;i<3;i++) { cin>>x; splitfloat(x,&n,&f);//變量地址做實參 cout<<"IntegerPartis"<<n
<<"FractionPartis"<<
f<<endl; }}116116intmain()2929運行結果:Enterthree(3)floatingpointnumbers4.7IntegerPartis4FractionPartis0.78.913IntegerPartis8FractionPartis0.913-4.7518IntegerPartis-4FractionPartis-0.7518117117運行結果:3030例:輸出數組元素的內容和地址#include<iostream>#include<iomanip>usingnamespacestd;voidArray_Ptr(long*P,intn){ inti; cout<<"Infunc,addressofarrayis"
<<unsignedlong(P)<<endl; cout<<"Accessingarrayinthefunctionusingpointers"
<<endl; for(i=0;i<n;i++) { cout<<"Addressforindex"<<i<<"is"
<<unsignedlong(P+i); cout<<"Valueis"<<*(P+i)<<endl; }}118例:輸出數組元素的內容和地址#include<iostrintmain(){ longlist[5]={50,60,70,80,90};
cout<<"Inmain,addressofarrayis"<<unsignedlong(list)<<endl; cout<<endl;
Array_Pt
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 同意簽訂合同的紀要
- 《夏商周秦漢大事》課件
- 2025年海南貨運從業(yè)資格證恢復考試題
- 2025年濱州貨運資格證考試真題
- 2025年山東貨運上崗證模擬考試0題
- 2025年江西貨運從業(yè)資證孝試模似題庫
- 2025年達州道路運輸從業(yè)資格證考試模擬試題
- 治安院務公開管理辦法
- 智能家居大白施工合同
- 航空航天木地板施工合同
- 氯酸鈉的生產工藝簡介
- Camtasia_Studio使用教程
- 業(yè)務員手冊內容
- 計劃分配率和實際分配率_CN
- 《紅燈停綠燈行》ppt課件
- 小學語文作文技巧六年級寫人文章寫作指導(課堂PPT)
- 《APQP培訓資料》
- PWM脈寬直流調速系統設計及 matlab仿真驗證
- 家具銷售合同,家居訂購訂貨協議A4標準版(精編版)
- 食品加工與保藏課件
- 有功、無功控制系統(AGCAVC)技術規(guī)范書
評論
0/150
提交評論