c++3構(gòu)造數(shù)據(jù)類型_第1頁
c++3構(gòu)造數(shù)據(jù)類型_第2頁
c++3構(gòu)造數(shù)據(jù)類型_第3頁
c++3構(gòu)造數(shù)據(jù)類型_第4頁
c++3構(gòu)造數(shù)據(jù)類型_第5頁
已閱讀5頁,還剩117頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第三章構(gòu)造數(shù)據(jù)類型C++語言程序設(shè)計2本章主要內(nèi)容3.1數(shù)組3.2指針指針與數(shù)組動態(tài)存儲分配3.3引用3.4字符串3.5枚舉類型、結(jié)構(gòu)體與共用體3數(shù)組的概念n個整數(shù)的序列如何存儲和處理?n=3,3個int型變量;n=10000,10000個int型變量?特點:1、相同類型的;2、數(shù)據(jù)間有順序關(guān)系。

數(shù)組4數(shù)組的概念數(shù)組是具有一定順序關(guān)系的若干相同類型變量的集合體,組成數(shù)組的變量稱為該數(shù)組的元素。

數(shù)組5枚舉型結(jié)構(gòu)型聯(lián)合型數(shù)組型指針型類數(shù)據(jù)類型(type)自定義類型(構(gòu)造類型)基本類型布爾型bool字符型char整型int實型(浮點型)單精度型float雙精度型doubleASCII6數(shù)組的概念數(shù)組是具有一定順序關(guān)系的若干相同類型變量的集合體,組成數(shù)組的變量稱為該數(shù)組的元素。

一維數(shù)組——向量arrayName[9]二維數(shù)組——矩陣arrayName[4][5]N維數(shù)組——arrayName[2][3]…[3]

數(shù)組下標(biāo)數(shù)組名7一維數(shù)組的聲明與使用一維數(shù)組的聲明類型說明符數(shù)組名[整型常量表達(dá)式];

例如:inta[10];

表示a為整型數(shù)組,有10個元素:a[0]...a[9]數(shù)組名的構(gòu)成方法與一般變量名相同。

數(shù)組intmain(){intx=0;inta[10+x];return0;}常量表達(dá)式在編譯時就可求出,值必須為正整數(shù).errorC2057:應(yīng)輸入常量表達(dá)式8一維數(shù)組的聲明與使用一維數(shù)組的聲明類型說明符數(shù)組名[整型常量表達(dá)式];

例如:inta[10];

表示a為整型數(shù)組,有10個元素:a[0]...a[9]數(shù)組名的構(gòu)成方法與一般變量名相同。

數(shù)組數(shù)組的使用:“數(shù)組名[下標(biāo)表達(dá)式]”表示數(shù)組元素,下標(biāo)起始值0只能逐個引用數(shù)組元素,而不能一次引用整個數(shù)組

例如:a[0]=a[5]+a[7]-a[2*3]不要求是常量表達(dá)式,但值必須為正整數(shù),且不能越界。9例3.1一維數(shù)組的聲明與引用#include<iostream>usingnamespacestd;intmain(){inta[10],b[10];for(inti=0;i<10;i++){

a[i]=i*2-1;

b[10-i-1]=a[i];}for(inti=0;i<10;i++){cout<<"a["<<i<<"]="<<a[i]<<"";cout<<"b["<<i<<"]="<<b[i]<<endl;}return0;}

數(shù)組【注意】

“數(shù)組名[下標(biāo)]”1、值為整數(shù);2、下標(biāo)值不能越界。b[9]=a[0]=-1b[8]=a[1]=1…b[0]=a[9]=17#include<iostream>usingnamespacestd;intmain(){inta[10],b[10];for(inti=0;i<10;i++){

a[i]=i*2-1;

b[10-i-1]=a[i];}for(inti=0;i<10;i++){cout<<"a["<<i<<"]="<<a[i]<<"";cout<<"b["<<i<<"]="<<b[i]<<endl;}return0;}10例3.1一維數(shù)組的聲明與引用

數(shù)組【注意】數(shù)組不能越界。下標(biāo)下界——0小標(biāo)上界——911一維數(shù)組的存儲順序數(shù)組元素在內(nèi)存中順序、連續(xù)(地址是連續(xù)的)存儲的。例如:具有10個元素的數(shù)組a,在內(nèi)存中的存放次序如下(按下標(biāo)從小到大以此存儲):數(shù)組名是一個常量,不能被賦值。數(shù)組名字是數(shù)組首元素的內(nèi)存地址。a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a

數(shù)組12一維數(shù)組的初始化可以在聲明數(shù)組的同時給元素賦初值:在聲明數(shù)組時對全部數(shù)組元素賦以初值。

例如:inta[10]={0,1,2,3,4,5,6,7,8,9};在對全部數(shù)組元素賦初值時,可以不指定數(shù)組長度。

例如:inta[]={1,2,3,4,5}可以只給部分元素賦初值

例如:inta[10]={0,1,2,3,4};

不能間隔賦值!剩余元素默認(rèn)=0

