課件-第5章構(gòu)造數(shù)據(jù)類型newnew_第1頁
課件-第5章構(gòu)造數(shù)據(jù)類型newnew_第2頁
課件-第5章構(gòu)造數(shù)據(jù)類型newnew_第3頁
課件-第5章構(gòu)造數(shù)據(jù)類型newnew_第4頁
課件-第5章構(gòu)造數(shù)據(jù)類型newnew_第5頁
已閱讀5頁,還剩66頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第5章構(gòu)造數(shù)據(jù)類型C++語言程序設(shè)計教程第5章構(gòu)造數(shù)據(jù)類型制作人:沈顯君楊進才第5章構(gòu)造數(shù)據(jù)類型1.掌握枚舉類型的使用;2.深入理解數(shù)組的概念,掌握數(shù)組應(yīng)用的一般方法;3.深入理解指針的概念,掌握指針的使用;4.注意指針與數(shù)組的區(qū)別,會使用多重指針以及指針與數(shù)組的多種混合體,會分配動態(tài)數(shù)組;5.理解字符串的概念,會使用字符串;6.理解引用的概念,掌握引用型函數(shù)參數(shù)的用法;7.掌握結(jié)構(gòu)與聯(lián)合類型的使用,并注意二者的區(qū)別。學(xué)習(xí)目標

C++語言程序設(shè)計教程第5章構(gòu)造數(shù)據(jù)類型5.1枚舉類型—enum

