版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第三章構(gòu)造數(shù)據(jù)類型C++語(yǔ)言程序設(shè)計(jì)2本章主要內(nèi)容3.1數(shù)組3.2指針指針與數(shù)組動(dòng)態(tài)存儲(chǔ)分配3.3引用3.4字符串3.5枚舉類型、結(jié)構(gòu)體與共用體3數(shù)組的概念n個(gè)整數(shù)的序列如何存儲(chǔ)和處理?n=3,3個(gè)int型變量;n=10000,10000個(gè)int型變量?特點(diǎn):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實(shí)型(浮點(diǎn)型)單精度型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ù)組的聲明類型說(shuō)明符數(shù)組名[整型常量表達(dá)式];
例如:inta[10];
表示a為整型數(shù)組,有10個(gè)元素:a[0]...a[9]數(shù)組名的構(gòu)成方法與一般變量名相同。
數(shù)組intmain(){intx=0;inta[10+x];return0;}常量表達(dá)式在編譯時(shí)就可求出,值必須為正整數(shù).errorC2057:應(yīng)輸入常量表達(dá)式8一維數(shù)組的聲明與使用一維數(shù)組的聲明類型說(shuō)明符數(shù)組名[整型常量表達(dá)式];
例如:inta[10];
表示a為整型數(shù)組,有10個(gè)元素:a[0]...a[9]數(shù)組名的構(gòu)成方法與一般變量名相同。
數(shù)組數(shù)組的使用:“數(shù)組名[下標(biāo)表達(dá)式]”表示數(shù)組元素,下標(biāo)起始值0只能逐個(gè)引用數(shù)組元素,而不能一次引用整個(gè)數(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ù)組的存儲(chǔ)順序數(shù)組元素在內(nèi)存中順序、連續(xù)(地址是連續(xù)的)存儲(chǔ)的。例如:具有10個(gè)元素的數(shù)組a,在內(nèi)存中的存放次序如下(按下標(biāo)從小到大以此存儲(chǔ)):數(shù)組名是一個(gè)常量,不能被賦值。數(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ù)組時(shí)對(duì)全部數(shù)組元素賦以初值。
例如:inta[10]={0,1,2,3,4,5,6,7,8,9};在對(duì)全部數(shù)組元素賦初值時(shí),可以不指定數(shù)組長(zhǎng)度。
例如:inta[]={1,2,3,4,5}可以只給部分元素賦初值
例如:inta[10]={0,1,2,3,4};
不能間隔賦值!剩余元素默認(rèn)=0
數(shù)組13例:用數(shù)組來(lái)處理求Fibonacci數(shù)列問(wèn)題【費(fèi)波那西數(shù)列、費(fèi)氏數(shù)列、黃金分割數(shù)列】1415#include<iostream>usingnamespacestd;intmain(){intf[20]={0,1}; //初始化第0、1個(gè)數(shù)
for(inti=2;i<20;i++) //求第2~19個(gè)數(shù)
f[i]=f[i-2]+f[i-1];for(intj=0;j<20;j++){ //輸出,每行5個(gè)數(shù)
if(j%5==0)cout<<endl; cout.width(12); //設(shè)置輸出寬度為12 cout<<f[j];}return0;}例:用數(shù)組來(lái)處理求Fibonacci數(shù)列問(wèn)題【費(fèi)波那西數(shù)列、費(fèi)氏數(shù)列、黃金分割數(shù)列】16例:用數(shù)組來(lái)處理求Fibonacci數(shù)列問(wèn)題運(yùn)行結(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)從鍵盤讀入若干組選擇題答案,計(jì)算并輸出每組答案的正確率,直到輸入ctrl+z為止。每組連續(xù)輸入5個(gè)答案,每個(gè)答案可以是'a'..'d'。
數(shù)組ctrl+z的作用是輸入一個(gè)終止符"^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ù)組聲明為常量,保存答案運(yùn)行結(jié)果:acbba**
Score
60%acbadScore100%abbda***Score40%bdcba*****Score0%19constcharKEY[]={'a','c','b','a','d'};20二維數(shù)組的聲明及引用數(shù)據(jù)類型標(biāo)識(shí)符[常量表達(dá)式1][常量表達(dá)式2];例:inta[5][3];
表示a為整型二維數(shù)組,
其中第一維有5個(gè)下標(biāo)(0~4)
第二維有3個(gè)下標(biāo)(0~2)
數(shù)組的元素個(gè)數(shù)為5*3=15可以用于存放5行3列的整型數(shù)據(jù)矩陣。
數(shù)組行標(biāo)列標(biāo)21存儲(chǔ)順序按行存放,上例中數(shù)組a的存儲(chǔ)順序?yàn)椋?/p>
二維數(shù)組的聲明類型說(shuō)明符數(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ù)寫在一個(gè){}內(nèi),按順序賦值例如:給出全部元素時(shí),第一維下標(biāo)個(gè)數(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}};可以對(duì)部分元素賦初值例如: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實(shí)型(浮點(diǎn)型)單精度型float雙精度型doubleASCII25內(nèi)存地址:理解C++指針的基礎(chǔ)內(nèi)存儲(chǔ)器以字節(jié)為基本存儲(chǔ)單元,進(jìn)行編號(hào)——內(nèi)存地址。內(nèi)存空間的訪問(wèn)方式通過(guò)變量名訪問(wèn):存取變量?jī)?nèi)容通過(guò)地址訪問(wèn):沒(méi)有變量名或不方便使用變量名(如,程序運(yùn)行時(shí),動(dòng)態(tài)創(chuàng)建數(shù)組)
指針26內(nèi)存地址:理解C++指針的基礎(chǔ)取地址運(yùn)算符:&例:intvar;則&var
表示變量var在內(nèi)存中的起始地址#include<iostream>usingnamespacestd;intmain(){ inti=0; cout<<&i<<endl; return0;}
指針27聲明:
數(shù)據(jù)類型*標(biāo)識(shí)符;
概念
指針:內(nèi)存地址,用于
間接訪問(wèn)內(nèi)存單元
指針變量:
用于存放內(nèi)存地址
指針指針的概念32位計(jì)算機(jī),地址長(zhǎng)度32位。指針本身的數(shù)據(jù)值都是unsignedlongint型。聲明指針時(shí)需要明確指出它用于存放什么類型數(shù)據(jù)的地址。28定義:
數(shù)據(jù)類型*標(biāo)識(shí)符;如:inti=3,j=6;int*ptr;ptr=&i;
概念
指針:內(nèi)存地址,用于
間接訪問(wèn)內(nèi)存單元
指針變量:
用于存放內(nèi)存地址內(nèi)存用戶數(shù)據(jù)區(qū)變量i變量j變量
ptr362000200020043010
指針指針的概念32位計(jì)算機(jī),地址長(zhǎng)度32位。指針本身的數(shù)據(jù)值都是unsignedlongint型。29語(yǔ)法形式
數(shù)據(jù)類型*指針名=初始地址;
指針名=地址;注意事項(xiàng)用&取變量地址作為初值時(shí),該變量必須在指針初始化之前已聲明過(guò),且變量類型應(yīng)與指針類型一致??梢杂靡粋€(gè)已賦初值的指針變量去初始化另一個(gè)指針變量。
指針指針的定義、賦值與使用30inta,b;int*pa,*pb=&b,*ppa;pa=&a;ppa=pa;*
聲明指針變量&
取地址運(yùn)算符:獲取變量?jī)?nèi)存中的起始地址可以用一個(gè)已賦初值的指針去初始化另一個(gè)指針變量。多個(gè)指針指向同一個(gè)變量。指針的定義、賦值與使用31*聲明指針變量int*ptr;指針運(yùn)算符:訪問(wèn)指針?biāo)赶蜃兞康膬?nèi)容。*ptr=3;&聲明引用(3.3節(jié)):int&k=i;取地址運(yùn)算符:cout<<&i<<endl;獲取變量?jī)?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【*指針(間接)運(yùn)算符】:訪問(wèn)指針(變量)所指向的變量inti;int*ptr=&i;*ptr=1033【*指針(間接)運(yùn)算符】:訪問(wèn)指針(變量)所指向的變量?jī)?nèi)容。ptr*ptri3000指針的定義、賦值與使用10300034指向”常量”的指針不能通過(guò)指針來(lái)改變所指對(duì)象的值,但指針本身可以改變,可以指向另外的對(duì)象。例inta;constint*p1=&a; //p1是指向”常量”的指針intb;p1=&b; //正確,p1本身的值可以改變*p1=1; //編譯時(shí)出錯(cuò),不能通過(guò)p1改變所指的對(duì)象
指針errorC3892:“p1”:不能給常量賦值35指針類型的常量若聲明指針常量,則指針本身的值不能被改變,聲明時(shí)指定初始化地址。例:inta,b;int*constp2=&a;p2=&b;//錯(cuò)誤,p2是指針常量,值不能改變
指針36指針的各種運(yùn)算指針是一種數(shù)據(jù)類型,指針變量可以參與部分運(yùn)算算術(shù)運(yùn)算關(guān)系運(yùn)算賦值運(yùn)算
指針37指針變量的算術(shù)運(yùn)算指針與整數(shù)的加減運(yùn)算指針p加上或減去n,其意義是指針當(dāng)前指向位置的前方或后方第n個(gè)數(shù)據(jù)的地址。這種運(yùn)算的結(jié)果值取決于指針指向的數(shù)據(jù)類型。*(p+n)等價(jià)于p[n]指針加一,減一運(yùn)算指向下一個(gè)或前一個(gè)數(shù)據(jù)。例如:y=*px++
相當(dāng)于y=*(px++)
(*和++優(yōu)先級(jí)相同,自右向左運(yùn)算)
指針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個(gè)數(shù)據(jù)的地址。指針p減去n——指針當(dāng)前指向位置后方第n個(gè)數(shù)據(jù)的地址。指向short類型的指針,每次移動(dòng)2個(gè)字節(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類型的指針,每次移動(dòng)4個(gè)字節(jié)連續(xù)內(nèi)存空間中的同類數(shù)據(jù)40指針變量的算術(shù)運(yùn)算指針與整數(shù)的加減運(yùn)算指針p加上或減去n,其意義是指針當(dāng)前指向位置的前方或后方第n個(gè)數(shù)據(jù)的地址。*(p1+n1)等價(jià)于p1[n1]指針加一,減一運(yùn)算指向下一個(gè)或前一個(gè)數(shù)據(jù)。
指針指針的算術(shù)運(yùn)算和數(shù)組的使用相關(guān)(適合處理連續(xù)內(nèi)存空間中的同類數(shù)據(jù))41指針與數(shù)組的關(guān)系inta[10];int*ptr=a;數(shù)組名表示的數(shù)組首地址來(lái)初始化化指針。數(shù)組名是一個(gè)指針常量,不能被賦值。數(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;通過(guò)指針引用數(shù)組元素經(jīng)過(guò)上述聲明及賦值后:*pa就是a[0],*(pa+1)就是a[1],...,*(pa+i)就是a[i].a[i],*(pa+i),*(a+i),pa[i]都是等效的。不能寫a++,因?yàn)閍是數(shù)組首地址是指針常量。
指針43用指針處理數(shù)組元素?cái)?shù)組名是一個(gè)指針常量,不能被賦值。數(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è)有一個(gè)int型數(shù)組a,有10個(gè)元素。用三種方法輸出各元素:1、使用數(shù)組名和下標(biāo)2、使用數(shù)組名和指針運(yùn)算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ù)組名指針運(yùn)算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++,因?yàn)閍是數(shù)組首地址是常量49關(guān)系運(yùn)算指向相同類型數(shù)據(jù)的指針之間可以進(jìn)行各種關(guān)系運(yùn)算。相等——指向同一個(gè)地址。指針可以和零之間進(jìn)行等于或不等于的關(guān)系運(yùn)算。p==0或p!=00,表示空指針,NULL以下關(guān)系運(yùn)算是無(wú)意義的:指向不同數(shù)據(jù)類型的指針指針與非0整數(shù)變量之間。指針變量的關(guān)系運(yùn)算
指針50賦值運(yùn)算向指針變量賦的值必須是:類型要一致1、&變量2、數(shù)組名3、指針變量4、整數(shù)0,表示空指針,NULL,不指向任何地址int*p=NULL;沒(méi)有明確的地址值可以賦值時(shí),為了防止出現(xiàn)不可預(yù)見的錯(cuò)誤,將指針設(shè)置為NULL。不能是非0的整數(shù)。指針變量的賦值運(yùn)算
指針51指針數(shù)組數(shù)組的元素是同一類型的指針。數(shù)據(jù)類型*數(shù)組名[整型常量表達(dá)式];例:int*pa[2];
由pa[0],pa[1]兩個(gè)指針組成
指針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]<<""; //逐個(gè)輸出二維數(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)<<""; //逐個(gè)輸出二維數(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)<<""; //逐個(gè)輸出二維數(shù)組第i行元素值
cout<<endl;}return0;}
指針*(array2[i]+i)、array2[i][j]等效*(array2+i)、array2[i]等效程序的輸出結(jié)果為:1112132122233132336263動(dòng)態(tài)內(nèi)存分配n個(gè)整數(shù)的序列如何存儲(chǔ)和處理?n=?動(dòng)態(tài)存儲(chǔ)分配程序運(yùn)行前,并不能確切地知道數(shù)組中會(huì)有多少個(gè)元素。c++中,動(dòng)態(tài)內(nèi)存分配技術(shù)保證程序在運(yùn)行過(guò)程中按照實(shí)際需要申請(qǐng)適量的內(nèi)存,使用結(jié)束后還可以釋放。64動(dòng)態(tài)申請(qǐng)內(nèi)存操作符newnew類型名T(初始化參數(shù))功能:在程序執(zhí)行期間,申請(qǐng)用于存放T類型對(duì)象的內(nèi)存空間,并依初值列表賦以初值。
int*point=newint(2);結(jié)果值:成功:T類型的指針,指向新分配的內(nèi)存;失敗:拋出異常。
動(dòng)態(tài)存儲(chǔ)分配65動(dòng)態(tài)申請(qǐng)內(nèi)存操作符newnew類型名T(初始化參數(shù))int*point=newint(2);int*point=newint();//初始化為0int*point=newint;//無(wú)初值,隨機(jī)數(shù)
動(dòng)態(tài)存儲(chǔ)分配66釋放內(nèi)存操作符deletedelete指針p功能:釋放指針p所指向的內(nèi)存。
p必須是new操作的返回值。int*point=newint(2);……deletepoint;
動(dòng)態(tài)存儲(chǔ)分配申請(qǐng)和釋放動(dòng)態(tài)一維數(shù)組分配:new類型名T[數(shù)組長(zhǎng)度]
數(shù)組長(zhǎng)度可以是任何得到正整數(shù)的表達(dá)式,在運(yùn)行時(shí)計(jì)算,返回?cái)?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動(dòng)態(tài)創(chuàng)建多維數(shù)組new類型名T[第1維長(zhǎng)度][第2維長(zhǎng)度]…;如果內(nèi)存申請(qǐng)成功,new運(yùn)算返回一個(gè)指向新分配內(nèi)存首地址的指針
char(*fp)[3];//一維char類型數(shù)組的指針fp=newchar[2][3];
動(dòng)態(tài)存儲(chǔ)分配【正整數(shù)表達(dá)式】【正整數(shù)常量表達(dá)式】2個(gè)元素的一維數(shù)組每個(gè)元素都是char[3]T類型數(shù)組的指針指針數(shù)組.VS.數(shù)組指針
--------------指針數(shù)組-----------------
char*p[6];//指針數(shù)組
含有6個(gè)指針元素,每一個(gè)元素都是char指針
70--------------指針數(shù)組-----------------
char*p[6];含有6個(gè)指針元素,每一個(gè)元素都是char指針p[0]p[1]p[2]p[3]p[4]p[5]71pchar類型的指針指針數(shù)組.VS.數(shù)組指針
--------------指針數(shù)組-----------------
char*p[6];//指針數(shù)組
含有6個(gè)指針元素,每一個(gè)元素都是char指針
--------------數(shù)組指針(P74)------------
//含6個(gè)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個(gè)元素的一維數(shù)組,每個(gè)元素都是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ù)組長(zhǎng)度3*(*(fp+1)+1)*(*(fp+0)+0)fp[i][j]<=>*(*(fp+i)+j)fp*(*(fp+0)+2)*(fp+1)2個(gè)int[3]75例,動(dòng)態(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);
動(dòng)態(tài)存儲(chǔ)分配8個(gè)float[9][8]*(cp+i)第i個(gè)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ù)組名使用,通過(guò)數(shù)組名和下標(biāo)訪問(wèn)數(shù)組元素77例,動(dòng)態(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;
}}
動(dòng)態(tài)存儲(chǔ)分配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)存在的變量的別名。與變量占用同一塊存儲(chǔ)空間。類型名&別名=目標(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)存在的變量的別名。與變量占用同一塊存儲(chǔ)空間?!菊f(shuō)明】1、表達(dá)式和常量不能定義別名。2、引用必須初始化,“從一而終”。3、變量的引用不會(huì)分配存儲(chǔ)空間。類型名&別名=目標(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};
//()不能少,
元素個(gè)數(shù)必須與數(shù)組a的一致 int(&ra)[5]=a;
for(inti=0;i<5;i++) cout<<ra[i]<<"\t"; cout<<endl;
return0;}指針數(shù)組.VS.數(shù)組指針
--------------數(shù)組的引用---------------
//()不能少,元素個(gè)數(shù)必須與數(shù)組a的一致int(&ra)[5]=a;
ra[i]<==>a[i]
--------------數(shù)組指針(P74)------------
//含6個(gè)int元素一維數(shù)組的指針
char(*p)[6];
chara[6];p=&a;
84char(*p)[6];//數(shù)組指針,6個(gè)元素的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、指針可以從指向一個(gè)變量,轉(zhuǎn)到指向另一個(gè)變量。指向不確定是,可以設(shè)置為空指針NULL。用字符數(shù)組存儲(chǔ)和處理字符串字符數(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ù)組存儲(chǔ)和處理字符串字符數(shù)組的定義:字符數(shù)組的初始化:88
字符串char字符數(shù)組名[整型常量表達(dá)式];#include<iostream>usingnamespacestd;intmain(){ charstr[8]="司馬相如"; return0;}用字符數(shù)組存儲(chǔ)和處理字符串字符數(shù)組的賦值與引用:89
字符串chars[5];s={'C','+','+'}; //不能對(duì)整個(gè)數(shù)組賦值s={"C++"}; //不能對(duì)整個(gè)數(shù)組賦值s="C++";
//不能對(duì)整個(gè)數(shù)組賦值//只能對(duì)數(shù)組元素賦值s[0]='C';s[1]='+';s[2]='+';只能對(duì)數(shù)組元素賦值不能對(duì)整個(gè)數(shù)組賦值用字符數(shù)組存儲(chǔ)和處理字符串字符數(shù)組的賦值與引用:90
字符串 chars[5]; s={'C','+','+'}; //不能對(duì)整個(gè)數(shù)組賦值 s={"C++"}; //不能對(duì)整個(gè)數(shù)組賦值 s="C++";
//不能對(duì)整個(gè)數(shù)組賦值 //只能對(duì)數(shù)組元素賦值 s[0]='C';s[1]='+';s[2]='+';只能對(duì)數(shù)組元素賦值不能對(duì)整個(gè)數(shù)組賦值用字符數(shù)組存儲(chǔ)和處理字符串字符數(shù)組的輸入與輸出:91
字符串1、逐個(gè)字符輸入輸出,與普通數(shù)組一樣.用字符數(shù)組存儲(chǔ)和處理字符串字符數(shù)組的輸入與輸出:92
字符串2、利用cin或cout將整個(gè)字符串一次性輸入或輸出.#include<iostream>usingnamespacestd;intmain(){ charname[10]; cin>>name; cout<<"Name="<<name<<endl; return0;}//數(shù)組名//鍵盤輸入的字符串應(yīng)短于字符數(shù)組長(zhǎng)度//空格、回車、Tab鍵作為結(jié)束標(biāo)志用字符數(shù)組存儲(chǔ)和處理字符串字符數(shù)組的輸入與輸出:93
字符串3、通過(guò)getline輸入一整行內(nèi)容.cin.getline(字符數(shù)組名,數(shù)組長(zhǎng)度,結(jié)束字符)其中,“結(jié)束字符”缺省為'\n'#include<iostream>usingnamespacestd;intmain(){ chars[10];
//輸入字符個(gè)數(shù)超過(guò)7或者遇到字符'.' cin.getline(s,7,'.'); cout<<s<<endl; return0;}用字符數(shù)組存儲(chǔ)和處理字符串字符指針的定義:94
字符串1、指向字符串常量char*p
="program";2、
指向字符數(shù)組chars[20]={“IloveC++"};
char*p;p
=s;3、指向動(dòng)態(tài)創(chuàng)建的字符數(shù)組
char*p
=newchar[20];char*字符指針名;字符數(shù)組.VS.字符指針
----------------字符數(shù)組-----------------
1、存放全部字符;
----------------字符指針-----------------
1、存放存儲(chǔ)字符串的區(qū)域的首地址;
95#include<iostream>usingnamespacestd;intmain(){ chars[20]="C++程序設(shè)計(jì)"; 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ù)組表示字符串的缺點(diǎn)用字符數(shù)組表示字符串的缺點(diǎn)執(zhí)行連接、拷貝、比較等操作,都需要顯式調(diào)用庫(kù)函數(shù),很麻煩.當(dāng)字符串長(zhǎng)度很不確定時(shí),需要用new動(dòng)態(tài)創(chuàng)建字符數(shù)組,最后要用delete釋放,很繁瑣.字符串實(shí)際長(zhǎng)度大于為它分配的空間時(shí),會(huì)產(chǎn)生數(shù)組下標(biāo)越界的錯(cuò)誤.解決方法使用字符串類string表示字符串.string實(shí)際上是對(duì)字符數(shù)組操作的封裝.96
字符串string的定義//包含C++標(biāo)準(zhǔn)庫(kù)中的string頭文件#include<string>
//建立一個(gè)空字符串strings1;
//字符串初始化strings2=“C++Language";
97
字符串string的長(zhǎng)度和內(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、賦予一個(gè)字符串常量
strings1="program";2、用string變量賦值
strings2; s2=s1;3、對(duì)string變量中的某一個(gè)字符進(jìn)行操作 stringword="man"; word[1]='e';string變量的運(yùn)算常用操作符s+t
將串s和t連接成一個(gè)新串s=t
用t更新s,t——字符串常量、string對(duì)象,字符數(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]
訪問(wèn)串中下標(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; //比較運(yùn)算符的測(cè)試
if(s1<="ABC") cout<<"s1<=\"ABC\""<<endl; else cout<<"s1>\"ABC\""<<endl; //連接運(yùn)算符的測(cè)試
s2+=s1; cout<<"s2=s2+s1:"<<s2<<endl; cout<<"lengthofs2:"<<s2.length()<<endl; return0;}102用getline輸入整行字符串輸入整行字符串用cin的>>操作符輸入字符串,會(huì)以空格作為分隔符,空格后的內(nèi)容會(huì)在下一回輸入時(shí)被讀?。挥胹tring頭文件中的getline可以輸入整行字符串,例如:getline(cin,s2);103
字符串用getline輸入整行字符串以其它字符作為分隔符輸入字符串輸入字符串時(shí),可以使用其它分隔符作為字符串結(jié)束的標(biāo)志(例如逗號(hào)、分號(hào))把分隔符作為getline的第3個(gè)參數(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]={ "三國(guó)演義", "紅樓夢(mèng)", "射雕英雄傳" }; for(inti=0;i<3;i++) cout<<BookName[i]<<endl; return0;}107枚舉類型—enum數(shù)據(jù)只有有限的幾種可能取值:一個(gè)星期:星期一、星期二、…、星期日性別:男、女學(xué)歷:???、本科、碩士、博士可以用int、char等基本數(shù)據(jù)類型來(lái)表示,但需要進(jìn)行合法性檢查如,0-男、1-女、2-表示什么??自定義數(shù)據(jù)類型108枚舉類型—enum枚舉類型的聲明形式如下:enum枚舉類型名{變量值列表};只要將需要的變量值一一列舉出來(lái),便構(gòu)成了一個(gè)枚舉類型。例如:enumWeekday{SUN,MON,TUE,WED,THU,FRI,SAT};自定義數(shù)據(jù)類型枚舉元素109枚舉類型—enum枚舉類型應(yīng)用說(shuō)明:對(duì)枚舉元素按常量處理,不能對(duì)它們賦值。例如,不能寫:SUN=0;
枚舉元素具有缺省值,它們依次為:0,1,2,......。也可以在聲明時(shí)另行指定枚舉元素的值,如:enumweekday{sun=7,mon=1,tue,wed,thu,fri,sat};枚舉值可以進(jìn)行關(guān)系運(yùn)算。
整數(shù)值不能直接賦給枚舉變量,如需
要將整數(shù)賦值給枚舉變量,應(yīng)進(jìn)行強(qiáng)
制類型轉(zhuǎn)換。自定義數(shù)據(jù)類型110例設(shè)某次體育比賽的結(jié)果有四種可能:勝(win)、負(fù)(lose)、平局(tie)、比賽取消(cancel),編寫程序順序輸出這四種情況。分析:由于比賽結(jié)果只有四種可能,所以可以聲明一個(gè)枚舉類型,聲明一個(gè)枚舉類型的變量來(lái)存放比賽結(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 領(lǐng)導(dǎo)力與管理技能培訓(xùn)
- 低溫多效海水淡化裝置相關(guān)行業(yè)投資規(guī)劃報(bào)告
- 如何制定靈活的生產(chǎn)安排計(jì)劃
- 餐廳員工職業(yè)發(fā)展計(jì)劃培訓(xùn)
- 2024-2025學(xué)年年八年級(jí)數(shù)學(xué)人教版下冊(cè)專題整合復(fù)習(xí)卷第21章 二次根式 荔灣區(qū)金道中學(xué)單元檢測(cè)AB卷(含答案)
- 8物北師期末阜陽(yáng)市臨泉縣2023-2024學(xué)年八年級(jí)上學(xué)期期末考試物理試題
- 《數(shù)字影像特征匹配》課件
- 文明科室評(píng)選報(bào)告范文
- 企業(yè)動(dòng)態(tài)報(bào)告范文
- 應(yīng)用文報(bào)告的范文
- 湖南省岳陽(yáng)市2023-2024學(xué)年高一上學(xué)期1月期末聯(lián)考物理試題 含解析
- 涉水作業(yè)安全指導(dǎo)手冊(cè)
- 北京市道德與法治初二上學(xué)期期末試題與參考答案(2024年)
- 人教版數(shù)學(xué)五年級(jí)上冊(cè)期末考試試卷附答案
- 世界一流港口綜合評(píng)價(jià)報(bào)告
- 高三英語(yǔ)一輪復(fù)習(xí)備考實(shí)踐經(jīng)驗(yàn)分享 課件
- 肛周膿腫 課件
- 【論電子商務(wù)對(duì)現(xiàn)代生活的影響(論文)3300字】
- 山東文旅集團(tuán)有限公司招聘筆試題庫(kù)2024
- 課外文言文閱讀 專項(xiàng)訓(xùn)練-2025年中考語(yǔ)文復(fù)習(xí)突破(江蘇專用)(解析版)
評(píng)論
0/150
提交評(píng)論