數(shù)組13例:用數(shù)組來處理求Fibonacci數(shù)列問題【費波那西數(shù)列、費氏數(shù)列、黃金分割數(shù)列】1415#include<iostream>usingnamespacestd;intmain(){intf[20]={0,1}; //初始化第0、1個數(shù)

for(inti=2;i<20;i++) //求第2~19個數(shù)

f[i]=f[i-2]+f[i-1];for(intj=0;j<20;j++){ //輸出,每行5個數(shù)

if(j%5==0)cout<<endl; cout.width(12); //設(shè)置輸出寬度為12 cout<<f[j];}return0;}例:用數(shù)組來處理求Fibonacci數(shù)列問題【費波那西數(shù)列、費氏數(shù)列、黃金分割數(shù)列】16例:用數(shù)組來處理求Fibonacci數(shù)列問題運行結(jié)果:

0

1 1 2 3 5

8 13 21 34

55 89 144 233 377 610

987 1597 2584 4181 17一維數(shù)組應(yīng)用舉例循環(huán)從鍵盤讀入若干組選擇題答案,計算并輸出每組答案的正確率,直到輸入ctrl+z為止。每組連續(xù)輸入5個答案,每個答案可以是'a'..'d'。

數(shù)組ctrl+z的作用是輸入一個終止符"^Z",終止符的作用就是終止當(dāng)前的命令.#include<iostream>usingnamespacestd;intmain(){constchar

KEY[]={'a','c','b','a','d'};constintNUM_QUES=5;

charc;

int

ques=0,numCorrect=0;

cout<<"Enterthe"<<NUM_QUES<<"questiontests:"<<endl;

while(cin.get(c)){if(c!='\n'){

if(c==KEY[ques]){

numCorrect++;

cout<<"";}

else

cout<<"*";

ques++;}

else{cout<<"Score"<<float(numCorrect)/NUM_QUES*100<<"%";

ques=0;

numCorrect=0;

cout<<endl;}}return0;}18//數(shù)組聲明為常量,保存答案運行結(jié)果:acbba**

Score

60%acbadScore100%abbda***Score40%bdcba*****Score0%19constcharKEY[]={'a','c','b','a','d'};20二維數(shù)組的聲明及引用數(shù)據(jù)類型標(biāo)識符[常量表達(dá)式1][常量表達(dá)式2];例:inta[5][3];

表示a為整型二維數(shù)組,

其中第一維有5個下標(biāo)(0~4)

第二維有3個下標(biāo)(0~2)

數(shù)組的元素個數(shù)為5*3=15可以用于存放5行3列的整型數(shù)據(jù)矩陣。

數(shù)組行標(biāo)列標(biāo)21存儲順序按行存放,上例中數(shù)組a的存儲順序為:

二維數(shù)組的聲明類型說明符數(shù)組名[常量表達(dá)式1][常量表達(dá)式2]例如:floata[3][4];a00a01a02a03a10a11a12a13a20a21a22a23a[0]——a00a01a02a03a[1]——a10a11a12a13

a[2]——a20a21a22a23a可以理解為:引用例如:b[1][2]=a[2][3]/2下標(biāo)不要越界二維數(shù)組的聲明及引用

數(shù)組22將所有數(shù)據(jù)寫在一個{}內(nèi),按順序賦值例如:給出全部元素時,第一維下標(biāo)個數(shù)可省略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};按第一維下標(biāo)進(jìn)行分組,分行給二維數(shù)組賦初值例如:inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};可以對部分元素賦初值例如:inta[3][4]={{1},{0,6},{0,0,11}};二維數(shù)組的初始化

數(shù)組二維數(shù)組聲明、初始化和使用#include<iostream>usingnamespacestd;intmain(){inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};for(inti=0;i<3;i++){ for(intj=0;j<4;j++) cout<<a[i][j]<<'\t'; cout<<endl;}return0;}2324枚舉型結(jié)構(gòu)型聯(lián)合型數(shù)組型指針型類數(shù)據(jù)類型(type)自定義類型(構(gòu)造類型)基本類型布爾型bool字符型char整型int實型(浮點型)單精度型float雙精度型doubleASCII25內(nèi)存地址:理解C++指針的基礎(chǔ)內(nèi)存儲器以字節(jié)為基本存儲單元,進(jìn)行編號——內(nèi)存地址。內(nèi)存空間的訪問方式通過變量名訪問:存取變量內(nèi)容通過地址訪問:沒有變量名或不方便使用變量名(如,程序運行時,動態(tài)創(chuàng)建數(shù)組)

指針26內(nèi)存地址:理解C++指針的基礎(chǔ)取地址運算符:&例:intvar;則&var

表示變量var在內(nèi)存中的起始地址#include<iostream>usingnamespacestd;intmain(){ inti=0; cout<<&i<<endl; return0;}

指針27聲明:

數(shù)據(jù)類型*標(biāo)識符;

概念

指針:內(nèi)存地址,用于

間接訪問內(nèi)存單元

指針變量:

用于存放內(nèi)存地址

指針指針的概念32位計算機(jī),地址長度32位。指針本身的數(shù)據(jù)值都是unsignedlongint型。聲明指針時需要明確指出它用于存放什么類型數(shù)據(jù)的地址。28定義:

數(shù)據(jù)類型*標(biāo)識符;如:inti=3,j=6;int*ptr;ptr=&i;

概念

指針:內(nèi)存地址,用于

間接訪問內(nèi)存單元

指針變量:

用于存放內(nèi)存地址內(nèi)存用戶數(shù)據(jù)區(qū)變量i變量j變量

ptr362000200020043010

指針指針的概念32位計算機(jī),地址長度32位。指針本身的數(shù)據(jù)值都是unsignedlongint型。29語法形式

數(shù)據(jù)類型*指針名=初始地址;

指針名=地址;注意事項用&取變量地址作為初值時,該變量必須在指針初始化之前已聲明過,且變量類型應(yīng)與指針類型一致??梢杂靡粋€已賦初值的指針變量去初始化另一個指針變量。

指針指針的定義、賦值與使用30inta,b;int*pa,*pb=&b,*ppa;pa=&a;ppa=pa;*

聲明指針變量&

取地址運算符:獲取變量內(nèi)存中的起始地址可以用一個已賦初值的指針去初始化另一個指針變量。多個指針指向同一個變量。指針的定義、賦值與使用31*聲明指針變量int*ptr;指針運算符:訪問指針?biāo)赶蜃兞康膬?nèi)容。*ptr=3;&聲明引用(3.3節(jié)):int&k=i;取地址運算符:cout<<&i<<endl;獲取變量內(nèi)存中的起始地址指針的定義、賦值與使用32指針的定義、賦值與使用#include<iostream>usingnamespacestd;intmain(){ inti=10; //定義int型數(shù)i int*ptr=&i; //取i的地址賦給ptr//輸出int型數(shù)的值

cout<<"i="<<i<<endl;

//輸出int型指針?biāo)傅刂返膬?nèi)容

cout<<"*ptr="<<*ptr<<endl;

return0;}

指針300010ptr*ptri3000【*指針(間接)運算符】:訪問指針(變量)所指向的變量inti;int*ptr=&i;*ptr=1033【*指針(間接)運算符】:訪問指針(變量)所指向的變量內(nèi)容。ptr*ptri3000指針的定義、賦值與使用10300034指向”常量”的指針不能通過指針來改變所指對象的值,但指針本身可以改變,可以指向另外的對象。例inta;constint*p1=&a; //p1是指向”常量”的指針intb;p1=&b; //正確,p1本身的值可以改變*p1=1; //編譯時出錯,不能通過p1改變所指的對象

指針errorC3892:“p1”:不能給常量賦值35指針類型的常量若聲明指針常量,則指針本身的值不能被改變,聲明時指定初始化地址。例:inta,b;int*constp2=&a;p2=&b;//錯誤,p2是指針常量,值不能改變

指針36指針的各種運算指針是一種數(shù)據(jù)類型,指針變量可以參與部分運算算術(shù)運算關(guān)系運算賦值運算

指針37指針變量的算術(shù)運算指針與整數(shù)的加減運算指針p加上或減去n,其意義是指針當(dāng)前指向位置的前方或后方第n個數(shù)據(jù)的地址。這種運算的結(jié)果值取決于指針指向的數(shù)據(jù)類型。*(p+n)等價于p[n]指針加一,減一運算指向下一個或前一個數(shù)據(jù)。例如:y=*px++

相當(dāng)于y=*(px++)

(*和++優(yōu)先級相同,自右向左運算)

指針papa-2pa-1pa+1pa+2pa+3*(pa-2)或pa[-2]*pa或pa[0]*(pa+1)或pa[1]*(pa+2)或pa[2]*(pa+3)或pa[3]*(pa-1)或pa[-1]short*pa38指針p加上n——指針當(dāng)前指向位置的前方第n個數(shù)據(jù)的地址。指針p減去n——指針當(dāng)前指向位置后方第n個數(shù)據(jù)的地址。指向short類型的指針,每次移動2個字節(jié)連續(xù)內(nèi)存空間中的同類數(shù)據(jù)pb-1pbpb+1pb+2*(pb-1)或pb[-1]*pb或pb[0]*(pb+1)或pb[1]*(pb+2)或pb[2]long*pb39指向long類型的指針,每次移動4個字節(jié)連續(xù)內(nèi)存空間中的同類數(shù)據(jù)40指針變量的算術(shù)運算指針與整數(shù)的加減運算指針p加上或減去n,其意義是指針當(dāng)前指向位置的前方或后方第n個數(shù)據(jù)的地址。*(p1+n1)等價于p1[n1]指針加一,減一運算指向下一個或前一個數(shù)據(jù)。

