版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
計算機(jī)網(wǎng)絡(luò)管理第1頁,共123頁,2023年,2月20日,星期二本章將深入學(xué)習(xí)數(shù)組包括多維數(shù)組的知識和應(yīng)用,以及它們與指針的關(guān)系。
C++語言擁有在運(yùn)行時獲得變量地址和操縱地址的能力,這種可用來操縱地址的變量類型就是指針。指針可以用于數(shù)組,用于內(nèi)存訪問,還可作為函數(shù)的參數(shù)。本章重點(diǎn)第2頁,共123頁,2023年,2月20日,星期二2023/4/1825.1.1數(shù)組、數(shù)組元素及其存儲方式
5.1.2數(shù)組名作為函數(shù)參數(shù)數(shù)組第3頁,共123頁,2023年,2月20日,星期二2023/4/183數(shù)組的引入:
數(shù)組(array)是一種順序容器(sequencecontainer),是由單一類型元素組成的一個有序集合:
intfibon[10]={0,1,1,2,3,5,8,13,21,34};
數(shù)組名為fibon,這是一個包含10個元素的整型一維(dimension)數(shù)組,其第一個元素為fibon[0],存放0,最后一個元素為fibon[9],存放34。數(shù)組第4頁,共123頁,2023年,2月20日,星期二2023/4/184
0
1
2
3
21
34fibon[0]fibon[1]fibon[2]fibon[3]fibon[8]fibon[9]圖5.1
數(shù)組在內(nèi)存中的存儲數(shù)組元素的訪問方式:通過下標(biāo)操作符(subscript),按元素在數(shù)組中的位置進(jìn)行訪問,稱為索引訪問(indexing)或下標(biāo)訪問(subscripting)。參見圖5.1
。數(shù)組與數(shù)組元素及其存儲方式第5頁,共123頁,2023年,2月20日,星期二2023/4/185注意:
1:數(shù)組是一種組合類型,是不能作為一個整體進(jìn)行訪問和處理的,只能按元素進(jìn)行個別的訪問和處理。
2:
C++數(shù)組第一個元素的下標(biāo)為0,而不是1,且下標(biāo)表達(dá)方式是固定的。
3:數(shù)組元素在內(nèi)存中是從低地址開始順序排列,各元素的存儲單元占用內(nèi)存大小相同,各元素的存儲單元之間沒有空隙,可以從數(shù)組第一個元素存儲單元的起始地址計算出任意一個元素存儲單元的起始地址。數(shù)組與數(shù)組元素及其存儲方式第6頁,共123頁,2023年,2月20日,星期二2023/4/186【例5.1】找最大數(shù)和最小數(shù)
const
intSIZE=15;
intmain(){
intarr[SIZE],i,high,low;
for(i=0;i<SIZE;i++)arr[i]=rand()%100;cout<<"Herearethe"<<SIZE<<"randomnumbers:"<<endl;
for(i=0;i<SIZE;i++)cout<<arr[i]<<'\t';
cout<<endl;high=arr[0];//初始化時最大和最小值均為數(shù)組首元素
low=arr[0];
for(i=1;i<SIZE;i++){if(arr[i]>high)high=arr[i];
if(arr[i]<low)low=arr[i];}cout<<"highestvalueis"<<high<<endl;cout<<"lowestvalueis"<<low<<endl;
return0;}第7頁,共123頁,2023年,2月20日,星期二2023/4/187結(jié)構(gòu)數(shù)組定義:
structkeyword{
charword[16];//關(guān)鍵字
intcount;//該關(guān)鍵字將在源程序中出現(xiàn)的次數(shù)};初始化:結(jié)構(gòu)數(shù)組初始化時可以用括號來區(qū)分每一個結(jié)構(gòu),例如:keywordkeytab[]={{"auto",0},{"break",0},{"case",0},……};當(dāng)提供了數(shù)組中所有結(jié)構(gòu)值時,不必用這種括號的形式。keywordkeytab[]={"auto",0,"break",0,"case",0,"char",0,……"unsigned",0,"volatile",0,"while",0,};數(shù)組與數(shù)組元素及其存儲方式第8頁,共123頁,2023年,2月20日,星期二2023/4/188對象數(shù)組定義:
CGoodsgoods[3];該商品類對象數(shù)組包含3個商品對象數(shù)組元素,系統(tǒng)調(diào)用3次默認(rèn)的構(gòu)造函數(shù)來建立這3個商品對象數(shù)組元素。初始化:應(yīng)該完整書寫各個元素的構(gòu)造函數(shù)及成員數(shù)據(jù)初值:CGoodsgoods[3]={CGoods("夏利2000",30,98000.0),
//調(diào)用三參數(shù)構(gòu)造函數(shù),初始化goods[0]CGoods("桑塔納2000",164000.0),
//調(diào)用兩參數(shù)構(gòu)造函數(shù),初始化goods[1]CGoods()//調(diào)用默認(rèn)的構(gòu)造函數(shù),初始化goods[2]};數(shù)組與數(shù)組元素及其存儲方式第9頁,共123頁,2023年,2月20日,星期二2023/4/189數(shù)組作為參數(shù):
數(shù)組可以作為函數(shù)的參數(shù)。在函數(shù)調(diào)用時傳遞實(shí)參數(shù)組的首地址,所以在被調(diào)函數(shù)中對形參數(shù)組的處理實(shí)際就是對調(diào)用函數(shù)的實(shí)參數(shù)組的處理。
C++只傳遞數(shù)組首地址,而對數(shù)組邊界不加檢查。這帶來的好處是,函數(shù)對長度不等的同類數(shù)組都通用。如要指定長度可以設(shè)定另一個參數(shù)來傳遞數(shù)組元素的個數(shù)。數(shù)組名作為函數(shù)參數(shù)第10頁,共123頁,2023年,2月20日,星期二2023/4/1810數(shù)組名作為函數(shù)參數(shù)數(shù)組元素作實(shí)參,與單個變量一樣。數(shù)組名作參數(shù),形、實(shí)參數(shù)都應(yīng)是數(shù)組名,類型要一樣,傳送的是數(shù)組首地址。對形參數(shù)組的改變會直接影響到實(shí)參數(shù)組。第11頁,共123頁,2023年,2月20日,星期二2023/4/1811【例5.2】字符數(shù)組與字符數(shù)組相連接voidstrcat(chars[],charct[]){
inti=0,j=0;
while(s[i]!=0)i++;
while(ct[j]!=0)s[i++]=ct[j++];s[i]='\0';}voidmain(
){
chara[40]="李明";
charb[20]=“是華中科技大學(xué)學(xué)生";strcat(a,b);cout<<a<<endl;//打印字符數(shù)組a}第12頁,共123頁,2023年,2月20日,星期二2023/4/1812多維數(shù)組
C++中數(shù)組可以嵌套,就是多維數(shù)組。定義二維數(shù)組的通用格式為:
類型說明符數(shù)組名[常量行表達(dá)式][常量列表達(dá)式];行與列用常量表達(dá)式表示。第13頁,共123頁,2023年,2月20日,星期二2023/4/1813二維數(shù)組:一維數(shù)組可對應(yīng)數(shù)學(xué)中的向量,而二維數(shù)組可對應(yīng)矩陣,可用一個二維數(shù)組存儲矩陣。
多維數(shù)組存儲與訪問方式119753117131175312108642二維數(shù)組的橫向稱為行,縱向稱為列,上面這個數(shù)組為三行六列。第14頁,共123頁,2023年,2月20日,星期二2023/4/1814多維數(shù)組存儲與訪問方式二維數(shù)組分析:上面的數(shù)組可定義為:intmat[3][6];mat[0][0]mat[0][1]mat[0][2]mat[0][3]mat[0][4]mat[0][5]mat[1][0]mat[1][1]mat[1][2]mat[1][3]mat[1][4]mat[1][5]mat[2][0]mat[2][1]mat[2][2]mat[2][3]mat[2][4]mat[2][5]有了確定的關(guān)系后可以算出多維數(shù)組任一元素在內(nèi)存的位置,設(shè)有a數(shù)組m行n列,每個元素占b個字節(jié),a[i][j]的首地址為:數(shù)組的首地址+(i*n+j)*b;第15頁,共123頁,2023年,2月20日,星期二2023/4/1815多維數(shù)組存儲與訪問方式
圖5.36*3*4的三維數(shù)組多維數(shù)組分析:
C/C++中的多維數(shù)組基本的定義是以數(shù)組作為元素構(gòu)成的數(shù)組,二維數(shù)組的數(shù)組元素是一維數(shù)組,三維數(shù)組的數(shù)組元素是一個二維數(shù)組,依此類推。也就是說,多維數(shù)組用的是一個嵌套的定義。圖5.3表示一個三維數(shù)組可定義為:inta3d[6][3][4];第16頁,共123頁,2023年,2月20日,星期二2023/4/1816多維數(shù)組存儲與訪問方式多維數(shù)組的數(shù)組名:代表數(shù)組中第一維(最高維)第一個元素(0號元素)在內(nèi)存中的首地址,如三維數(shù)組的數(shù)組名代表的是組成三維數(shù)組的第一個二維數(shù)組的存儲首地址。當(dāng)數(shù)組作為函數(shù)的參數(shù)進(jìn)行傳遞時,多維數(shù)組同樣是作為第一維第一個數(shù)組的首地址傳遞給函數(shù),所以物理上是傳地址。在函數(shù)中對形參的數(shù)組元素的修改實(shí)際上是對作為實(shí)參的原數(shù)組的元素進(jìn)行修改。第17頁,共123頁,2023年,2月20日,星期二2023/4/1817多維數(shù)組存儲與訪問方式初始化:將所有數(shù)據(jù)寫在一個{}內(nèi),按順序賦值例如:staticinta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};分行給二維數(shù)組賦初值例如:staticinta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};可以對部分元素賦初值例如:staticinta[3][4]={{1},{0,6},{0,0,11}};第18頁,共123頁,2023年,2月20日,星期二2023/4/1818多維數(shù)組存儲與訪問方式1416192589101571212182024741361091013141567511109878129412231516691153152619221445321821171693211191713117530076543210圖5.4極點(diǎn)與鞍點(diǎn)示意圖【例5.4】已知矩陣
intmat[8][8],找出其中的極點(diǎn)與鞍點(diǎn)。如某元素在所在行相鄰點(diǎn)中與所在列相鄰點(diǎn)中均為最大或最小,則為極點(diǎn);如某元素在所在行(或列)相鄰點(diǎn)中為最大,同時該元素在所在列(或行)相鄰點(diǎn)中為最小,則為鞍點(diǎn)。第19頁,共123頁,2023年,2月20日,星期二2023/4/1819【例5.4】矩陣極點(diǎn)與鞍點(diǎn)
#include<iostream>#include<iomanip>usingnamespacestd;intmat[8][8]={0,3,5,7,11,┅,25,19,16,14};
intmaxmin(inta,intb,intc){//判斷相鄰3元素中間元素是否最大或最小
if(a>b&&b<c)return-1;
else
if(a<b&&b>c)return1;
else
return0;}//b為最大返回1,最小返-1,其他為0第20頁,共123頁,2023年,2月20日,星期二2023/4/1820intmain(
){
inti,j,k,l;
for(i=1;i<=6;i++)
for(j=1;j<=6;j++){
k=maxmin(mat[i][j-1],mat[i][j],mat[i][j+1]);
if(k==0)continue;l=maxmin(mat[i-1][j],mat[i][j],mat[i+1][j]);
if(l==0)continue;
if(k==1&&l==1)cout<<"極大點(diǎn):";
elseif(k==-1&&l==-1)cout<<"極小點(diǎn):";
elsecout<<“鞍點(diǎn):”;cout<<setw(2)<<mat[i][j]<<";i="<<i<<";j="<<j<<endl;}
return0;}【例5.4】矩陣極點(diǎn)與鞍點(diǎn)第21頁,共123頁,2023年,2月20日,星期二2023/4/1821舉例:使用數(shù)組名作為函數(shù)參數(shù)主函數(shù)中初始化一個矩陣并將每個元素都輸出,然后調(diào)用子函數(shù),分別計算每一行的元素之和,將和直接存放在每行的第一個元素中,返回主函數(shù)之后輸出各行元素的和。第22頁,共123頁,2023年,2月20日,星期二2023/4/1822#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; }
}voidmain(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]<<““;}運(yùn)行結(jié)果:123423453456Sumofrow0is10Sumofrow1is14Sumofrow2is18101418第23頁,共123頁,2023年,2月20日,星期二2023/4/1823多維數(shù)組作為函數(shù)參數(shù)多維數(shù)組作為參數(shù):在作為函數(shù)的形式參數(shù)時,可以省略最高維(第一維)。因?yàn)榫幾g器只要根據(jù)后面每一維(從第二維開始)的大小,就可計算數(shù)組每一個元素的存儲位置。基于同樣的理由,也只能省略最高維。進(jìn)一步考慮,對多維數(shù)組,編譯器不檢查邊界,其實(shí)只是不檢查最高維(第一維)的邊界,較低各維的大小是在控制之中的。復(fù)合類型只能對各元素逐個操作,不能整體操作。
第24頁,共123頁,2023年,2月20日,星期二2023/4/1824多維數(shù)組作為函數(shù)參數(shù)【例5.5】矩陣轉(zhuǎn)置與矩陣相乘。下標(biāo)作為參數(shù)傳遞。第25頁,共123頁,2023年,2月20日,星期二2023/4/1825【例5.5】矩陣轉(zhuǎn)置與矩陣相乘voidinverse(int[3][6],int[6][3]);//轉(zhuǎn)置矩陣
voidmulti(int[6][3],int[3][4],int[6][4]);//矩陣乘法voidoutput(int[6][4]);//矩陣輸出Intmain(){
intmiddle[6][3],result[6][4];
intmatrix1[3][6]={8,10,12,23,1,3,5,7,9,2,4,6, 34,45,56,2,4,6};
intmatrix2[3][4]={3,2,1,0,-1,-2,9,8,7,6,5,4};inverse(matrix1,middle);multi(middle,matrix2,result);output(result);
return0;}第26頁,共123頁,2023年,2月20日,星期二2023/4/1826【例5.5】矩陣轉(zhuǎn)置與矩陣相乘voidinverse(intmatrix1[3][6],intmiddle[6][3]){//轉(zhuǎn)置矩陣
inti,j;
for(i=0;i<3;i++)
for(j=0;j<6;j++)
middle[j][i]=matrix1[i][j];
return;}voidmulti(intmiddle[6][3],intmatrix2[3][4],intresult[6][4]){
inti,j,k;
//矩陣乘法
for(i=0;i<6;i++){
for(j=0;j<4;j++){
result[i][j]=0;
for(k=0;k<3;k++)result[i][j]+=middle[i][k]*matrix2[k][j];}}
return;}第27頁,共123頁,2023年,2月20日,星期二2023/4/1827【例5.5】矩陣轉(zhuǎn)置與矩陣相乘voidoutput(intresult[6][4]){//矩陣輸出
cout<<"result"<<'\n';intI,j;
for(i=0;i<6;i++){
for(j=0;j<4;j++)cout<<setw(4)<<result[i][j]<<"";cout<<'\n';}
return;}第28頁,共123頁,2023年,2月20日,星期二2023/4/1828指針與地址
5.3.1指針的概念5.3.2指針變量的賦值、初始化與簡單應(yīng)用第29頁,共123頁,2023年,2月20日,星期二2023/4/1829引例尋找保險箱密碼
一個關(guān)于特工007尋找保險箱密碼的故事…關(guān)鍵點(diǎn)分析得到線索:0200單元的“東九號”寄存箱提示地址:1900單元找到目標(biāo):“啟明號”寄存箱取出內(nèi)容:911第30頁,共123頁,2023年,2月20日,星期二2023/4/1830尋找密碼的途徑分析密碼911存放在某個寄存箱內(nèi),如果我們知道這個寄存箱的名字,就能夠找到密碼;如果不知道密碼所在的寄存箱名字,知道該寄存箱的地址也照樣能夠取出密碼;如果寄存箱的地址也不知道,但是有另外一個地方存放這個寄存箱的地址,就能順藤摸瓜,間接找到密碼。第31頁,共123頁,2023年,2月20日,星期二2023/4/1831密碼存放示意圖啟明號9111900東九號19000200名字東九號啟明號地址02001900內(nèi)容1900911第32頁,共123頁,2023年,2月20日,星期二2023/4/1832利用指針模擬尋找保險箱密碼的過程
獲取密碼的兩種方法
intmain(){ intkey=911;/*變量key存放密碼*/
int*addr=NULL;/*變量addr存放地址*/
addr=&key;/*將key的地址賦給addr*/ /*通過變量key輸出密碼值*/cout<<“密碼:“<<key;/*通過變量key的地址來輸出密碼值*/ cout<<“如果我知道存放密碼的地址,我也能找到密碼:",*addr;
return0;}密碼:911如果我知道存放密碼的地址,我也能找到密碼:911第33頁,共123頁,2023年,2月20日,星期二2023/4/1833指針的概念
指針與間接訪問:
按變量的地址直接存取變量的方法稱為“直接訪問”方式。存貯變量的內(nèi)存空間的首地址稱為該變量的地址。如果將一個變量的地址放在另一個變量中,則存放地址的變量稱為指針(Pointer)型變量。這樣存取變量,也可以間接的由指針變量取得該變量的地址進(jìn)行,稱為“間接訪問”方式。
由于指針變量中的值是另一個變量的地址,習(xí)慣上形象地稱為指針變量指向該變量。指針變量中的值也簡稱為指針,所以指針就是地址。第34頁,共123頁,2023年,2月20日,星期二2023/4/1834指針變量與間址訪問
指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”例如:
inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;a=*p1+*p2;第35頁,共123頁,2023年,2月20日,星期二2023/4/1835指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:
inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;a=*p1+*p2;第36頁,共123頁,2023年,2月20日,星期二2023/4/1836指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:
inta,b;
int*p1,*p2;p1=&a;p2=&b;a=10;b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE0第37頁,共123頁,2023年,2月20日,星期二2023/4/1837指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:
inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE0第38頁,共123頁,2023年,2月20日,星期二2023/4/1838指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta
0X0066FDF4intb0X0066FDF0例如:
inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF4第39頁,共123頁,2023年,2月20日,星期二2023/4/1839指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta
0X0066FDF4intb0X0066FDF0例如:
inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF4*p1*p1指針p1所指的對象第40頁,共123頁,2023年,2月20日,星期二2023/4/1840指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb
0X0066FDF0例如:
inta,b;int*p1,*p2;p1=&a;
p2=&b;a=10;b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF0*p1第41頁,共123頁,2023年,2月20日,星期二2023/4/1841指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb
0X0066FDF0例如:
inta,b;int*p1,*p2;p1=&a;
p2=&b;a=10;b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF4*p1*p2*p2指針p2所指的對象0X0066FDF0第42頁,共123頁,2023年,2月20日,星期二2023/4/1842指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:
inta,b;int*p1,*p2;p1=&a;p2=&b;a=10; //*p1=10b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF010*p1*p2第43頁,共123頁,2023年,2月20日,星期二2023/4/1843指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:
inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20; //*p2=20a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF010*p1*p220第44頁,共123頁,2023年,2月20日,星期二2023/4/1844指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:
inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;
a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF010*p1*p220+第45頁,共123頁,2023年,2月20日,星期二2023/4/1845指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:
inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;
a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF030*p1*p220+第46頁,共123頁,2023年,2月20日,星期二2023/4/1846指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:
inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF030*p1*p220間址訪問讀出變量p1的地址值查找該地址的存儲單元用關(guān)聯(lián)類型解釋并讀出數(shù)據(jù)第47頁,共123頁,2023年,2月20日,星期二2023/4/1847指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:
inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF030*p1*p220間址訪問讀出變量p2的地址值查找該地址的存儲單元用關(guān)聯(lián)類型解釋并讀出數(shù)據(jù)第48頁,共123頁,2023年,2月20日,星期二2023/4/1848指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:
inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF030*p1*p220間址運(yùn)算(指針運(yùn)算)第49頁,共123頁,2023年,2月20日,星期二2023/4/1849指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:
inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF030*p1*p220指針類型說明第50頁,共123頁,2023年,2月20日,星期二2023/4/1850
指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF030*p1*p220int*p1int*p2intaintb*p1*p2第51頁,共123頁,2023年,2月20日,星期二2023/4/1851定義形式:
類型*標(biāo)識符;指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”第52頁,共123頁,2023年,2月20日,星期二2023/4/1852指針變量名定義形式:
類型*標(biāo)識符;指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”指針類型說明符指針?biāo)笇ο蟮念愋停ㄖ羔樀年P(guān)聯(lián))第53頁,共123頁,2023年,2月20日,星期二2023/4/1853例如int*iptr;//iptr是指向整型對象的指針,可以存放一個整型變量的地址
char*s; //s是指向字符對象的指針double*dPtr; //dPtr是指向浮點(diǎn)對象的指針定義形式:
類型*標(biāo)識符;指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”第54頁,共123頁,2023年,2月20日,星期二2023/4/1854注意事項用變量地址作為初值時,該變量必須在指針初始化之前已說明過,且變量類型應(yīng)與指針類型一致??梢杂靡粋€已賦初值的指針去初始化另一個指針變量。指針變量與間址訪問指針變量的初始化第55頁,共123頁,2023年,2月20日,星期二2023/4/1855指針名=地址“地址”中存放的數(shù)據(jù)類型與指針類型必須相符。向指針變量賦的值必須是地址常量或變量,不能是普通整數(shù)。但可以賦值為整數(shù)0,表示空指針。指針的類型是它所指向變量的類型,而不是指針本身數(shù)據(jù)值的類型,任何一個指針本身的數(shù)據(jù)值都是unsignedlongint型。允許聲明指向void類型的指針。該指針可以被賦予任何類型對象的地址。例:void*general;指針變量與間址訪問第56頁,共123頁,2023年,2月20日,星期二2023/4/1856指針賦值//空指針:int*iPtr=0;char*s=NULL;double*dPtr=NULL;iPtrsdPtr指針變量與間址訪問第57頁,共123頁,2023年,2月20日,星期二2023/4/1857指針賦值inti=1;int*iPtr1,*iPtr2;char*cPtr;…iPtr1=&i; //合法iPtr2=iPtr1; //合法iPtr2=i;
//非法,i不是int*
對象cPtr=iPtr1;
//非法,iPtr1不是char*對象i=iPtr1; //非法,iPtr1不是int對象指針變量與間址訪問第58頁,共123頁,2023年,2月20日,星期二2023/4/1858舉例指針的聲明、賦值與使用#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型指針?biāo)傅刂返膬?nèi)容程序運(yùn)行的結(jié)果是:Outputinti=10Outputintpointeri=10第59頁,共123頁,2023年,2月20日,星期二2023/4/1859&
取地址操作 *
間址訪問操作
例如
shortinta=3,b=4; floatc=4.5,d=8.6; chare='x',f='y';
int*pa=&a,*pb=&b; float*pc=&c,*pd=&d; char*pe=&e,*pf=&f;abcdef101010121014101810221023344.58.6xy指針變量與間址訪問第60頁,共123頁,2023年,2月20日,星期二2023/4/1860abcdef101010121014101810221023344.58.6xypapbpcpdpepf20022006`20102014201820222026101010121014101810221023&a3paa,*pa&b4pbb,*pb&c4.5pcc,*pc&d8.6pdd,*pd&expee,*pe&fypff,*pf第61頁,共123頁,2023年,2月20日,星期二2023/4/1861//例間址訪問對象voidmain(){inti,*p;
p=&i;*p=5;cout<<i<<endl;cout<<*p<<endl;cout<<p<<endl;cout<<&i<<endl;}//通過指針變量間指訪問對象用名訪問對象通過指針變量間址訪問對象指針變量的值對象i的地址取對象i的直接地址值第62頁,共123頁,2023年,2月20日,星期二2023/4/1862//例交換指針值voidmain(){inti1=10,i2=20,*p1,*p2,*p;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;p=p1;p1=p2;p2=p;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}
p1
10i1
p2
20i2
pinti1=10,i2=20,*p1,*p2,*p;第63頁,共123頁,2023年,2月20日,星期二2023/4/1863//例交換指針值voidmain(){inti1=10,i2=20,*p1,*p2,*p;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;p=p1;p1=p2;p2=p;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}
p1
10i1
p2
20i2
pp1=&i1;p2=&i2;*p1*p2第64頁,共123頁,2023年,2月20日,星期二2023/4/1864//例交換指針值voidmain(){inti1=10,i2=20,*p1,*p2,*p;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;p=p1;p1=p2;p2=p;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}
p1
10i1
p2
20i2
pcout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;*p1*p2Output*p1=10 *p2=20第65頁,共123頁,2023年,2月20日,星期二2023/4/1865//例交換指針值voidmain(){inti1=10,i2=20,*p1,*p2,*p;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;p=p1;p1=p2;p2=p;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}
p1
10i1
p2
20i2
pp=p1;*p1*p2*pOutput*p1=10 *p2=20第66頁,共123頁,2023年,2月20日,星期二2023/4/1866//例交換指針值voidmain(){inti1=10,i2=20,*p1,*p2,*p;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;p=p1;p1=p2;p2=p;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}
p1
10i1
p2
20i2
pp1=p2;*p2*pOutput*p1=10 *p2=20第67頁,共123頁,2023年,2月20日,星期二2023/4/1867//例交換指針值voidmain(){inti1=10,i2=20,*p1,*p2,*p;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;p=p1;p1=p2;p2=p;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}
p1
10i1
p2
20i2
pp1=p2;*p1*p*p2Output*p1=10 *p2=20第68頁,共123頁,2023年,2月20日,星期二2023/4/1868//例交換指針值voidmain(){inti1=10,i2=20,*p1,*p2,*p;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;p=p1;p1=p2;p2=p;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}
p1
10i1
p2
20i2
pp2=p;*p1*p*p2Output*p1=10 *p2=20第69頁,共123頁,2023年,2月20日,星期二2023/4/1869//例交換指針值voidmain(){inti1=10,i2=20,*p1,*p2,*p;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;p=p1;p1=p2;p2=p;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}
p1
10i1
p2
20i2
pp2=p;*p1*pOutput
*p1=10 *p2=20第70頁,共123頁,2023年,2月20日,星期二2023/4/1870//例交換指針值voidmain(){inti1=10,i2=20,*p1,*p2,*p;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;p=p1;p1=p2;p2=p;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}
p1
10i1
p2
20i2
pp2=p;*p1*p*p2Output
*p1=10 *p2=20第71頁,共123頁,2023年,2月20日,星期二2023/4/1871//例交換指針值voidmain(){inti1=10,i2=20,*p1,*p2,*p;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;p=p1;p1=p2;p2=p;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}
p1
10i1
p2
20i2
p*p1*p*p2cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;*p1=20 *p2=10Output
*p1=10 *p2=20第72頁,共123頁,2023年,2月20日,星期二2023/4/1872//例交換指針?biāo)笇ο蟮闹?include<iostream.h>voidmain(){inti1=10,i2=20,i,*p1,*p2;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;i=*p1;*p1=*p2;*p2=i;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}
p1
10i1
p2
20i2
iinti1=10,i2=20,i,*p1,*p2;第73頁,共123頁,2023年,2月20日,星期二2023/4/1873//例交換指針?biāo)笇ο蟮闹祐oidmain(){inti1=10,i2=20,i,*p1,*p2;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;i=*p1;*p1=*p2;*p2=i;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}
p1
10i1
p2
20i2p1=&i1;p2=&i2;*p1*p2
i第74頁,共123頁,2023年,2月20日,星期二2023/4/1874//例交換指針?biāo)笇ο蟮闹祐oidmain(){inti1=10,i2=20,i,*p1,*p2;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;i=*p1;*p1=*p2;*p2=i;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}
p1
10i1
p2
20i2cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;*p1*p2
iOutput*p1=10 *p2=20第75頁,共123頁,2023年,2月20日,星期二2023/4/1875//例交換指針?biāo)笇ο蟮闹祐oidmain(){inti1=10,i2=20,i,*p1,*p2;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;i=*p1;*p1=*p2;*p2=i;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}
p1
10i1
p2
20i2i=*p1;*p1*p2
i10Output*p1=10 *p2=20第76頁,共123頁,2023年,2月20日,星期二2023/4/1876//例交換指針?biāo)笇ο蟮闹祐oidmain(){inti1=10,i2=20,i,*p1,*p2;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;i=*p1;*p1=*p2;*p2=i;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}
p1
10i1
p2
20i2*p1=*p2;*p1*p210i
20Output*p1=10 *p2=20第77頁,共123頁,2023年,2月20日,星期二2023/4/1877//例交換指針?biāo)笇ο蟮闹祐oidmain(){inti1=10,i2=20,i,*p1,*p2;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;i=*p1;*p1=*p2;*p2=i;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}
p1
20i1
p2
20i2*p2=i;10i*p1*p2
10Output*p1=10 *p2=20第78頁,共123頁,2023年,2月20日,星期二2023/4/1878//例交換指針?biāo)笇ο蟮闹祐oidmain(){inti1=10,i2=20,i,*p1,*p2;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;i=*p1;*p1=*p2;*p2=i;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}
p1
20i1
p2
10i2cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;*p1=20 *p2=1010i*p1*p2Output*p1=10 *p2=20第79頁,共123頁,2023年,2月20日,星期二2023/4/1879【例5.6】指針變量的賦值20age218age1p_age#include<iostream>
usingnamespacestd;
intmain(){
intage1=18,age2=20,*p_age;p_age=&age1;//情況1
cout<<"age1的地址是:"<<p_age<<endl;//0012FF7Ccout<<"ageofwangpingis"<<*p_age<<endl;p_age=&age2;//情況2
cout<<"age1的地址是:"<<p_age<<endl;//0012FF78cout<<"ageofzhanglingis"<<*p_age<<endl;return0;}第80頁,共123頁,2023年,2月20日,星期二2023/4/1880指針變量的賦值、初始化與簡單應(yīng)用指針常量:指針常量是固定指向一個對象的指針,即指針本身是常量:charch=’a’,ch1=’x’;char*constptr=&ch;//注意const放在類型說明之后,變量名之前*ptr=’b’;//正確ptr=&ch1;//錯誤ptr本身在初始化時所指向的地址是不可改變的,但它指向的目標(biāo)ch的值是可以改變的。第81頁,共123頁,2023年,2月20日,星期二2023/4/1881指針變量的賦值、初始化與簡單應(yīng)用常量指針:常量指針是指向“常量”的指針,即指針本身可以改指向別的對象,但不能通過該指針修改對象,該對象可以通過其他方式修改,常用于函數(shù)的參數(shù),以免誤改了實(shí)參。類似于在“運(yùn)算符重載”一節(jié)中引用參數(shù)前加const。charch=’a’,ch1=’x’;constchar*ptr1=&ch;//ptr1是常量指針*ptr1=’b’;//錯誤,只能做ch=’b’ptr1=&ch1;//正確第82頁,共123頁,2023年,2月20日,星期二2023/4/1882this指針
問:當(dāng)在對象的外部訪問該對象的公有成員時,必須指明是哪一個對象。但是當(dāng)我們用對象的成員函數(shù)來訪問本對象的成員時,在成員函數(shù)中只要給出成員名就可以實(shí)現(xiàn)對該對象成員的訪問。再進(jìn)一步可用同一個類創(chuàng)建很多個對象,但它們共用同一份成員函數(shù)的代碼。既然是同一份代碼,那么成員函數(shù)又怎么知道是取哪一個對象的成員數(shù)據(jù)呢?答:
當(dāng)調(diào)用一個成員函數(shù)時,系統(tǒng)自動產(chǎn)生一個隱藏的指針,這個指針稱為this指針,它始終指向產(chǎn)生這個調(diào)用的對象,并將該指針作為一個參數(shù)自動傳遞給該成員函數(shù)。這就是說,成員操作符總是要使用的,只不過在對象內(nèi)是隱式的,而在對象外是顯式的。即在對象內(nèi)省略了this指針。第83頁,共123頁,2023年,2月20日,星期二2023/4/1883this指針this指針的實(shí)現(xiàn):
1.改變類成員函數(shù)的定義,用附加參數(shù)this指針來定義每個成員函數(shù)。如:voidCgoods::RegisterGoods(Cgoods*this,char*nam,
intamount,floatprice){strcpy(this->Name,name);this->Amount=amount;
this->price=price;}
2.每個類成員函數(shù)的調(diào)用,加上一個附加的實(shí)參——被調(diào)用對象的地址。如:Car1.RegisterGoods(String,number,pr);改變?yōu)椋篟egisterGoods(&Car1,String,number,pr);第84頁,共123頁,2023年,2月20日,星期二2023/4/1884this指針this指針的使用:通常this指針不必寫成顯式的,但是有時必須寫成顯式的,如在對復(fù)數(shù)類的賦值號重載中需要返回當(dāng)前調(diào)用的對象時:Complex&Complex::operator=(Complex&c){real=c.real;image=c.image;
return*this;}Complex&Complex::operator+=(Complex&com){real+=com.real;image+=com.image;
return*this;}
靜態(tài)成員函數(shù)沒有this指針。因?yàn)槠胀ǔ蓡T函數(shù)雖然在物理上只有一份代碼,但在邏輯上都認(rèn)為一個對象有一份代碼,所以有this指針,而靜態(tài)成員函數(shù)在邏輯上也
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023年度初級軟考練習(xí)題及參考答案詳解
- 供應(yīng)鏈管理優(yōu)化方案決策支持模板
- 安全員A證考試能力測試B卷帶答案詳解(綜合卷)
- 安全員A證考試通關(guān)模擬卷附參考答案詳解(培優(yōu))
- 2025年安全員A證考試預(yù)測試題附答案詳解【能力提升】
- 安全員A證考試綜合提升試卷及參考答案詳解【模擬題】
- 2025年網(wǎng)絡(luò)安全法規(guī)適用知識普及試題及答案解析
- 安全員A證考試題庫檢測題型及完整答案詳解【易錯題】
- 安全員A證考試綜合檢測題型匯編附完整答案詳解(考點(diǎn)梳理)
- 一建《建筑工程實(shí)務(wù)》點(diǎn)睛卷考試題庫考前沖刺試卷及參考答案解析
- 2025房屋購買借款合同
- 建筑工程施工質(zhì)量控制問題及優(yōu)化對策研究
- 公司合作項目參與人員證明書(6篇)
- 停車場地租用合同書
- 2025年福建廈門高三一模高考數(shù)學(xué)試卷試題(含答案詳解)
- 喉返神經(jīng)損傷預(yù)防
- 《汽車用先進(jìn)高強(qiáng)鋼 薄板和薄帶 擴(kuò)孔試驗(yàn)方法》
- 脾破裂手術(shù)配合
- 2023年高級售后工程師年度總結(jié)及下一年展望
- 【語文】湖南省長沙市實(shí)驗(yàn)小學(xué)小學(xué)四年級上冊期末試卷(含答案)
- 阿米巴經(jīng)營模式-人人都是經(jīng)營者推行授課講義課件
評論
0/150
提交評論