enumeration[i.nju:m?'rei??n]

1.枚舉類型的定義:

“枚舉”()是指將變量所有可能的取值一一列舉出來,變量的取值只限于列舉出來的常量。

枚舉類型的聲明的一般形式如下

:

枚舉類型名以及枚舉常量為標識符,遵循標識符的取名規(guī)則。在定義一個枚舉類型時,定義了多個常量,供枚舉類型變量取值,稱此常量為枚舉常量。當沒給各枚舉常量指定值時,其值依次默認為0、1、2、…;在定義枚舉類型時,也可使用賦值號另行指定枚舉常量的值。

enum枚舉類型名

{枚舉常量1,枚舉常量2,…,枚舉常量n};枚舉!C++語言程序設(shè)計教程第5章構(gòu)造數(shù)據(jù)類型5.1枚舉類型枚舉類型的定義:例1:

enumweekday{SUN,MON,TUE,WED,THU,FRI,SAT};

定義了7個枚舉常量以及枚舉類型weekday。枚舉常量具有默認的整數(shù)與之對應(yīng):SUN的值為0、MON的值為1、TUE為2、…、SAT為6。例2:

enumcity{Beijing,Shanghai,Tianjin=5,Chongqing};枚舉常量Beijing的值為0,Shanghai的值為1,Tianjin的值指定為5。對于指定值后面的沒有指定值的枚舉常量,編譯器會將前一個常量值加1(下一個整數(shù))賦給它,所以Chongqing的值為6。C++語言程序設(shè)計教程第5章構(gòu)造數(shù)據(jù)類型5.1枚舉類型枚舉類型的定義說明:枚舉類型定義了以后就可以使用枚舉常量、使用用枚舉類型來定義變量,定義枚舉變量的方法與定義其它變量的方法一樣。

例如:

enumcitycity1,city2;citycity1,city2;

用兩種方法定義了city1、city2兩個枚舉類型的變量名。枚舉類型變量也可以在定義枚舉類型的同時定義例如:

enumcity{Beijing,Shanghai,Tianjin=5,Chongqing}city1,city2;

在定義枚舉類型的同時定義枚舉類型變量可以省略枚舉類型名例如:

enum{Beijing,Shanghai,Tianjin=5,Chongqing}city1,city2;在定義變量時,可以順便給出初值,若不給初值,默認初值為隨機的無意義的數(shù)。C++語言程序設(shè)計教程第5章構(gòu)造數(shù)據(jù)類型5.1枚舉類型枚舉類型的使用:用枚舉類型建立枚舉變量后就可以對枚舉變量實施賦值以及進行其它運算了,對枚舉變量進行賦值,其值要求為同一枚舉類型。否則,在編譯時出錯。例如:weekdayd1,d2,d3,d4;d1=SUN;d2=6;//錯誤

d3=Shanghai;//錯誤其中對d2所賦之值是整數(shù)6,不是枚舉常量;可以采用將一個整型值強制轉(zhuǎn)換成同類型的枚舉常量賦給枚舉變量:枚舉常量、枚舉類型的變量可進行算術(shù)運算、關(guān)系運算。對枚舉類型實施算術(shù)、關(guān)系運算時,枚舉值轉(zhuǎn)換成整型值參加運算,結(jié)果為整型值。所以,如果要將結(jié)果賦給枚舉變量,還要將結(jié)果轉(zhuǎn)換成枚舉值。例如:

d1=d1+2;//是錯誤的,因為結(jié)果為int型。需要將它強制轉(zhuǎn)換成枚舉型:

d1=(weekday)(d1+2);C++語言程序設(shè)計教程第5章構(gòu)造數(shù)據(jù)類型5.1枚舉類型枚舉類型的使用:

枚舉常量、枚舉類型的變量可直接進行各種形式的關(guān)系運算。例如:

if(city1==3);

if(city2>=Beijing);

if(Shanghai==1);if(city1>SUN);枚舉類型變量不能直接進行輸入例如:

cin>>d1;//錯誤C++語言程序設(shè)計教程第4章函數(shù)注意:枚舉常量是常量,不是變量,所以不能對枚舉常量進行賦值。例如:在上例中不能進行賦值Shanghai=Beijing;枚舉常量的值不是列舉的字符串,其值為整數(shù)。編譯器對賦給枚舉變量的對象(數(shù))進行類型檢查,如類型不相符則發(fā)出警告。當類型相

同,而值超出此類枚舉類型枚舉常量范圍時,也是正常的。123456789101112/*******************************************************************程序名:p5_1.cpp**功能:

枚舉類型的使用,輸入城市代號,輸出城市名稱********************************************************************/#include<iostream>usingnamespacestd;enumcity{Beijing,Shanghai,Tianjin=6,Chongqing};intmain(){intn;cout<<"Inputacitynumber("<<Beijing-1<<"toexit):"<<endl;cin>>n;枚舉類型定義C++語言程序設(shè)計教程第5章構(gòu)造數(shù)據(jù)類型【例5-1】輸入城市代號,輸出城市名稱。

5.1枚舉類型131415161718192021222324

while(n>=Beijing){switch(n){caseBeijing:cout<<"Beijing"<<endl;break;caseShanghai:cout<<"Shanghai"<<endl;break;caseTianjin:cout<<"Tianjin"<<endl;break;caseChongqing:cout<<"Chongqing"<<endl;break;default:cout<<"Invalidcitynumber!"<<endl;break;}cin>>n;}return0;}

運行結(jié)果:Inputacitynumber(-1toexit):1↙Shanghai8↙Invalidcitynumber!-1↙

C++語言程序設(shè)計教程第5章構(gòu)造數(shù)據(jù)類型枚舉類型的使用5.1枚舉類型5.2數(shù)組的概念數(shù)組是具有一定順序關(guān)系的若干相同類型變量的集合體,組成數(shù)組的變量稱為該數(shù)組的元素。數(shù)組屬于構(gòu)造類型。數(shù)組一維數(shù)組的聲明與引用一維數(shù)組的聲明類型說明符數(shù)組名[常量表達式];

例如:inta[10];

表示a為整型數(shù)組,有10個元素:a[0]...a[9]引用必須先聲明,后使用。只能逐個引用數(shù)組元素,而不能一次引用整個數(shù)組

例如:a[0]=a[5]+a[7]-a[2*3]數(shù)組名的構(gòu)成方法與一般變量名相同。數(shù)組一維數(shù)組的聲明與引用#include<iostream>usingnamespacestd;voidmain(){ intA[10],B[10]; inti; for(i=0;i<10;i++) {

A[i]=i*2-1;