指針指針的算術(shù)運算和數(shù)組的使用相關(guān)(適合處理連續(xù)內(nèi)存空間中的同類數(shù)據(jù))41指針與數(shù)組的關(guān)系inta[10];int*ptr=a;數(shù)組名表示的數(shù)組首地址來初始化化指針。數(shù)組名是一個指針常量,不能被賦值。數(shù)組名字是數(shù)組首元素的內(nèi)存地址。a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]aptrint*ptr=&a[0]42用指針處理數(shù)組元素聲明與賦值例:shorta[10],*pa;pa=&a[0];或pa=a;通過指針引用數(shù)組元素經(jīng)過上述聲明及賦值后:*pa就是a[0],*(pa+1)就是a[1],...,*(pa+i)就是a[i].a[i],*(pa+i),*(a+i),pa[i]都是等效的。不能寫a++,因為a是數(shù)組首地址是指針常量。

指針43用指針處理數(shù)組元素數(shù)組名是一個指針常量,不能被賦值。數(shù)組名字是數(shù)組首元素的內(nèi)存地址。a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a*(pa+1)*(a+1)*pa*(pa+6)*(a+6)a[i],*(a+i),*(pa+i),pa[i]都是等效的pa=&a[0];或pa=a44例設(shè)有一個int型數(shù)組a,有10個元素。用三種方法輸出各元素:1、使用數(shù)組名和下標(biāo)2、使用數(shù)組名和指針運算3、使用指針變量

指針#include<iostream>usingnamespacestd;intmain(){ inta[10]={1,2,3,4,5,6,7,8,9,0}; for(inti=0;i<10;i++) cout<<a[i]<<""; cout<<endl; return0;}1、使用數(shù)組名和下標(biāo)45a[i],*(a+i),*(pa+i),pa[i]都是等效的#include<iostream>usingnamespacestd;intmain(){ inta[10]={1,2,3,4,5,6,7,8,9,0}; for(inti=0;i<10;i++) cout<<*(a+i)<<""; cout<<endl; return0;}2、使用數(shù)組名指針運算46a[i],*(a+i),*(pa+i),pa[i]都是等效的3、使用指針變量#include<iostream>usingnamespacestd;intmain(){ inta[10]={1,2,3,4,5,6,7,8,9,0};

int*pa=a; for(inti=0;i<10;i++) cout<<pa[i]<<""; cout<<endl; return0;}47a[i],*(a+i),*(pa+i),pa[i]都是等效的3、使用指針變量#include<iostream>usingnamespacestd;intmain(){ inta[10]={1,2,3,4,5,6,7,8,9,0}; for(int

*p=a;p<(a+10);p++) cout<<*p<<""; cout<<endl; return0;}48a[i],*(a+i),*(pa+i),pa[i]都是等效的不能寫a++,因為a是數(shù)組首地址是常量49關(guān)系運算指向相同類型數(shù)據(jù)的指針之間可以進(jìn)行各種關(guān)系運算。相等——指向同一個地址。指針可以和零之間進(jìn)行等于或不等于的關(guān)系運算。p==0或p!=00,表示空指針,NULL以下關(guān)系運算是無意義的:指向不同數(shù)據(jù)類型的指針指針與非0整數(shù)變量之間。指針變量的關(guān)系運算

指針50賦值運算向指針變量賦的值必須是:類型要一致1、&變量2、數(shù)組名3、指針變量4、整數(shù)0,表示空指針,NULL,不指向任何地址int*p=NULL;沒有明確的地址值可以賦值時,為了防止出現(xiàn)不可預(yù)見的錯誤,將指針設(shè)置為NULL。不能是非0的整數(shù)。指針變量的賦值運算

指針51指針數(shù)組數(shù)組的元素是同一類型的指針。數(shù)據(jù)類型*數(shù)組名[整型常量表達(dá)式];例:int*pa[2];

由pa[0],pa[1]兩個指針組成

指針52例

利用指針數(shù)組存放單位矩陣#include<iostream>usingnamespacestd;intmain(){ intline1[]={1,0,0}; //矩陣的第一行

intline2[]={0,1,0}; //矩陣的第二行

intline3[]={0,0,1}; //矩陣的第三行……

//定義整型指針數(shù)組并初始化,指向一行

int*pLine[3]={line1,line2,line3};

指針pLine[0]=line1pLine[1]=line2pLine[2]=line3531pLine[0]pLine[1]pLine[2]00010001Line1Line2Line3例

利用指針數(shù)組存放單位矩陣pLine*(pLine[0]+j)*(pLine[1]+j)*(pLine[2]+j)pLine[0][j]pLine[1][j]pLine[2][j]*(line1+j)、line1[j]等效;*(line2+j)、line2[j]等效;*(line3+j)、line3[j]等效; cout<<"Matrixtest:"<<endl;//輸出單位矩陣

for(inti=0;i<3;i++){

for(intj=0;j<3;j++)

cout<<*(pLine[i]+j)<<"";cout<<endl; } return0;}輸出結(jié)果為:Matrixtest:1,0,00,1,00,0,154pLine[0][j]、*(pLine[0]+j)、*(line1+j)、line1[j]等效;pLine[1][j]、*(pLine[1]+j)、*(line2+j)、line2[j]等效;pLine[2][j]、*(pLine[2]+j)、*(line3+j)、line3[j]等效;pa[i],*(pa+i),*(a+i),a[i]都是等效的 cout<<"Matrixtest:"<<endl;//輸出單位矩陣

