版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第五章構(gòu)造數(shù)據(jù)類型丘志杰電子科技大學計算機學院軟件學院2022/12/211第五章構(gòu)造數(shù)據(jù)類型丘志杰2022/12/191枚舉類型
“枚舉”是指將變量所有可能的取值一一列舉出來,變量的取值只限于列舉出來的常量。枚舉類型的聲明的一般形式如下:當沒給各枚舉常量指定值時,其值依次默認為0、1、2、…;在定義枚舉類型時,也可使用賦值號另行指定枚舉常量的值。
enum枚舉類型名{枚舉常量1,枚舉常量2,…,枚舉常量n};枚舉!枚舉類型“枚舉”是指將變量所有可能的取值一一列舉出來,例:NeedToDo舉例
例:NeedToDo舉例數(shù)組
數(shù)組是一組在內(nèi)存中依次連續(xù)存放的、具有同一類型的數(shù)據(jù)變量所組成的集合體。數(shù)組元素用數(shù)組名與帶方括號的數(shù)組下標一起標識。數(shù)組數(shù)組是一組在內(nèi)存中依次連續(xù)存放的、具有同一類型的數(shù)據(jù)變一維數(shù)組定義與使用
一維數(shù)組定義的一般形式為:
數(shù)據(jù)類型數(shù)組名[常量表達式];說明:數(shù)組元素的類型可以是void型以外的任何數(shù)據(jù)類型。數(shù)組名代表數(shù)組元素在內(nèi)存中的起始地址,是一個地址常量。一維數(shù)組定義與使用一維數(shù)組定義的一般形式為:數(shù)組定義之后,系統(tǒng)會將從內(nèi)存中為其分配一塊連續(xù)的存儲空間,從第1個數(shù)據(jù)元素開始依次存放各個數(shù)組元素。 例如:inta[5];數(shù)組定義之后,系統(tǒng)會將從內(nèi)存中為其分配一塊連續(xù)的存儲一維數(shù)組的初始化
一維數(shù)組初始化的語法形式為: 數(shù)據(jù)類型數(shù)組名[常量表達式]={初值1,初值2,…,初值n};例如:
intarray[3]={5,6,7};intarray2[3]={1,2};一維數(shù)組的初始化一維數(shù)組初始化的語法形式為:存取一維數(shù)組元素的語法形式為:
數(shù)組名[下標表達式];
讀數(shù)組元素的地址通過數(shù)組名來讀取,格式如下:
數(shù)組名+整型表達式;
或
&數(shù)組名[下標表達式];
存取一維數(shù)組元素的語法形式為:使用數(shù)組要注意的地方在使用數(shù)組時最常犯的錯誤是下標越界。數(shù)組名是一個地址常量,不能作為左值(賦值的目標)。因此,不能將一個數(shù)組整體拷貝給另外一個數(shù)組。例如:
inta[5],c[5],i;a=c; //錯誤!
正確的方法是將對應(yīng)的元素進行拷貝:
for(i=0;i<5;i++)a[i]=c[i];
使用數(shù)組要注意的地方在使用數(shù)組時最常犯的錯誤是下標越界。字符數(shù)組與字符串
存放字符型數(shù)據(jù)的數(shù)組稱為字符數(shù)組。
1.用字符進行初始化
例如:
char
s1[]={'C','h','i','n','a'};2.用字符串進行初始化
例如:
char
s2[]="China";字符數(shù)組與字符串存放字符型數(shù)據(jù)的數(shù)組稱為字符數(shù)組。字符數(shù)組的使用
字符數(shù)組也是數(shù)組,我們同樣可以通過數(shù)組名及下標引用數(shù)組中的元素。為方便對字符與字符串的處理,C++提供了許多專門處理字符與字符串的函數(shù)。參看P118表5-1。字符數(shù)組的使用字符數(shù)組也是數(shù)組,我們同樣可以通過數(shù)組名及下指針指針是C++語言最重要特性之一,也是C++的主要難點。指針提供了一種較為直觀的地址操作的手段,正確地使用指針,可以方便、靈活而有效地組織和表示復雜的數(shù)據(jù)。指針指針是C++語言最重要特性之一,也是C++的主要難點。地址與指針地址:當定義一個變量后,內(nèi)存中將會劃出一塊由若干個存儲單元組成的區(qū)域,用于保存該變量的數(shù)據(jù)。在內(nèi)存里每個存儲單元都有各自的編號,稱為地址。指針:在C++中,提供了指針類型,它是一種用于存放內(nèi)存單元地址的變量類型,地址就存儲在這種指針類型的變量中。正因為指針變量存儲的是地址,用它來指明內(nèi)存單元,所以形象地稱這種地址變量為指針。
地址與指針地址:當定義一個變量后,內(nèi)存中將會劃出一塊由若指針變量的定義例如:
int
*ip;//定義了一個int型的指針變量ipfloat
*fp;//定義了一個float型指針變量fptypedefintA[10];A*ap;//定義了一個A類型的指針變量apsizeof(ip)=sizeof(fp)=sizeof(ap)=4;
定義指針變量的格式如下:數(shù)據(jù)類型*變量名;
指針變量的定義例如:定義指針變量的格式如下:數(shù)據(jù)類型指針的初始化與賦值(1)不要將一個非地址常量、變量以及無意義的實際地址賦給指針變量。如:
int*p=100;//int*p=(int*)100;(對嗎?)
int*p=(char*)100;(2)可以使用一個已初始化的指針去給另一個指針賦值,但類型必須一致如果不一致,可進行強制類型轉(zhuǎn)換。
char*p=NULL;int*ip=(int*)p+100;
數(shù)據(jù)類型*指針變量名=初始地址表達式;
指針的初始化與賦值(1)不要將一個非地址常量、變量以及無意義(3)對于基本數(shù)據(jù)類型的變量、數(shù)組元素我們可以使用取地址運算符&來獲得它們的地址,但是也只有類型一致才能賦值。
inta[10];//定義int型數(shù)組
int*i_pointer=a;//定義并初始化int型指針(4)有一種特殊的void類型指針,可以存儲任何的類型地址;但將一個void類型的地址賦值給非void類型的指針變量,要使用類型強制轉(zhuǎn)換。
voidv;//錯誤,不能定義void類型的變量
void*vp;//定義void類型的指針(3)對于基本數(shù)據(jù)類型的變量、數(shù)組元素我們可以使用取地址運算指針運算指針通常進行下列幾種運算:賦值運算、取值運算、算術(shù)運算、相減運算、比較運算。(1)*和&運算
*:指針運算符,&:取地址運算符。
例如:
inta[4]={1,2,3};int*ip=&a[2];cout<<*ip;*ip=100;
指針運算指針通常進行下列幾種運算:賦值運算、取值運算(2)指針與整數(shù)的加減運算
指針的加減運算與普通變量的加減運算不同,由于指針存儲的是變量的內(nèi)存地址,指針加上或減去一個整數(shù)n,表示指針從當前位置向后或向前移動n個sizeof(數(shù)據(jù)類型)長度的存儲單元。因此對于不同的數(shù)據(jù)類型,n的實際大小就不同。(2)指針與整數(shù)的加減運算(3)指針自增、自減運算
指針的自增、自減運算是指針加減運算的特例。指針的自增或自減表示指針從當前位置向后或向前移動sizeof(數(shù)據(jù)類型)長度的存儲單元。
例如:
int*p,a=5;p=&a;p++;//指針p后移4個字節(jié)(3)指針自增、自減運算(4)兩指針相減
當兩個指針指向同一數(shù)組時,兩個指針的相減才有意義。兩個指針相減的結(jié)果為一整數(shù),表示兩個指針之間數(shù)組元素的個數(shù)。
(5)兩個指針的比較運算
兩個指針的比較一般用于下列兩種情況:一是比較兩個指針所指向的對象在內(nèi)存中的位置關(guān)系;二是判斷指針是否為空指針。
(4)兩指針相減void類型指針
指向void類型的指針是一種不確定類型的指針,它可以指向任何類型的變量。實際使用void型指針時,只有通過強制類型轉(zhuǎn)換才能使void型指針得到具體變量的值。在沒有轉(zhuǎn)換前void型指針不能進行指針的算術(shù)運算。例如:
void
*vp;//定義了一個void型指針vp
int
i=6,*ip;
vp=&i;//vp指向整型變量icout<<“i=”<<*vp<<endl;//錯誤
cout<<"i="<<*(int
*)p<<endl;ip=(int
*)vp;//ip指向vp指向的變量i
cout<<"i="<<*ip<<endl;void類型指針指向void類型的指針是一種不確定指針與字符串
字符型指針:
用于存放字符型變量的地址,而字符串的本質(zhì)是以\0結(jié)尾的字符數(shù)組,一個字符型指針存儲了字符數(shù)組的第一個元素的地址,也就存儲了字符串的地址,這個指針就指向了字符串。在定義一個字符數(shù)組時,可以將一個字符串常量作為初值,但將字符串常量作為初值賦給字符數(shù)組和將字符串常量作為初值賦給字符指針變量,二者的含義是不同的。例如:
charstr[5]="abcd";char*p_str="abcd";指針與字符串字符型指針:指針與數(shù)組
1使用指針操作符*存取數(shù)組指針的加減運算的特點使得指針操作符特別適合處理存儲在一段連續(xù)內(nèi)存空間中的同類型數(shù)據(jù)。這樣,使用指針操作符來對數(shù)組及其元素進行操作就非常方便。(1)一維數(shù)組的指針操作
當定義數(shù)組一維數(shù)組Ta[N](T為類型),下式為存取數(shù)組元素a[i]的等效方式:*(a+i);而a+i為a[i]的地址。指針與數(shù)組1使用指針操作符*存取數(shù)組數(shù)組指針
數(shù)組指針是指向數(shù)組的指針。例如:int
(*a_p)[5];等效于下列定義方式:①typedefintI_A[5];②I_A*a_p;數(shù)組指針數(shù)組與函數(shù)
數(shù)組名是一個地址,不能當作一個左值,但是可以作為函數(shù)的形參,接受實參傳送來的地址。當形參接受實參傳送來的地址后,形參數(shù)組與實參共享內(nèi)存中的一塊空間。函數(shù)體通過形參對數(shù)組內(nèi)容的改變會直接作用到實參上。數(shù)組名作為形參是數(shù)組應(yīng)用的一個重要方面。
數(shù)組與函數(shù)數(shù)組名是一個地址,不能當舉例
voidfunc(inta[],intn){ inti; for(i=0;i<n;i++) a[i]+=3;}voidmain(){ inta[]={1,2,3,4}; func(a,4); }
舉例voidfunc(inta[],intn)指向函數(shù)的指針
在程序運行時,不僅數(shù)據(jù)要占用內(nèi)存空間,程序的代碼也被調(diào)入內(nèi)存并占據(jù)一定的內(nèi)存空間。每一個函數(shù)都有函數(shù)名,實際上,這個函數(shù)名就是該函數(shù)的代碼在內(nèi)存的起始地址。
當調(diào)用一個函數(shù)時,編譯系統(tǒng)就是根據(jù)函數(shù)名找到函數(shù)代碼的首地址,從而執(zhí)行這段代碼。由此看來,函數(shù)的調(diào)用形式:函數(shù)名(參數(shù)表),其實質(zhì)就是:函數(shù)代碼首地址(參數(shù)表)。函數(shù)指針:
就是指向某個函數(shù)的指針,它是專門用于存放該函數(shù)代碼首地址的指針變量。一旦定義了某個函數(shù)指針,那么,它就與函數(shù)名有同樣的作用,在程序中就可以象使用函數(shù)名一樣,通過指向該函數(shù)的指針來調(diào)用該函數(shù)。指向函數(shù)的指針在程序運行時,不僅數(shù)據(jù)要占用內(nèi)函數(shù)指針的定義語法形式如下:其中:數(shù)據(jù)類型為函數(shù)指針所指函數(shù)的返回值類型;形參表則列出了該指針所指函數(shù)的形參類型和個數(shù)。函數(shù)指針名與*外面的圓括號()是必須的,如果去掉圓括號,將被解釋為函數(shù)的返回值為指針。
數(shù)據(jù)類型(*函數(shù)指針名)(形參表);
函數(shù)指針的定義語法形式如下:數(shù)據(jù)類型(*函數(shù)指針名)(形
函數(shù)指針在使用之前也要進行賦值,使指針指向一個已經(jīng)存在的函數(shù)代碼的起始地址。語法形式為:
函數(shù)指針名=函數(shù)名;
調(diào)用函數(shù)指針指向的函數(shù)有如下兩種格式:
①函數(shù)指針名(實參表); ②(*函數(shù)指針名)(實參表);
例如:
intadd(inta,intb);//定義函數(shù)
int(*fptr)(inta,intb);//定義函數(shù)指針
fptr=add;//函數(shù)指針賦值函數(shù)指針在使用之前也要進行賦值,使指針指向一個已經(jīng)存在的采用下列任何一種形式調(diào)用函數(shù)add:
add(1,2);
(*fptr)(1,2);
fptr(1,2);說明:雖然三種調(diào)用形式的結(jié)果完全相同,當用指向函數(shù)的指針調(diào)用函數(shù)add()時,習慣上使用
(*fptr)(1,2),因為這種形式能更直觀地說明是用指向函數(shù)的指針來調(diào)用函數(shù)。采用下列任何一種形式調(diào)用函數(shù)add:說明:多重指針
如果已經(jīng)定義了一個指針類型,我們再定義一個指針,用于指向已經(jīng)定義的指針變量,后面定義的指針變量就是一個指向指針的指針變量,簡稱指向指針的指針,這樣的指針也稱二重(級)指針。三重及以上的指針統(tǒng)稱為多重指針。例如:
int**pp;
定義了一個二級指針變量,等效于下列定義方式:
typedefint*P;P*p;
例:inta,*p,**pp;p=&a;pp=&p; 多重指針如果已經(jīng)定義了一個指針類型,我們再定動態(tài)存儲分配和釋放存儲空間C的做法 void* malloc(size_tsize); void free(void*pMemory);例如: char*p=(char*)malloc(100); strcpy(p,”HelloWorld!”); free(p);注意:這里是以字節(jié)計算的單元數(shù)目2022/12/2132動態(tài)存儲分配和釋放存儲空間C的做法注意:這里是以字節(jié)計算的單C++的做法使用運算符new和delete使用形式
type是一個數(shù)據(jù)類型名,p是該類型的指針變量,new的作用就是從堆空間中分配一塊與type類型的數(shù)據(jù)一樣大小的內(nèi)存(如果分配失敗,new返回一個空指針),該內(nèi)存地址被存于指針p中。一旦不想再使用,可以用delete來釋放該內(nèi)存空間。type*p;p=newtype;deletep;2022/12/2133C++的做法使用運算符new和deletetype是一舉例int*p;p=newint;*p=50;deletep;2022/12/2134舉例int*p;2022/12/1934幾點注意使用new申請的內(nèi)存空間是沒有名字的,只能通過指針間接訪問它們。用delete釋放的內(nèi)存空間必須是由new分配的空間,否則執(zhí)行delete時將會導致嚴重的錯誤。例如:int*p;deletep;//出錯int*p,value;p=&value;deletep;//出錯2022/12/2135幾點注意使用new申請的內(nèi)存空間是沒有名字的,只能通過指針間new和delete的典型用法動態(tài)分配和釋放單個數(shù)據(jù)的存儲區(qū)#include<iostream.h>voidmain(){ int*p;p=newint; if(p==NULL){ cout<<“Allocationfailure!\n”; }else{ *p=15; cout<<*p; deletep; }}pp152022/12/2136new和delete的典型用法動態(tài)分配和釋放單個數(shù)據(jù)的存儲區(qū)用new運算符初始化單個數(shù)據(jù)的存儲區(qū)語法為:type*p;P=newtype(初始值);……deletep;幾點說明:是用小括號將初始值括起來。初始值可以是常量、變量、以及表達式。2022/12/2137用new運算符初始化單個數(shù)據(jù)的存儲區(qū)語法為:type*p;舉例#include<iostream.h>voidmain(){ int*p;
p=newint(100); if(p==NULL){ cout<<“Allocationfailure!\n”; }else{ cout<<*p; deletep; }}//如果p=newint(98.5),會怎么樣?注意:初始值必須與相應(yīng)類型一致。p1002022/12/2138舉例#include<iostream.h>注意:初始值必動態(tài)分配一維數(shù)組的存儲空間語法為:type*p;P=newtype[num];……delete[]p;幾點說明:num用于指定數(shù)組大小,可以是常量、變量、以及表達式,并且用中括號括起來。通過p[i]的方式訪問數(shù)組元素。2022/12/2139動態(tài)分配一維數(shù)組的存儲空間語法為:type*p;幾點說明:#include<iostream.h>voidmain(){ inti,*p;
p=newint[100]; if(p==NULL){ cout<<“Allocationfailure!\n”; }else{ for(i=0;i<100;i++)
p[i]=i+1; for(i=0;i<100;i++) cout<<p[i]<<‘‘;
delete[]p; }}p1100Unit99…Unit02022/12/2140#include<iostream.h>p1100Unit幾點說明:new返回的指針指向數(shù)組的起始位置,也就是數(shù)組的第一個元素。用new動態(tài)分配一個數(shù)組時不能對它進行初始化。(呵呵,為什么??)2022/12/2141幾點說明:2022/12/1941引用Reference簡單地說,引用就是給一個單元起一個別名。也就是說,引用與它所引用的變量共享存儲單元。引用主要有以下三種用法:獨立引用作為函數(shù)參數(shù)作為函數(shù)返回類型2022/12/2142引用Reference簡單地說,引用就是給一個單元起一個別獨立引用inti=0,k=8;int&j=i;int*p=&i;j=k;0ijpj是i的引用,i和j是代表同一個單元。這種使用引用的方式稱為獨立引用。在聲明獨立引用時必須對它初始化,這種情況下的別名綁定是永久的。語句”j=k;”
不是試圖使j成為k的別名,而是在給j賦值,即使j的值也就是i的值等于k。2022/12/2143獨立引用inti=0,k=8;0ijpj是i的引用,i初始化獨立引用的幾種方式賦值表達式的右端是一個變量
inta; int&ra=a;賦值表達式的右端是一個常量
float&r1=1.0;//早期的C++版本 constfloat&r2=1.0;//近期C++版本定義常引用
intx=1; constint&rx=x;
rx=98;//錯誤,只能使用rx,不能修改2022/12/2144初始化獨立引用的幾種方式賦值表達式的右端是一個變量2022/引用作為函數(shù)參數(shù)C++和C一樣,都是采用“傳值”的方式向函數(shù)傳遞參數(shù),從而使實際參數(shù)和形式參數(shù)相結(jié)合的。在這種情況下,實參和形參是兩個不同的單元,在結(jié)合時,實參的值將會被拷貝到形參中。2022/12/2145引用作為函數(shù)參數(shù)C++和C一樣,都是采用“傳值”的方式向函數(shù)C++函數(shù)的傳值調(diào)用voidfunc(intnum){ num++;}voidmain(){ intvalue=5;
func(value); cout<<value;}//輸出:5value5(6)num5Stack……Copy…由于“傳值”方式的存在,因此試圖通過改變形參來改變實參的努力是不會成功的。2022/12/2146C++函數(shù)的傳值調(diào)用voidfunc(intnum)va通過傳地址來改變實參為了解決上述問題,在C語言中,可以通過傳遞指針的方式來完成。我們可以通過形參指針間接地改變實參。2022/12/2147通過傳地址來改變實參為了解決上述問題,在C語言中,可以通過傳C語言的傳指針調(diào)用voidfunc(int*pnum){ (*pnum)++;}voidmain(){ intvalue=5;
func(&value); cout<<value;}//輸出:6…valuevalue的地址pnum5(6)Stack……指向此時實參與形參的傳遞為:int*pnum=&value;2022/12/2148C語言的傳指針調(diào)用voidfunc(int*pnum){C++傳遞引用的方式C++采用了比傳遞指針更好的方式:傳遞引用。在這種情況下,形參的名字將被看作是實參的別名(同獨立引用的情況一樣),也就是說,形參就是實參本身。此時對形參的改變也就直接改變了實參。2022/12/2149C++傳遞引用的方式C++采用了比傳遞指針更好的方式:傳遞引C++語言的引用調(diào)用voidfunc(int&pnum){ pnum++;}voidmain(){ intvalue=5;
func(value); cout<<value;}//輸出:6…valuepnum5(6)Stack……此時實參與形參的傳遞為:int&pnum=value;2022/12/2150C++語言的引用調(diào)用voidfunc(int&pnum)引用作為函數(shù)的返回函數(shù)返回引用,實際上返回的是一個存儲單元(變量),即“左值”。因此,如果一個函數(shù)返回引用,那么函數(shù)調(diào)用可以出現(xiàn)在賦值號的左邊。這種情況在C語言里是見不到的。值得注意的是,因為返回的引用是一個存儲單元,所以函數(shù)返回后這個單元的生命期應(yīng)該不會結(jié)束,否則返回值將沒有意義。2022/12/2151引用作為函數(shù)的返回函數(shù)返回引用,實際上返回的是一個存儲單元(舉例int&f(int*pint){ return*pint;}voidmain(){ inta=10,b; b=f(&a)*5; f(&a)=88; cout<<b<<““<<a;}//輸出:50882022/12/2152舉例int&f(int*pint){2022/12/19結(jié)構(gòu)與聯(lián)合
數(shù)組是由類型相同的數(shù)據(jù)元素構(gòu)成的。然而,程序中往往需要處理一些由不同類型數(shù)據(jù)元素所構(gòu)成的數(shù)據(jù)。
例如,一個學生的基本情況由學號、姓名、性別、出生日期、成績等數(shù)據(jù)元素構(gòu)成,這些數(shù)據(jù)元素具有不同的數(shù)據(jù)類型,如果使用獨立的不同數(shù)據(jù)類型的變量來描述這些信息,那么,變量之間的關(guān)系不能體現(xiàn)出來。C++也提供了描述不同數(shù)據(jù)類型的組合體的方法:結(jié)構(gòu)和聯(lián)合。
結(jié)構(gòu)與聯(lián)合數(shù)組是由類型相同的數(shù)據(jù)元素構(gòu)成的。然結(jié)構(gòu)
結(jié)構(gòu)類型將不同數(shù)據(jù)類型組合成一個整體類型,是一種“用戶自定義構(gòu)造數(shù)據(jù)類型”。定義結(jié)構(gòu)類型的格式如下:struct結(jié)構(gòu)類型名{
數(shù)據(jù)類型1成員名1;數(shù)據(jù)類型2成員名2;
……
數(shù)據(jù)類型n成員名n;};結(jié)構(gòu)結(jié)構(gòu)類型將不同數(shù)據(jù)類型組合成一個整體類型,是一聯(lián)合
聯(lián)合類型提供了一種可以將幾種不同類型數(shù)據(jù)存放于同一段內(nèi)存,對其中各個成員可以按名存取的機制。聯(lián)合類型定義的語法形式為: union聯(lián)合類型名 {
數(shù)據(jù)類型1成員名1; 數(shù)據(jù)類型2成員名2;
……
數(shù)據(jù)類型n成員名n; };聯(lián)合聯(lián)合類型提供了一種可以將幾種不同類型數(shù)第五章構(gòu)造數(shù)據(jù)類型丘志杰電子科技大學計算機學院軟件學院2022/12/2156第五章構(gòu)造數(shù)據(jù)類型丘志杰2022/12/191枚舉類型
“枚舉”是指將變量所有可能的取值一一列舉出來,變量的取值只限于列舉出來的常量。枚舉類型的聲明的一般形式如下:當沒給各枚舉常量指定值時,其值依次默認為0、1、2、…;在定義枚舉類型時,也可使用賦值號另行指定枚舉常量的值。
enum枚舉類型名{枚舉常量1,枚舉常量2,…,枚舉常量n};枚舉!枚舉類型“枚舉”是指將變量所有可能的取值一一列舉出來,例:NeedToDo舉例
例:NeedToDo舉例數(shù)組
數(shù)組是一組在內(nèi)存中依次連續(xù)存放的、具有同一類型的數(shù)據(jù)變量所組成的集合體。數(shù)組元素用數(shù)組名與帶方括號的數(shù)組下標一起標識。數(shù)組數(shù)組是一組在內(nèi)存中依次連續(xù)存放的、具有同一類型的數(shù)據(jù)變一維數(shù)組定義與使用
一維數(shù)組定義的一般形式為:
數(shù)據(jù)類型數(shù)組名[常量表達式];說明:數(shù)組元素的類型可以是void型以外的任何數(shù)據(jù)類型。數(shù)組名代表數(shù)組元素在內(nèi)存中的起始地址,是一個地址常量。一維數(shù)組定義與使用一維數(shù)組定義的一般形式為:數(shù)組定義之后,系統(tǒng)會將從內(nèi)存中為其分配一塊連續(xù)的存儲空間,從第1個數(shù)據(jù)元素開始依次存放各個數(shù)組元素。 例如:inta[5];數(shù)組定義之后,系統(tǒng)會將從內(nèi)存中為其分配一塊連續(xù)的存儲一維數(shù)組的初始化
一維數(shù)組初始化的語法形式為: 數(shù)據(jù)類型數(shù)組名[常量表達式]={初值1,初值2,…,初值n};例如:
intarray[3]={5,6,7};intarray2[3]={1,2};一維數(shù)組的初始化一維數(shù)組初始化的語法形式為:存取一維數(shù)組元素的語法形式為:
數(shù)組名[下標表達式];
讀數(shù)組元素的地址通過數(shù)組名來讀取,格式如下:
數(shù)組名+整型表達式;
或
&數(shù)組名[下標表達式];
存取一維數(shù)組元素的語法形式為:使用數(shù)組要注意的地方在使用數(shù)組時最常犯的錯誤是下標越界。數(shù)組名是一個地址常量,不能作為左值(賦值的目標)。因此,不能將一個數(shù)組整體拷貝給另外一個數(shù)組。例如:
inta[5],c[5],i;a=c; //錯誤!
正確的方法是將對應(yīng)的元素進行拷貝:
for(i=0;i<5;i++)a[i]=c[i];
使用數(shù)組要注意的地方在使用數(shù)組時最常犯的錯誤是下標越界。字符數(shù)組與字符串
存放字符型數(shù)據(jù)的數(shù)組稱為字符數(shù)組。
1.用字符進行初始化
例如:
char
s1[]={'C','h','i','n','a'};2.用字符串進行初始化
例如:
char
s2[]="China";字符數(shù)組與字符串存放字符型數(shù)據(jù)的數(shù)組稱為字符數(shù)組。字符數(shù)組的使用
字符數(shù)組也是數(shù)組,我們同樣可以通過數(shù)組名及下標引用數(shù)組中的元素。為方便對字符與字符串的處理,C++提供了許多專門處理字符與字符串的函數(shù)。參看P118表5-1。字符數(shù)組的使用字符數(shù)組也是數(shù)組,我們同樣可以通過數(shù)組名及下指針指針是C++語言最重要特性之一,也是C++的主要難點。指針提供了一種較為直觀的地址操作的手段,正確地使用指針,可以方便、靈活而有效地組織和表示復雜的數(shù)據(jù)。指針指針是C++語言最重要特性之一,也是C++的主要難點。地址與指針地址:當定義一個變量后,內(nèi)存中將會劃出一塊由若干個存儲單元組成的區(qū)域,用于保存該變量的數(shù)據(jù)。在內(nèi)存里每個存儲單元都有各自的編號,稱為地址。指針:在C++中,提供了指針類型,它是一種用于存放內(nèi)存單元地址的變量類型,地址就存儲在這種指針類型的變量中。正因為指針變量存儲的是地址,用它來指明內(nèi)存單元,所以形象地稱這種地址變量為指針。
地址與指針地址:當定義一個變量后,內(nèi)存中將會劃出一塊由若指針變量的定義例如:
int
*ip;//定義了一個int型的指針變量ipfloat
*fp;//定義了一個float型指針變量fptypedefintA[10];A*ap;//定義了一個A類型的指針變量apsizeof(ip)=sizeof(fp)=sizeof(ap)=4;
定義指針變量的格式如下:數(shù)據(jù)類型*變量名;
指針變量的定義例如:定義指針變量的格式如下:數(shù)據(jù)類型指針的初始化與賦值(1)不要將一個非地址常量、變量以及無意義的實際地址賦給指針變量。如:
int*p=100;//int*p=(int*)100;(對嗎?)
int*p=(char*)100;(2)可以使用一個已初始化的指針去給另一個指針賦值,但類型必須一致如果不一致,可進行強制類型轉(zhuǎn)換。
char*p=NULL;int*ip=(int*)p+100;
數(shù)據(jù)類型*指針變量名=初始地址表達式;
指針的初始化與賦值(1)不要將一個非地址常量、變量以及無意義(3)對于基本數(shù)據(jù)類型的變量、數(shù)組元素我們可以使用取地址運算符&來獲得它們的地址,但是也只有類型一致才能賦值。
inta[10];//定義int型數(shù)組
int*i_pointer=a;//定義并初始化int型指針(4)有一種特殊的void類型指針,可以存儲任何的類型地址;但將一個void類型的地址賦值給非void類型的指針變量,要使用類型強制轉(zhuǎn)換。
voidv;//錯誤,不能定義void類型的變量
void*vp;//定義void類型的指針(3)對于基本數(shù)據(jù)類型的變量、數(shù)組元素我們可以使用取地址運算指針運算指針通常進行下列幾種運算:賦值運算、取值運算、算術(shù)運算、相減運算、比較運算。(1)*和&運算
*:指針運算符,&:取地址運算符。
例如:
inta[4]={1,2,3};int*ip=&a[2];cout<<*ip;*ip=100;
指針運算指針通常進行下列幾種運算:賦值運算、取值運算(2)指針與整數(shù)的加減運算
指針的加減運算與普通變量的加減運算不同,由于指針存儲的是變量的內(nèi)存地址,指針加上或減去一個整數(shù)n,表示指針從當前位置向后或向前移動n個sizeof(數(shù)據(jù)類型)長度的存儲單元。因此對于不同的數(shù)據(jù)類型,n的實際大小就不同。(2)指針與整數(shù)的加減運算(3)指針自增、自減運算
指針的自增、自減運算是指針加減運算的特例。指針的自增或自減表示指針從當前位置向后或向前移動sizeof(數(shù)據(jù)類型)長度的存儲單元。
例如:
int*p,a=5;p=&a;p++;//指針p后移4個字節(jié)(3)指針自增、自減運算(4)兩指針相減
當兩個指針指向同一數(shù)組時,兩個指針的相減才有意義。兩個指針相減的結(jié)果為一整數(shù),表示兩個指針之間數(shù)組元素的個數(shù)。
(5)兩個指針的比較運算
兩個指針的比較一般用于下列兩種情況:一是比較兩個指針所指向的對象在內(nèi)存中的位置關(guān)系;二是判斷指針是否為空指針。
(4)兩指針相減void類型指針
指向void類型的指針是一種不確定類型的指針,它可以指向任何類型的變量。實際使用void型指針時,只有通過強制類型轉(zhuǎn)換才能使void型指針得到具體變量的值。在沒有轉(zhuǎn)換前void型指針不能進行指針的算術(shù)運算。例如:
void
*vp;//定義了一個void型指針vp
int
i=6,*ip;
vp=&i;//vp指向整型變量icout<<“i=”<<*vp<<endl;//錯誤
cout<<"i="<<*(int
*)p<<endl;ip=(int
*)vp;//ip指向vp指向的變量i
cout<<"i="<<*ip<<endl;void類型指針指向void類型的指針是一種不確定指針與字符串
字符型指針:
用于存放字符型變量的地址,而字符串的本質(zhì)是以\0結(jié)尾的字符數(shù)組,一個字符型指針存儲了字符數(shù)組的第一個元素的地址,也就存儲了字符串的地址,這個指針就指向了字符串。在定義一個字符數(shù)組時,可以將一個字符串常量作為初值,但將字符串常量作為初值賦給字符數(shù)組和將字符串常量作為初值賦給字符指針變量,二者的含義是不同的。例如:
charstr[5]="abcd";char*p_str="abcd";指針與字符串字符型指針:指針與數(shù)組
1使用指針操作符*存取數(shù)組指針的加減運算的特點使得指針操作符特別適合處理存儲在一段連續(xù)內(nèi)存空間中的同類型數(shù)據(jù)。這樣,使用指針操作符來對數(shù)組及其元素進行操作就非常方便。(1)一維數(shù)組的指針操作
當定義數(shù)組一維數(shù)組Ta[N](T為類型),下式為存取數(shù)組元素a[i]的等效方式:*(a+i);而a+i為a[i]的地址。指針與數(shù)組1使用指針操作符*存取數(shù)組數(shù)組指針
數(shù)組指針是指向數(shù)組的指針。例如:int
(*a_p)[5];等效于下列定義方式:①typedefintI_A[5];②I_A*a_p;數(shù)組指針數(shù)組與函數(shù)
數(shù)組名是一個地址,不能當作一個左值,但是可以作為函數(shù)的形參,接受實參傳送來的地址。當形參接受實參傳送來的地址后,形參數(shù)組與實參共享內(nèi)存中的一塊空間。函數(shù)體通過形參對數(shù)組內(nèi)容的改變會直接作用到實參上。數(shù)組名作為形參是數(shù)組應(yīng)用的一個重要方面。
數(shù)組與函數(shù)數(shù)組名是一個地址,不能當舉例
voidfunc(inta[],intn){ inti; for(i=0;i<n;i++) a[i]+=3;}voidmain(){ inta[]={1,2,3,4}; func(a,4); }
舉例voidfunc(inta[],intn)指向函數(shù)的指針
在程序運行時,不僅數(shù)據(jù)要占用內(nèi)存空間,程序的代碼也被調(diào)入內(nèi)存并占據(jù)一定的內(nèi)存空間。每一個函數(shù)都有函數(shù)名,實際上,這個函數(shù)名就是該函數(shù)的代碼在內(nèi)存的起始地址。
當調(diào)用一個函數(shù)時,編譯系統(tǒng)就是根據(jù)函數(shù)名找到函數(shù)代碼的首地址,從而執(zhí)行這段代碼。由此看來,函數(shù)的調(diào)用形式:函數(shù)名(參數(shù)表),其實質(zhì)就是:函數(shù)代碼首地址(參數(shù)表)。函數(shù)指針:
就是指向某個函數(shù)的指針,它是專門用于存放該函數(shù)代碼首地址的指針變量。一旦定義了某個函數(shù)指針,那么,它就與函數(shù)名有同樣的作用,在程序中就可以象使用函數(shù)名一樣,通過指向該函數(shù)的指針來調(diào)用該函數(shù)。指向函數(shù)的指針在程序運行時,不僅數(shù)據(jù)要占用內(nèi)函數(shù)指針的定義語法形式如下:其中:數(shù)據(jù)類型為函數(shù)指針所指函數(shù)的返回值類型;形參表則列出了該指針所指函數(shù)的形參類型和個數(shù)。函數(shù)指針名與*外面的圓括號()是必須的,如果去掉圓括號,將被解釋為函數(shù)的返回值為指針。
數(shù)據(jù)類型(*函數(shù)指針名)(形參表);
函數(shù)指針的定義語法形式如下:數(shù)據(jù)類型(*函數(shù)指針名)(形
函數(shù)指針在使用之前也要進行賦值,使指針指向一個已經(jīng)存在的函數(shù)代碼的起始地址。語法形式為:
函數(shù)指針名=函數(shù)名;
調(diào)用函數(shù)指針指向的函數(shù)有如下兩種格式:
①函數(shù)指針名(實參表); ②(*函數(shù)指針名)(實參表);
例如:
intadd(inta,intb);//定義函數(shù)
int(*fptr)(inta,intb);//定義函數(shù)指針
fptr=add;//函數(shù)指針賦值函數(shù)指針在使用之前也要進行賦值,使指針指向一個已經(jīng)存在的采用下列任何一種形式調(diào)用函數(shù)add:
add(1,2);
(*fptr)(1,2);
fptr(1,2);說明:雖然三種調(diào)用形式的結(jié)果完全相同,當用指向函數(shù)的指針調(diào)用函數(shù)add()時,習慣上使用
(*fptr)(1,2),因為這種形式能更直觀地說明是用指向函數(shù)的指針來調(diào)用函數(shù)。采用下列任何一種形式調(diào)用函數(shù)add:說明:多重指針
如果已經(jīng)定義了一個指針類型,我們再定義一個指針,用于指向已經(jīng)定義的指針變量,后面定義的指針變量就是一個指向指針的指針變量,簡稱指向指針的指針,這樣的指針也稱二重(級)指針。三重及以上的指針統(tǒng)稱為多重指針。例如:
int**pp;
定義了一個二級指針變量,等效于下列定義方式:
typedefint*P;P*p;
例:inta,*p,**pp;p=&a;pp=&p; 多重指針如果已經(jīng)定義了一個指針類型,我們再定動態(tài)存儲分配和釋放存儲空間C的做法 void* malloc(size_tsize); void free(void*pMemory);例如: char*p=(char*)malloc(100); strcpy(p,”HelloWorld!”); free(p);注意:這里是以字節(jié)計算的單元數(shù)目2022/12/2187動態(tài)存儲分配和釋放存儲空間C的做法注意:這里是以字節(jié)計算的單C++的做法使用運算符new和delete使用形式
type是一個數(shù)據(jù)類型名,p是該類型的指針變量,new的作用就是從堆空間中分配一塊與type類型的數(shù)據(jù)一樣大小的內(nèi)存(如果分配失敗,new返回一個空指針),該內(nèi)存地址被存于指針p中。一旦不想再使用,可以用delete來釋放該內(nèi)存空間。type*p;p=newtype;deletep;2022/12/2188C++的做法使用運算符new和deletetype是一舉例int*p;p=newint;*p=50;deletep;2022/12/2189舉例int*p;2022/12/1934幾點注意使用new申請的內(nèi)存空間是沒有名字的,只能通過指針間接訪問它們。用delete釋放的內(nèi)存空間必須是由new分配的空間,否則執(zhí)行delete時將會導致嚴重的錯誤。例如:int*p;deletep;//出錯int*p,value;p=&value;deletep;//出錯2022/12/2190幾點注意使用new申請的內(nèi)存空間是沒有名字的,只能通過指針間new和delete的典型用法動態(tài)分配和釋放單個數(shù)據(jù)的存儲區(qū)#include<iostream.h>voidmain(){ int*p;p=newint; if(p==NULL){ cout<<“Allocationfailure!\n”; }else{ *p=15; cout<<*p; deletep; }}pp152022/12/2191new和delete的典型用法動態(tài)分配和釋放單個數(shù)據(jù)的存儲區(qū)用new運算符初始化單個數(shù)據(jù)的存儲區(qū)語法為:type*p;P=newtype(初始值);……deletep;幾點說明:是用小括號將初始值括起來。初始值可以是常量、變量、以及表達式。2022/12/2192用new運算符初始化單個數(shù)據(jù)的存儲區(qū)語法為:type*p;舉例#include<iostream.h>voidmain(){ int*p;
p=newint(100); if(p==NULL){ cout<<“Allocationfailure!\n”; }else{ cout<<*p; deletep; }}//如果p=newint(98.5),會怎么樣?注意:初始值必須與相應(yīng)類型一致。p1002022/12/2193舉例#include<iostream.h>注意:初始值必動態(tài)分配一維數(shù)組的存儲空間語法為:type*p;P=newtype[num];……delete[]p;幾點說明:num用于指定數(shù)組大小,可以是常量、變量、以及表達式,并且用中括號括起來。通過p[i]的方式訪問數(shù)組元素。2022/12/2194動態(tài)分配一維數(shù)組的存儲空間語法為:type*p;幾點說明:#include<iostream.h>voidmain(){ inti,*p;
p=newint[100]; if(p==NULL){ cout<<“Allocationfailure!\n”; }else{ for(i=0;i<100;i++)
p[i]=i+1; for(i=0;i<100;i++) cout<<p[i]<<‘‘;
delete[]p; }}p1100Unit99…Unit02022/12/2195#include<iostream.h>p1100Unit幾點說明:new返回的指針指向數(shù)組的起始位置,也就是數(shù)組的第一個元素。用new動態(tài)分配一個數(shù)組時不能對它進行初始化。(呵呵,為什么??)2022/12/2196幾點說明:2022/12/1941引用Reference簡單地說,引用就是給一個單元起一個別名。也就是說,引用與它所引用的變量共享存儲單元。引用主要有以下三種用法:獨立引用作為函數(shù)參數(shù)作為函數(shù)返回類型2022/12/2197引用Reference簡單地說,引用就是給一個單元起一個別獨立引用inti=0,k=8;int&j=i;int*p=&i;j=k;0ijpj是i的引用,i和j是代表同一個單元。這種使用引用的方式稱為獨立引用。在聲明獨立引用時必須對它初始化,這種情況下的別名綁定是永久的。語句”j=k;”
不是試圖使j成為k的別名,而是在給j賦值,即使j的值也就是i的值等于k。2022/12/2198獨立引用inti=0,k=8;0ijpj是i的引用,i初始化獨立引用的幾種方式賦值表達式的右端是一個變量
inta; int&ra=a;賦值表達式的右端是一個常量
float&r1=1.0;//早期的C++版本 constfloat&r2=1.0;//近期C++版本定義常引用
intx=1; constint&rx=x;
rx=98;//錯誤,只能使用rx,不能修改2022/12/2199初始化獨立引用的幾種方式賦值表達式的右端是一個變量2022/引用作為函數(shù)參數(shù)C++和C一樣,
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高校創(chuàng)業(yè)培訓定點機構(gòu)各項制度
- 企業(yè)檢查人員培訓制度
- 培訓班工作制度管理制度
- 駕駛員駕駛教育培訓制度
- 診所崗前培訓計劃及制度
- 幼兒園教師教師培訓制度
- 注塑廠員工安全培訓制度
- 中醫(yī)館在職教育培訓制度
- 電力公司培訓管理制度
- 培訓班新人培訓制度
- 授信合同與借款合同(標準版)
- 2024-2025學年四川省綿陽市七年級(上)期末數(shù)學試卷
- SF-36評估量表簡介
- 道路清掃保潔、垃圾收運及綠化服務(wù)方案投標文件(技術(shù)標)
- 合成藥物催化技術(shù)
- 河南省三門峽市2024-2025學年高二上學期期末調(diào)研考試英語試卷(含答案無聽力音頻及聽力原文)
- 【語文】福建省福州市烏山小學小學三年級上冊期末試題(含答案)
- 建立鄉(xiāng)鎮(zhèn)衛(wèi)生院孕情第一時間發(fā)現(xiàn)制度或流程
- 睡眠科普課課件
- 2025年中級衛(wèi)生職稱-主治醫(yī)師-放射醫(yī)學(中級)代碼:344歷年參考題庫含答案解析(5卷)
- 2025年中國民航科學技術(shù)研究院招聘考試筆試試題(含答案)
評論
0/150
提交評論