B[10-i-1]=A[i]; }數(shù)組

for(i=0;i<10;i++){ cout<<"A["<<i<<"]="<<&A[i]; cout<<"A["<<i<<"]="<<A[i]; cout<<"B["<<i<<"]="<<B[i]<<endl; }}一維數(shù)組的存儲順序數(shù)組元素在內(nèi)存中順次存放,它們的地址是連續(xù)的。例如:具有10個元素的數(shù)組a,在內(nèi)存中的存放次序如下:數(shù)組名字是數(shù)組首元素的內(nèi)存地址。數(shù)組名是一個常量,不能被賦值。a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a數(shù)組一維數(shù)組的初始化可以在編譯階段使數(shù)組得到初值:在聲明數(shù)組時對數(shù)組元素賦以初值。

例如:inta[10]={0,1,2,3,4,5,6,7,8,9};可以只給一部分元素賦初值。

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

例如:inta[]={1,2,3,4,5}數(shù)組#include<iostream>usingnamespacestd;voidmain(){inti;intf[20]={1,1};//初始化第0、1個數(shù)

for(i=2;i<20;i++)f[i]=f[i-2]+f[i-1];//求第2~19個數(shù)

for(i=0;i<20;i++)//輸出,每行5個數(shù)//{if(i%5==0)cout<<endl; cout.width(12);//設(shè)置輸出寬度為12 cout<<f[i];}}例:用數(shù)組來處理求Fibonacci數(shù)列問題例:用數(shù)組來處理求Fibonacci數(shù)列問題運行結(jié)果:

1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765二維數(shù)組的聲明及引用數(shù)據(jù)類型標識符[常量表達式1][常量表達式2]…;例:inta[5][3];

表示a為整型二維數(shù)組,其中第一維有5個下標(0~4),第二維有3個下標(0~2),數(shù)組的元素個數(shù)為15,可以用于存放5行3列的整型數(shù)據(jù)表格。數(shù)組存儲順序按行存放,上例中數(shù)組a的存儲順序為:

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

a[2]——a20a21a22a23a可以理解為:引用例如:b[1][2]=a[2][3]/2

下標不要越界二維數(shù)組的聲明及引用數(shù)組18將所有數(shù)據(jù)寫在一個{}內(nèi),按順序賦值例如:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};分行給二維數(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ù)組19數(shù)組作為函數(shù)參數(shù)數(shù)組元素作實參,與單個變量一樣。數(shù)組名作參數(shù),形、實參數(shù)都應(yīng)是數(shù)組名,類型要一樣,傳送的是數(shù)組首地址。對形參數(shù)組的改變會直接影響到實參數(shù)組。數(shù)組例使用數(shù)組名作為函數(shù)參數(shù)主函數(shù)中初始化一個矩陣并將每個元素都輸出,然后調(diào)用子函數(shù),分別計算每一行的元素之和,將和直接存放在每行的第一個元素中,返回主函數(shù)之后輸出各行元素的和。數(shù)組#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; }}22voidmain(void){ 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]}23運行結(jié)果:123423453456Sumofrow0is10Sumofrow1is14Sumofrow2i3指針:關(guān)于內(nèi)存地址內(nèi)存空間的訪問方式通過變量名訪問通過地址訪問地址運算符:&例:intvar;則&var

表示變量var在內(nèi)存中的起始地址聲明例:inti;int*i_pointer=&i;

指向整型變量的指針指針變量的概念概念指針:內(nèi)存地址,用于

間接訪問內(nèi)存單元指針變量:

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

i_pointer362000200020043010引用例1:i=3;例2:*i_pointer=3;指針指針變量的初始化語法形式