for(inti=0;i<3;i++){

for(intj=0;j<3;j++)

cout<<pLine[i][j]<<"";cout<<endl; } return0;}輸出結(jié)果為:Matrixtest:1,0,00,1,00,0,155pLine[0][j]、*(pLine[0]+j)、*(line1+j)、line1[j]等效;pLine[1][j]、*(pLine[1]+j)、*(line2+j)、line2[j]等效;pLine[2][j]、*(pLine[2]+j)、*(line3+j)、line3[j]等效;pa[i],*(pa+i),*(a+i),a[i]都是等效的56例

二維數(shù)組舉例#include<iostream>usingnamespacestd;intmain(){intarray2[3][3]={{11,12,13},{21,22,23},{31,32,33}};for(inti=0;i<3;i++){for(intj=0;j<3;j++)cout<<array2[i][j]<<""; //逐個輸出二維數(shù)組第i行元素值

cout<<endl;}return0;}

指針指針數(shù)組vs二維數(shù)組57111213212223313233array2for(inti=0;i<3;i++){for(intj=0;j<3;j++)cout<<array2[i][j]<<""; cout<<endl;} array2[0][0]array2[1][0]array2[2][0]指針數(shù)組vs二維數(shù)組58array2[0]array2[1]array2[2]111213212223313233array2int*array2[3];

array2[0][0]array2[1][0]array2[2][0]*(array2+i)、array2[i]等效指針數(shù)組vs二維數(shù)組59array2[0]array2[1]array2[2]111213212223313233array2array2[i][j]、*(array2[i]+j)等效int*array2[3];

array2[0][0]array2[1][0]array2[2][0]60#include<iostream>usingnamespacestd;intmain(){intarray2[3][3]={{11,12,13},{21,22,23},{31,32,33}};for(inti=0;i<3;i++){for(intj=0;j<3;j++)cout<<*(array2[i]+j)<<""; //逐個輸出二維數(shù)組第i行元素值

cout<<endl;}return0;}

指針*(array2[i]+i)、array2[i][j]等效*(array2+i)、array2[i]等效61#include<iostream>usingnamespacestd;intmain(){intarray2[3][3]={{11,12,13},{21,22,23},{31,32,33}};for(inti=0;i<3;i++){for(intj=0;j<3;j++)cout<<*(*(array2+i)+j)<<""; //逐個輸出二維數(shù)組第i行元素值

cout<<endl;}return0;}

指針*(array2[i]+i)、array2[i][j]等效*(array2+i)、array2[i]等效程序的輸出結(jié)果為:1112132122233132336263動態(tài)內(nèi)存分配n個整數(shù)的序列如何存儲和處理?n=?動態(tài)存儲分配程序運行前,并不能確切地知道數(shù)組中會有多少個元素。c++中,動態(tài)內(nèi)存分配技術(shù)保證程序在運行過程中按照實際需要申請適量的內(nèi)存,使用結(jié)束后還可以釋放。64動態(tài)申請內(nèi)存操作符newnew類型名T(初始化參數(shù))功能:在程序執(zhí)行期間,申請用于存放T類型對象的內(nèi)存空間,并依初值列表賦以初值。

int*point=newint(2);結(jié)果值:成功:T類型的指針,指向新分配的內(nèi)存;失敗:拋出異常。

動態(tài)存儲分配65動態(tài)申請內(nèi)存操作符newnew類型名T(初始化參數(shù))int*point=newint(2);int*point=newint();//初始化為0int*point=newint;//無初值,隨機(jī)數(shù)

動態(tài)存儲分配66釋放內(nèi)存操作符deletedelete指針p功能:釋放指針p所指向的內(nèi)存。

p必須是new操作的返回值。int*point=newint(2);……deletepoint;

動態(tài)存儲分配申請和釋放動態(tài)一維數(shù)組分配:new類型名T[數(shù)組長度]

數(shù)組長度可以是任何得到正整數(shù)的表達(dá)式,在運行時計算,返回數(shù)組首地址。釋放:delete[]

數(shù)組名p釋放指針p所指向的數(shù)組。p必須是用new分配得到的數(shù)組首地址。//初始化為0int*p=newint[6]();delete[]p;67int*p;p=newint[6];pp+3p[0]p[1]p[2]p[3]p[4]p[5]68int類型的指針*(p+3)*(p+1)p[i]<=>*(p+i)p+1*(p)69動態(tài)創(chuàng)建多維數(shù)組new類型名T[第1維長度][第2維長度]…;如果內(nèi)存申請成功,new運算返回一個指向新分配內(nèi)存首地址的指針

char(*fp)[3];//一維char類型數(shù)組的指針fp=newchar[2][3];