存儲類型數(shù)據(jù)類型*指針名=初始地址;例:int*pa=&a;注意事項用變量地址作為初值時,該變量必須在指針初始化之前已說明過,且變量類型應(yīng)與指針類型一致??梢杂靡粋€已賦初值的指針去初始化另一個指針變量。指針指針變量的賦值運算指針名=地址“地址”中存放的數(shù)據(jù)類型與指針類型必須相符。向指針變量賦的值必須是地址常量或變量,不能是普通整數(shù)。但可以賦值為整數(shù)0,表示空指針。指針的類型是它所指向變量的類型,而不是指針本身數(shù)據(jù)值的類型,任何一個指針本身的數(shù)據(jù)值都是unsignedlongint型。允許聲明指向void類型的指針。該指針可以被賦予任何類型對象的地址。例:void*general;指針例指針的聲明、賦值與使用#include<iostream>usingnamespacestd;voidmain(){ int*i_pointer; //聲明int型指針i_pointer inti; //聲明int型數(shù)i i_pointer=&i; //取i的地址賦給i_pointer i=10; //int型數(shù)賦初值

cout<<"Outputinti="<<i<<endl;//輸出int型數(shù)的值

cout<<"Outputintpointeri="<<*i_pointer<<endl;//輸出int型指針所指地址的內(nèi)容}指針程序運行的結(jié)果是:Outputinti=10Outputintpointeri=1030指針變量的算術(shù)運算指針與整數(shù)的加減運算指針p加上或減去n,其意義是指針當前指向位置的前方或后方第n個數(shù)據(jù)的地址。這種運算的結(jié)果值取決于指針指向的數(shù)據(jù)類型。指針加一,減一運算指向下一個或前一個數(shù)據(jù)。例如:y=*px++相當于y=*(px++)

(*和++優(yōu)先級相同,自右向左運算)指針papa-2pa-1pa+1pa+2pa+3*(pa-2)*pa*(pa+1)*(pa+2)*(pa+3)*(pa-1)short*pa32pb-1pbpb+1pb+2*(pb-1)*pb*(pb+1)*(pb+2)long*pb33關(guān)系運算指向相同類型數(shù)據(jù)的指針之間可以進行各種關(guān)系運算。指向不同數(shù)據(jù)類型的指針,以及指針與一般整數(shù)變量之間的關(guān)系運算是無意義的。指針可以和零之間進行等于或不等于的關(guān)系運算。例如:p==0或p!=0賦值運算向指針變量賦的值必須是地址常量或變量,不能是普通整數(shù)。但可以賦值為整數(shù)0,表示空指針。指針變量的關(guān)系運算指針指向數(shù)組元素的指針聲明與賦值例:inta[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ù)組首地址是常量。指針例設(shè)有一個int型數(shù)組a,有10個元素。用三種方法輸出各元素:使用數(shù)組名和下標使用數(shù)組名和指針運算使用指針變量指針main(){inta[10];inti;for(i=0;i<10;i++)cin>>a[i];cout<<endl;for(i=0;i<10;i++)cout<<a[i];}使用數(shù)組名和下標37main(){inta[10];inti;for(i=0;i<10;i++)cin>>a[i];cout<<endl;for(i=0;i<10;i++)cout<<*(a+i);}使用數(shù)組名指針運算使用指針變量main(){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;}指針數(shù)組數(shù)組的元素是指針型例:int*pa[2];

由pa[0],pa[1]兩個指針組成指針例利用指針數(shù)組存放單位矩陣#include<iostream>usingnamespacestd;voidmain(){ intline1[]={1,0,0};//聲明數(shù)組,矩陣的第一行

intline2[]={0,1,0};//聲明數(shù)組,矩陣的第二行

intline3[]={0,0,1};//聲明數(shù)組,矩陣的第三行

int*p_line[3]; //聲明整型指針數(shù)組

p_line[0]=line1; //初始化指針數(shù)組元素

p_line[1]=line2; p_line[2]=line3;指針

//輸出單位矩陣

cout<<"Matrixtest:"<<endl; for(inti=0;i<3;i++) //對指針數(shù)組元素循環(huán)

{ for(intj=0;j<3;j++) //對矩陣每一行循環(huán)

{cout<<p_line[i][j]<<"";} cout<<endl; }}輸出結(jié)果為:Matrixtest:1,0,00,1,00,0,142以指針作為函數(shù)參數(shù)以地址方式傳遞數(shù)據(jù),可以用來返回函數(shù)處理結(jié)果。實參是數(shù)組名時形參可以是指針。