動態(tài)存儲分配【正整數(shù)表達(dá)式】【正整數(shù)常量表達(dá)式】2個元素的一維數(shù)組每個元素都是char[3]T類型數(shù)組的指針指針數(shù)組.VS.數(shù)組指針

--------------指針數(shù)組-----------------

char*p[6];//指針數(shù)組

含有6個指針元素,每一個元素都是char指針

70--------------指針數(shù)組-----------------

char*p[6];含有6個指針元素,每一個元素都是char指針p[0]p[1]p[2]p[3]p[4]p[5]71pchar類型的指針指針數(shù)組.VS.數(shù)組指針

--------------指針數(shù)組-----------------

char*p[6];//指針數(shù)組

含有6個指針元素,每一個元素都是char指針

--------------數(shù)組指針(P74)------------

//含6個char元素一維數(shù)組的指針

char(*p)[6];

chara[6];p=&a;

72int(*fp)[3];inta[2][3];fp=a(或&a[0]);a[0]a[1]a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]73*(*(fp+1)+1)*(*(fp+0)+0)fp[i][j]<=>*(*(fp+i)+j)fp*(*(fp+0)+2)*(fp+1)2個元素的一維數(shù)組,每個元素都是int[3]aint(*fp)[3];fp=newint[2][3];fp[0]fp[1]fp[0][0]fp[0][1]fp[0][2]fp[1][0]fp[1][1]fp[1][2]74int類型一維數(shù)組的指針,數(shù)組長度3*(*(fp+1)+1)*(*(fp+0)+0)fp[i][j]<=>*(*(fp+i)+j)fp*(*(fp+0)+2)*(fp+1)2個int[3]75例,動態(tài)創(chuàng)建多維數(shù)組#include<iostream>usingnamespacestd;intmain(){float(*cp)[9][8]=newfloat[8][9][8];for(inti=0;i<8;i++)for(intj=0;j<9;j++)for(intk=0;k<8;k++)//以指針形式數(shù)組元素*(*(*(cp+i)+j)+k)=(float)(i*100+j*10+k);

動態(tài)存儲分配8個float[9][8]*(cp+i)第i個float[9][8] for(inti=0;i<8;i++){ for(intj=0;j<9;j++){ for(intk=0;k<8;k++)

cout<<cp[i][j][k]<<""; cout<<endl; } cout<<endl; }

delete[]cp; return0;}76將指針cp作為數(shù)組名使用,通過數(shù)組名和下標(biāo)訪問數(shù)組元素77例,動態(tài)創(chuàng)建多維數(shù)組int*p[3];for(inti=0;i<3;i++){

intcount=2*i+1;

p[i]=newint[count];

for(intj=0;j<count;j++)

{

p[i][j]=j+1;

}}

動態(tài)存儲分配78p[0]p[1]pp[2]p00p10p11p12p20p21p22p23p24int*p[3];for(inti=0;i<3;i++){ intcount=2*i+1;

p[i]=newint[count]; for(intj=0;j<count;j++){ p[i][j]=j+1; }}79引用的概念引用引用(reference)已經(jīng)存在的變量的別名。與變量占用同一塊存儲空間。類型名&別名=目標(biāo)變量名;80引用的概念引用#include<iostream>usingnamespacestd;intmain(){intv=1;

int&rv=v; //定義rv是變量v的別名cout<<"v="<<v<<"\t"<<"rv="<<rv<<endl;

rv=2;

//相當(dāng)于r=2cout<<"v="<<v<<"\t"<<"rv="<<rv<<endl;//輸出v和引用rv的地址cout<<"&v="<<&v<<"\t"<<"&rv="<<&rv<<endl;return0;}81引用的概念引用引用(reference)已經(jīng)存在的變量的別名。與變量占用同一塊存儲空間?!菊f明】1、表達(dá)式和常量不能定義別名。2、引用必須初始化,“從一而終”。3、變量的引用不會分配存儲空間。類型名&別名=目標(biāo)變量名;82引用的概念引用//引用必須初始化,“從一而終”#include<iostream>usingnamespacestd;intmain(){ intx=1,y=2;

int&r=x; r=y; //相當(dāng)于x=y;

int&r=y; return0;}83引用的概念引用數(shù)組的引用(reference)類型名

(&別名)[..]

=目標(biāo)數(shù)組名;#include<iostream>usingnamespacestd;intmain(){ inta[5]={1,2,3,4,5};

//()不能少,

元素個數(shù)必須與數(shù)組a的一致 int(&ra)[5]=a;

for(inti=0;i<5;i++) cout<<ra[i]<<"\t"; cout<<endl;

return0;}指針數(shù)組.VS.數(shù)組指針

--------------數(shù)組的引用---------------

//()不能少,元素個數(shù)必須與數(shù)組a的一致int(&ra)[5]=a;

ra[i]<==>a[i]

--------------數(shù)組指針(P74)------------

//含6個int元素一維數(shù)組的指針

char(*p)[6];

chara[6];p=&a;

84char(*p)[6];//數(shù)組指針,6個元素的int數(shù)組chara[6];p=&a;int(&ra)[5]=a;a[0]a[1]a[2]a[3]a[4]a[5]85pa*(*(p)+1)*(*(p)+0)*(p)*(*(p)+3)a別名ra86引用與指針的區(qū)別引用1、引用必須初始化,且“從一而終”;2、指針可以從指向一個變量,轉(zhuǎn)到指向另一個變量。指向不確定是,可以設(shè)置為空指針NULL。用字符數(shù)組存儲和處理字符串字符數(shù)組的定義:字符數(shù)組的初始化:87

字符串1、逐一賦值charstr[8]={'p','r','o','g','r','a','m','\0'};charstr[8]={'p','r','o','g','r','a','m'};2、字符串常量賦值charstr[8]={"program"};charstr[8]="program";charstr[]="program";char字符數(shù)組名[整型常量表達(dá)式];用字符數(shù)組存儲和處理字符串字符數(shù)組的定義:字符數(shù)組的初始化:88

字符串char字符數(shù)組名[整型常量表達(dá)式];#include<iostream>usingnamespacestd;intmain(){ charstr[8]="司馬相如"; return0;}用字符數(shù)組存儲和處理字符串字符數(shù)組的賦值與引用:89

字符串chars[5];s={'C','+','+'}; //不能對整個數(shù)組賦值s={"C++"}; //不能對整個數(shù)組賦值s="C++";

//不能對整個數(shù)組賦值//只能對數(shù)組元素賦值s[0]='C';s[1]='+';s[2]='+';只能對數(shù)組元素賦值不能對整個數(shù)組賦值用字符數(shù)組存儲和處理字符串字符數(shù)組的賦值與引用:90

字符串 chars[5]; s={'C','+','+'}; //不能對整個數(shù)組賦值 s={"C++"}; //不能對整個數(shù)組賦值 s="C++";

//不能對整個數(shù)組賦值 //只能對數(shù)組元素賦值 s[0]='C';s[1]='+';s[2]='+';只能對數(shù)組元素賦值不能對整個數(shù)組賦值用字符數(shù)組存儲和處理字符串字符數(shù)組的輸入與輸出:91

字符串1、逐個字符輸入輸出,與普通數(shù)組一樣.用字符數(shù)組存儲和處理字符串字符數(shù)組的輸入與輸出:92

字符串2、利用cin或cout將整個字符串一次性輸入或輸出.#include<iostream>usingnamespacestd;intmain(){ charname[10]; cin>>name; cout<<"Name="<<name<<endl; return0;}//數(shù)組名//鍵盤輸入的字符串應(yīng)短于字符數(shù)組長度//空格、回車、Tab鍵作為結(jié)束標(biāo)志用字符數(shù)組存儲和處理字符串字符數(shù)組的輸入與輸出:93

字符串3、通過getline輸入一整行內(nèi)容.cin.getline(字符數(shù)組名,數(shù)組長度,結(jié)束字符)其中,“結(jié)束字符”缺省為'\n'#include<iostream>usingnamespacestd;intmain(){ chars[10];

//輸入字符個數(shù)超過7或者遇到字符'.' cin.getline(s,7,'.'); cout<<s<<endl; return0;}用字符數(shù)組存儲和處理字符串字符指針的定義:94

字符串1、指向字符串常量char*p

="program";2、