指針與函數(shù)例題目:讀入三個浮點數(shù),將整數(shù)部分和小數(shù)部分分別輸出#include<iostream>usingnamespacestd;voidsplitfloat(floatx,int*intpart,

float*fracpart){//形參intpart、fracpart是指針

*intpart=int(x); //取x的整數(shù)部分

*fracpart=x-*intpart;//取x的小數(shù)部分}

指針與函數(shù)voidmain(void){ 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; }}45運行結(jié)果:Enterthree(3)floatingpointnumbers4.7IntegerPartis4FractionPartis0.78.913IntegerPartis8FractionPartis0.913-4.7518IntegerPartis-4FractionPartis-0.751846指針型函數(shù)當函數(shù)的返回值是地址時,該函數(shù)就是指針形函數(shù)。聲明形式存儲類型數(shù)據(jù)類型*函數(shù)名()int*getAddress(inti){return&i;}

指針與函數(shù)聲明形式存儲類型數(shù)據(jù)類型(*函數(shù)指針名)();

含義:數(shù)據(jù)指針指向數(shù)據(jù)存儲區(qū),而函數(shù)指針指向的是程序代碼存儲區(qū)。指向函數(shù)的指針

指針與函數(shù)例函數(shù)指針#include<iostream>usingnamespacestd;voidprint_stuff(floatdata_to_ignore);voidprint_message(floatlist_this_data);voidprint_float(floatdata_to_print);void(*function_pointer)(float); voidmain() { floatpi=(float)3.14159; floattwo_pi=(float)2.0*pi;

指針與函數(shù)

print_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);}50voidprint_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;}51運行結(jié)果:Thisistheprintstufffunction.Thisistheprintstufffunction.Thedatatobelistedis6.283180Thedatatobelistedis13.000000Thedatatobeprintedis3.141590Thedatatobeprintedis3.14159052動態(tài)內(nèi)存分配

在C++中,動態(tài)內(nèi)存分配技術(shù)可以保證程序在運行過程中根據(jù)實際需要申請適量的內(nèi)存,使用結(jié)束后還可以釋放。C++通過new運算和delete運算來實現(xiàn)動態(tài)內(nèi)存分配。

1.new運算

new運算的作用是按指定類型和大小動態(tài)的分配內(nèi)存?;菊Z法形式為:

其中:數(shù)據(jù)類型可以是基本數(shù)據(jù)類型,也可以是用戶自定義的復(fù)雜數(shù)據(jù)類型。

new運算符在堆(內(nèi)存)中創(chuàng)建一個由類型名指定類型的對象,如果創(chuàng)建成功,

返回對象的地址;否則返回空指針NULL。初值列表給出被創(chuàng)建對象的初始值。由于返回的是地址,所以要用事先定義一個類型相同的指針變量來存儲這個地址。指針變量=new類型名(初值列表);delete指針變量;C++語言程序設(shè)計教程第5章構(gòu)造數(shù)據(jù)類型動態(tài)內(nèi)存分配1)new創(chuàng)建指定類型對象

例①:int

*ip;ip=new

int(5);//ip指向1個初值為5的int型對象也可以使用一條語句定義:int*ip=newint(5);deleteip;C++語言程序設(shè)計教程第5章構(gòu)造數(shù)據(jù)類型說明:

首先定義了一個整型指針ip;然后申請內(nèi)存,創(chuàng)建一個int型數(shù)據(jù)對象,并將該數(shù)據(jù)對象初始化為5;最后返回創(chuàng)建的數(shù)據(jù)對象的地址,存入ip。動態(tài)內(nèi)存分配2)new創(chuàng)建動態(tài)數(shù)組時

使用new運算可創(chuàng)建一個數(shù)據(jù)對象,也可以創(chuàng)建同類型的多個對象----數(shù)組。由于數(shù)組大小可以動態(tài)給定,所創(chuàng)建的對象稱為動態(tài)數(shù)組。new創(chuàng)建動態(tài)數(shù)組時,需要給出數(shù)組的結(jié)構(gòu)說明。