指向字符數(shù)組chars[20]={“IloveC++"};

char*p;p

=s;3、指向動態(tài)創(chuàng)建的字符數(shù)組

char*p

=newchar[20];char*字符指針名;字符數(shù)組.VS.字符指針

----------------字符數(shù)組-----------------

1、存放全部字符;

----------------字符指針-----------------

1、存放存儲字符串的區(qū)域的首地址;

95#include<iostream>usingnamespacestd;intmain(){ chars[20]="C++程序設(shè)計"; char*p=s; cout<<"sizeof(s)="<<sizeof(s)<<endl; cout<<"sizeof(p)="<<sizeof(p)<<endl; cout<<"strlen(s)="<<strlen(s)<<endl; cout<<"strlen(p)="<<strlen(p)<<endl; return0;}用字符數(shù)組表示字符串的缺點用字符數(shù)組表示字符串的缺點執(zhí)行連接、拷貝、比較等操作,都需要顯式調(diào)用庫函數(shù),很麻煩.當(dāng)字符串長度很不確定時,需要用new動態(tài)創(chuàng)建字符數(shù)組,最后要用delete釋放,很繁瑣.字符串實際長度大于為它分配的空間時,會產(chǎn)生數(shù)組下標(biāo)越界的錯誤.解決方法使用字符串類string表示字符串.string實際上是對字符數(shù)組操作的封裝.96

字符串string的定義//包含C++標(biāo)準(zhǔn)庫中的string頭文件#include<string>

//建立一個空字符串strings1;

//字符串初始化strings2=“C++Language";

97

字符串string的長度和內(nèi)存大小98

字符串#include<iostream>#include<string>usingnamespacestd;intmain(){ strings="abcde"; cout<<"s.length()="<<s.length()<<endl; cout<<"sizeof(s)="<<sizeof(s)<<endl; return0;}string的賦值99

字符串1、賦予一個字符串常量

strings1="program";2、用string變量賦值

strings2; s2=s1;3、對string變量中的某一個字符進(jìn)行操作 stringword="man"; word[1]='e';string變量的運算常用操作符s+t

將串s和t連接成一個新串s=t

用t更新s,t——字符串常量、string對象,字符數(shù)組s==t

判斷s與t是否相等s!=t

判斷s與t是否不等s<t

判斷s是否小于t(按字典順序比較)s<=t

判斷s是否小于或等于t(按字典順序比較)s>t

判斷s是否大于t(按字典順序比較)s>=t

判斷s是否大于或等于t(按字典順序比較)s[i]

訪問串中下標(biāo)為i的字符例:strings1=“abc”,s2=“def”;strings3=s1+s2; //結(jié)果是”abcdef”boolb=(s1<s2); //結(jié)果是truechara=s2[1]; //結(jié)果是’e’100

字符串101例string類應(yīng)用舉例#include<string>#include<iostream>usingnamespacestd;intmain(){ ……}

字符串intmain(){ strings1="DEF";

cout<<"s1is"<<s1<<endl; strings2; cout<<"Pleaseenters2:";

cin>>s2; cout<<"lengthofs2:"<<s2.length()<<endl; //比較運算符的測試

if(s1<="ABC") cout<<"s1<=\"ABC\""<<endl; else cout<<"s1>\"ABC\""<<endl; //連接運算符的測試

s2+=s1; cout<<"s2=s2+s1:"<<s2<<endl; cout<<"lengthofs2:"<<s2.length()<<endl; return0;}102用getline輸入整行字符串輸入整行字符串用cin的>>操作符輸入字符串,會以空格作為分隔符,空格后的內(nèi)容會在下一回輸入時被讀??;用string頭文件中的getline可以輸入整行字符串,例如:getline(cin,s2);103

字符串用getline輸入整行字符串以其它字符作為分隔符輸入字符串輸入字符串時,可以使用其它分隔符作為字符串結(jié)束的標(biāo)志(例如逗號、分號)把分隔符作為getline的第3個參數(shù)即可getline(cin,s2,',');104

字符串例

用getline輸入字符串105include<iostream>#include<string>usingnamespacestd;intmain(){ for(inti=0;i<2;i++) { stringcity,state;

getline(cin,city,',');

getline(cin,state); cout<<"City:"<<city<<“State:"<<state<<endl; } return0;}

字符串Beijing,ChinaCity:BeijingState:ChinaSanFrancisco,theUnitedStatesCity:SanFranciscoState:theUnitedStatesstring數(shù)組106

字符串#include<string>#include<iostream>usingnamespacestd;intmain(){

stringBookName[3]={ "三國演義", "紅樓夢", "射雕英雄傳" }; for(inti=0;i<3;i++) cout<<BookName[i]<<endl; return0;}107枚舉類型—enum數(shù)據(jù)只有有限的幾種可能取值:一個星期:星期一、星期二、…、星期日性別:男、女學(xué)歷:???、本科、碩士、博士可以用int、char等基本數(shù)據(jù)類型來表示,但需要進(jìn)行合法性檢查如,0-男、1-女、2-表示什么??自定義數(shù)據(jù)類型108枚舉類型—enum枚舉類型的聲明形式如下:enum枚舉類型名{變量值列表};只要將需要的變量值一一列舉出來,便構(gòu)成了一個枚舉類型。例如:enumWeekday{SUN,MON,TUE,WED,THU,FRI,SAT};自定義數(shù)據(jù)類型枚舉元素109枚舉類型—enum枚舉類型應(yīng)用說明:對枚舉元素按常量處理,不能對它們賦值。例如,不能寫:SUN=0;

枚舉元素具有缺省值,它們依次為:0,1,2,......。也可以在聲明時另行指定枚舉元素的值,如:enumweekday{sun=7,mon=1,tue,wed,thu,fri,sat};枚舉值可以進(jìn)行關(guān)系運算。

整數(shù)值不能直接賦給枚舉變量,如需

要將整數(shù)賦值給枚舉變量,應(yīng)進(jìn)行強

制類型轉(zhuǎn)換。自定義數(shù)據(jù)類型110例設(shè)某次體育比賽的結(jié)果有四種可能:勝(win)、負(fù)(lose)、平局(tie)、比賽取消(cancel),編寫程序順序輸出這四種情況。分析:由于比賽結(jié)果只有四種可能,所以可以聲明一個枚舉類型,聲明一個枚舉類型的變量來存放比賽結(jié)果。自定義數(shù)據(jù)類型#include<iostream>usingnamespacestd;enumgame_result{WIN,LOSE,TIE,CANCEL};voidmain(){

game_resultresult;

enumgame_resultomit=CANCEL;intcount;for(count=WIN;count<=CANCEL

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論