其語法格式如下:

其中:下標表達式與數(shù)組初始化時的常量表達式不同,可以是變量表達式。用new申請失敗時,返回NULL。申請一個動態(tài)數(shù)組,往往需要較大的空間,因此,在程序中需要對new的返回值進行判斷,看是否申請成功。例②:

int

*pa;pa=new

int

[5];//pa指向5個未初始化的int型數(shù)據(jù)對象的首地址

delete[]pa;C++語言程序設(shè)計教程第5章構(gòu)造數(shù)據(jù)類型指針變量=new類型名[下標表達式];delete[]指針變量;5.3.7指針常量與常指針

1.指針常量

指針是常量指針常量是相對于指針變量而言的,也就是指針值不能被修改的指針。如果在定義指針變量時,指針變量前用const修飾,被定義的指針變量就變成了一個指針類型的常變量,指針類型的常變量簡稱為指針常量。定義指針常量格式如下:

修飾符const與指針變量緊鄰,說明指針變量不允許修改。既然指針變量的值不能修改,所以一定要在定義時給出初值。

數(shù)據(jù)類型*const指針名=變量名;

C++語言程序設(shè)計教程第5章構(gòu)造數(shù)據(jù)類型修飾符const與指針變量緊鄰,說明指針的值不允許修改,所以一定要在定義時給出初值。

inta=2;intb=3;int*constp=&a; //定義了一個指針常量并初始化

p=&b; //錯誤,指針常量的值為常量,不能指向其它變量

p=NULL; //錯誤,指針常量的值為常量,不能被修改5.3.7指針常量與常指針

因為const修飾的是指針,而不是指針指向的對象的值,所以指針指向的對象的值可以被更改:*p=4;//正確,指針常量所指變量的值可以被修改

C++語言程序設(shè)計教程第5章構(gòu)造數(shù)據(jù)類型

2.常量指針常量的指針如果在定義指針變量時,數(shù)據(jù)類型前用const修飾,被定義的指針變量就是指向常量的指針變量,指向常量的指針變量簡稱為常量指針。定義常量指針的格式如下:

const數(shù)據(jù)類型*指針變量

=變量名;或

數(shù)據(jù)類型

const*指針變量

=變量名;定義一個常量指針后,指針指向的對象的值不能被更改,即不能通過指針來更改所指向的對象的值,但指針本身可以改變,指向另外的對象。

constinta=2;intb=3;constint*p=&a; //定義了一個常量指針并初始化

p=&b; //正確,常量指針可以指向其它變量

p=NULL; //正確,指針常量的值可以被修改5.3.7指針常量與常量指針

因為const修飾的是指針指向的值,而不是指針,所以指針指向的值不能被更改。*p=4;//錯誤,指針常量所指變量的值不可以被修改

const用在數(shù)組的類型前修飾數(shù)組元素,數(shù)組元素為常量的數(shù)組的稱為常量數(shù)組,常量數(shù)組的元素不可改變,也不可將地址賦值給非常量指針。

constinta[3]={1,2,3}; //定義常量數(shù)組

a[0]=0;//錯誤,常量數(shù)組的元素不可修改

int*p=a;//錯誤,常量數(shù)組的地址不能賦給非常量指針C++語言程序設(shè)計教程第5章構(gòu)造數(shù)據(jù)類型注意:常數(shù)組的所有元素必須全部賦初值。

constinta[]={1,2,3};//正確

constchara[]={'1','2','3'};//正確

constinta[10]={1,2,3};//錯誤,常數(shù)組元素沒有全部賦初值

5.3.7指針常量與常指針

3.指向常量的指針常量指針常量保護指針的值不被修改,常量指針保護指針指向的值不被修改,為了將兩者同時保護,可以定義指向常量的指針常量,簡稱為常指針常量。常指針常量是一個指向常量的指針,指針值本身也是一個常量。常指針常量定義格式如下:其中:左邊的const與數(shù)據(jù)類型相結(jié)合,表明數(shù)據(jù)的值是常量;右邊的const用在變量前,表明變量的值是常量。定義一個常指針常量后,修改指針的值與修改指針指向內(nèi)容的值都是錯誤的:

constinta=2;intb=3;int*q=&b;constint*constp=&a;//定義了一個常量指針并初始化

p=&b; //錯誤,常指針常量的值為常量,不能指向其它變量

p=NULL;//錯誤,常指針常量的值為常量,不能被改變*p=b;//錯誤,常指針常量所指的值為常量,不能被改變

p=q; //錯誤,常指針常量的值為常量,不能被改變

q=p;//錯誤,不能將一個常指針賦給非常指針

const數(shù)據(jù)類型*const指針變量

=變量名;或

數(shù)據(jù)類型const*const指針變量=變量名;

C++語言程序設(shè)計教程第5章構(gòu)造數(shù)據(jù)類型注意:常指針類型通常用作函數(shù)的形參,以防止在函數(shù)體內(nèi)通過形參修改實參指向的值,以保護實參。5.4.2引用與函數(shù)

1.引用作為函數(shù)的參數(shù)

當引用作為函數(shù)的形參,在進行函數(shù)調(diào)用時,進行實參與形參的結(jié)合,其結(jié)合過程相當于定義了一個形參對實參的引用。因此,在函數(shù)體內(nèi),對形參進行運算相當于對實參進行運算。與指針相比,引用作為函數(shù)參數(shù)具有兩個優(yōu)點:

函數(shù)體的實現(xiàn)比指針簡單。用指針作為形參,函數(shù)體內(nèi)形參要帶著*參加運算;而用引用作為形參,函數(shù)體內(nèi)參加運算的為形參變量。②調(diào)用函數(shù)語法簡單。用指針作為形參,實參需要取變量的地址;而用引用作為形參,與簡單傳值調(diào)用一樣,實參為變量。C++語言程序設(shè)計教程第5章構(gòu)造數(shù)據(jù)類型1234567891011121314151617181920

21/****************************************p5_12.cpp**用傳引用的方式實現(xiàn)兩個數(shù)交換*****************************************/#include<iostream>usingnamespacestd;voidswap(int&refx,int&refy){inttemp;temp=refx;refx=refy;refy=temp;}intmain(){intx=3,y=5;cout<<"beforeswap:x="<<x<<"y="<<y<<endl;swap(x,y);cout<<"afterswap:x="<<x<<"y="<<y<<endl;return0;}

C++語言程序設(shè)計教程第5章構(gòu)造數(shù)據(jù)類型運行結(jié)果:beforeswap:x=3y=5afterswap:x=5y=35.4.2引用與函數(shù)

2.引用作為函數(shù)的返回值

函數(shù)返回值類型為引用型,在函數(shù)調(diào)用時,若接受返回值的是一個引用變量,相當于定義了一個對返回變量的引用。若接受返回值的是一個非引用變量,函數(shù)返回變量的值賦給接受變量。

如果函數(shù)返回值類型為引用型,則要求返回值為左值。這樣,函數(shù)調(diào)用式可以當作左值。12345678910111213/************************************p5_13.cpp**使用引用作為函數(shù)的返回值*************************************/#include<iostream>usingnamespacestd;intmax1(inta[],intn)//求數(shù)組a[]中元素的最大值{intt=0;for(inti=0;i<n;i++)if(a[i]>a[t])t=i;returna[t]+0;}C++語言程序設(shè)計教程第5章構(gòu)造數(shù)據(jù)類型1415161718192021222324252627

int&max2(inta[],intn)//求數(shù)組a[]中元素的最大值{intt=0;for(inti=0;i<n;i++)if(a[i]>a[t])t=i;returna[t];}int&sum(inta[],intn)//求數(shù)組a[]中元素的和{ints=0;for(inti=0;i<n;i++)s+=a[i];returns;}C++語言程序設(shè)計教程第5章構(gòu)造數(shù)據(jù)類型5.4.2引用與函數(shù)

28293031323334353637

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論