計算機網(wǎng)絡(luò)管理_第1頁
計算機網(wǎng)絡(luò)管理_第2頁
計算機網(wǎng)絡(luò)管理_第3頁
計算機網(wǎng)絡(luò)管理_第4頁
計算機網(wǎng)絡(luò)管理_第5頁
已閱讀5頁,還剩118頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

計算機網(wǎng)絡(luò)管理第一頁,共一百二十三頁,編輯于2023年,星期一本章將深入學習數(shù)組包括多維數(shù)組的知識和應(yīng)用,以及它們與指針的關(guān)系。

C++語言擁有在運行時獲得變量地址和操縱地址的能力,這種可用來操縱地址的變量類型就是指針。指針可以用于數(shù)組,用于內(nèi)存訪問,還可作為函數(shù)的參數(shù)。本章重點第二頁,共一百二十三頁,編輯于2023年,星期一2023/6/625.1.1數(shù)組、數(shù)組元素及其存儲方式

5.1.2數(shù)組名作為函數(shù)參數(shù)數(shù)組第三頁,共一百二十三頁,編輯于2023年,星期一2023/6/63數(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ù)組第四頁,共一百二十三頁,編輯于2023年,星期一2023/6/64

0

1

2

3

21

34fibon[0]fibon[1]fibon[2]fibon[3]fibon[8]fibon[9]圖5.1

數(shù)組在內(nèi)存中的存儲數(shù)組元素的訪問方式:通過下標操作符(subscript),按元素在數(shù)組中的位置進行訪問,稱為索引訪問(indexing)或下標訪問(subscripting)。參見圖5.1

。數(shù)組與數(shù)組元素及其存儲方式第五頁,共一百二十三頁,編輯于2023年,星期一2023/6/65注意:

1:數(shù)組是一種組合類型,是不能作為一個整體進行訪問和處理的,只能按元素進行個別的訪問和處理。

2:

C++數(shù)組第一個元素的下標為0,而不是1,且下標表達方式是固定的。

3:數(shù)組元素在內(nèi)存中是從低地址開始順序排列,各元素的存儲單元占用內(nèi)存大小相同,各元素的存儲單元之間沒有空隙,可以從數(shù)組第一個元素存儲單元的起始地址計算出任意一個元素存儲單元的起始地址。數(shù)組與數(shù)組元素及其存儲方式第六頁,共一百二十三頁,編輯于2023年,星期一2023/6/66【例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;}第七頁,共一百二十三頁,編輯于2023年,星期一2023/6/67結(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},……};當提供了數(shù)組中所有結(jié)構(gòu)值時,不必用這種括號的形式。keywordkeytab[]={"auto",0,"break",0,"case",0,"char",0,……"unsigned",0,"volatile",0,"while",0,};數(shù)組與數(shù)組元素及其存儲方式第八頁,共一百二十三頁,編輯于2023年,星期一2023/6/68對象數(shù)組定義:

CGoodsgoods[3];該商品類對象數(shù)組包含3個商品對象數(shù)組元素,系統(tǒng)調(diào)用3次默認的構(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)用默認的構(gòu)造函數(shù),初始化goods[2]};數(shù)組與數(shù)組元素及其存儲方式第九頁,共一百二十三頁,編輯于2023年,星期一2023/6/69數(shù)組作為參數(shù):

數(shù)組可以作為函數(shù)的參數(shù)。在函數(shù)調(diào)用時傳遞實參數(shù)組的首地址,所以在被調(diào)函數(shù)中對形參數(shù)組的處理實際就是對調(diào)用函數(shù)的實參數(shù)組的處理。

C++只傳遞數(shù)組首地址,而對數(shù)組邊界不加檢查。這帶來的好處是,函數(shù)對長度不等的同類數(shù)組都通用。如要指定長度可以設(shè)定另一個參數(shù)來傳遞數(shù)組元素的個數(shù)。數(shù)組名作為函數(shù)參數(shù)第十頁,共一百二十三頁,編輯于2023年,星期一2023/6/610數(shù)組名作為函數(shù)參數(shù)數(shù)組元素作實參,與單個變量一樣。數(shù)組名作參數(shù),形、實參數(shù)都應(yīng)是數(shù)組名,類型要一樣,傳送的是數(shù)組首地址。對形參數(shù)組的改變會直接影響到實參數(shù)組。第十一頁,共一百二十三頁,編輯于2023年,星期一2023/6/611【例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]=“是華中科技大學學生";strcat(a,b);cout<<a<<endl;//打印字符數(shù)組a}第十二頁,共一百二十三頁,編輯于2023年,星期一2023/6/612多維數(shù)組

C++中數(shù)組可以嵌套,就是多維數(shù)組。定義二維數(shù)組的通用格式為:

類型說明符數(shù)組名[常量行表達式][常量列表達式];行與列用常量表達式表示。第十三頁,共一百二十三頁,編輯于2023年,星期一2023/6/613二維數(shù)組:一維數(shù)組可對應(yīng)數(shù)學中的向量,而二維數(shù)組可對應(yīng)矩陣,可用一個二維數(shù)組存儲矩陣。

多維數(shù)組存儲與訪問方式119753117131175312108642二維數(shù)組的橫向稱為行,縱向稱為列,上面這個數(shù)組為三行六列。第十四頁,共一百二十三頁,編輯于2023年,星期一2023/6/614多維數(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;第十五頁,共一百二十三頁,編輯于2023年,星期一2023/6/615多維數(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];第十六頁,共一百二十三頁,編輯于2023年,星期一2023/6/616多維數(shù)組存儲與訪問方式多維數(shù)組的數(shù)組名:代表數(shù)組中第一維(最高維)第一個元素(0號元素)在內(nèi)存中的首地址,如三維數(shù)組的數(shù)組名代表的是組成三維數(shù)組的第一個二維數(shù)組的存儲首地址。當數(shù)組作為函數(shù)的參數(shù)進行傳遞時,多維數(shù)組同樣是作為第一維第一個數(shù)組的首地址傳遞給函數(shù),所以物理上是傳地址。在函數(shù)中對形參的數(shù)組元素的修改實際上是對作為實參的原數(shù)組的元素進行修改。第十七頁,共一百二十三頁,編輯于2023年,星期一2023/6/617多維數(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}};第十八頁,共一百二十三頁,編輯于2023年,星期一2023/6/618多維數(shù)組存儲與訪問方式1416192589101571212182024741361091013141567511109878129412231516691153152619221445321821171693211191713117530076543210圖5.4極點與鞍點示意圖【例5.4】已知矩陣

intmat[8][8],找出其中的極點與鞍點。如某元素在所在行相鄰點中與所在列相鄰點中均為最大或最小,則為極點;如某元素在所在行(或列)相鄰點中為最大,同時該元素在所在列(或行)相鄰點中為最小,則為鞍點。第十九頁,共一百二十三頁,編輯于2023年,星期一2023/6/619【例5.4】矩陣極點與鞍點

#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第二十頁,共一百二十三頁,編輯于2023年,星期一2023/6/620intmain(

){

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<<"極大點:";

elseif(k==-1&&l==-1)cout<<"極小點:";

elsecout<<“鞍點:”;cout<<setw(2)<<mat[i][j]<<";i="<<i<<";j="<<j<<endl;}

return0;}【例5.4】矩陣極點與鞍點第二十一頁,共一百二十三頁,編輯于2023年,星期一2023/6/621舉例:使用數(shù)組名作為函數(shù)參數(shù)主函數(shù)中初始化一個矩陣并將每個元素都輸出,然后調(diào)用子函數(shù),分別計算每一行的元素之和,將和直接存放在每行的第一個元素中,返回主函數(shù)之后輸出各行元素的和。第二十二頁,共一百二十三頁,編輯于2023年,星期一2023/6/622#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]<<““;}運行結(jié)果:123423453456Sumofrow0is10Sumofrow1is14Sumofrow2is18101418第二十三頁,共一百二十三頁,編輯于2023年,星期一2023/6/623多維數(shù)組作為函數(shù)參數(shù)多維數(shù)組作為參數(shù):在作為函數(shù)的形式參數(shù)時,可以省略最高維(第一維)。因為編譯器只要根據(jù)后面每一維(從第二維開始)的大小,就可計算數(shù)組每一個元素的存儲位置?;谕瑯拥睦碛?,也只能省略最高維。進一步考慮,對多維數(shù)組,編譯器不檢查邊界,其實只是不檢查最高維(第一維)的邊界,較低各維的大小是在控制之中的。復合類型只能對各元素逐個操作,不能整體操作。

第二十四頁,共一百二十三頁,編輯于2023年,星期一2023/6/624多維數(shù)組作為函數(shù)參數(shù)【例5.5】矩陣轉(zhuǎn)置與矩陣相乘。下標作為參數(shù)傳遞。第二十五頁,共一百二十三頁,編輯于2023年,星期一2023/6/625【例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;}第二十六頁,共一百二十三頁,編輯于2023年,星期一2023/6/626【例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;}第二十七頁,共一百二十三頁,編輯于2023年,星期一2023/6/627【例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;}第二十八頁,共一百二十三頁,編輯于2023年,星期一2023/6/628指針與地址

5.3.1指針的概念5.3.2指針變量的賦值、初始化與簡單應(yīng)用第二十九頁,共一百二十三頁,編輯于2023年,星期一2023/6/629引例尋找保險箱密碼

一個關(guān)于特工007尋找保險箱密碼的故事…關(guān)鍵點分析得到線索:0200單元的“東九號”寄存箱提示地址:1900單元找到目標:“啟明號”寄存箱取出內(nèi)容:911第三十頁,共一百二十三頁,編輯于2023年,星期一2023/6/630尋找密碼的途徑分析密碼911存放在某個寄存箱內(nèi),如果我們知道這個寄存箱的名字,就能夠找到密碼;如果不知道密碼所在的寄存箱名字,知道該寄存箱的地址也照樣能夠取出密碼;如果寄存箱的地址也不知道,但是有另外一個地方存放這個寄存箱的地址,就能順藤摸瓜,間接找到密碼。第三十一頁,共一百二十三頁,編輯于2023年,星期一2023/6/631密碼存放示意圖啟明號9111900東九號19000200名字東九號啟明號地址02001900內(nèi)容1900911第三十二頁,共一百二十三頁,編輯于2023年,星期一2023/6/632利用指針模擬尋找保險箱密碼的過程

獲取密碼的兩種方法

intmain(){ intkey=911;/*變量key存放密碼*/

int*addr=NULL;/*變量addr存放地址*/

addr=&key;/*將key的地址賦給addr*/ /*通過變量key輸出密碼值*/cout<<“密碼:“<<key;/*通過變量key的地址來輸出密碼值*/ cout<<“如果我知道存放密碼的地址,我也能找到密碼:",*addr;

return0;}密碼:911如果我知道存放密碼的地址,我也能找到密碼:911第三十三頁,共一百二十三頁,編輯于2023年,星期一2023/6/633指針的概念

指針與間接訪問:

按變量的地址直接存取變量的方法稱為“直接訪問”方式。存貯變量的內(nèi)存空間的首地址稱為該變量的地址。如果將一個變量的地址放在另一個變量中,則存放地址的變量稱為指針(Pointer)型變量。這樣存取變量,也可以間接的由指針變量取得該變量的地址進行,稱為“間接訪問”方式。

由于指針變量中的值是另一個變量的地址,習慣上形象地稱為指針變量指向該變量。指針變量中的值也簡稱為指針,所以指針就是地址。第三十四頁,共一百二十三頁,編輯于2023年,星期一2023/6/634指針變量與間址訪問

指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”例如:

inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;a=*p1+*p2;第三十五頁,共一百二十三頁,編輯于2023年,星期一2023/6/635指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:

inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;a=*p1+*p2;第三十六頁,共一百二十三頁,編輯于2023年,星期一2023/6/636指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:

inta,b;

int*p1,*p2;p1=&a;p2=&b;a=10;b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE0第三十七頁,共一百二十三頁,編輯于2023年,星期一2023/6/637指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:

inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE0第三十八頁,共一百二十三頁,編輯于2023年,星期一2023/6/638指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta

0X0066FDF4intb0X0066FDF0例如:

inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF4第三十九頁,共一百二十三頁,編輯于2023年,星期一2023/6/639指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta

0X0066FDF4intb0X0066FDF0例如:

inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF4*p1*p1指針p1所指的對象第四十頁,共一百二十三頁,編輯于2023年,星期一2023/6/640指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb

0X0066FDF0例如:

inta,b;int*p1,*p2;p1=&a;

p2=&b;a=10;b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF0*p1第四十一頁,共一百二十三頁,編輯于2023年,星期一2023/6/641指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”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第四十二頁,共一百二十三頁,編輯于2023年,星期一2023/6/642指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:

inta,b;int*p1,*p2;p1=&a;p2=&b;a=10; //*p1=10b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF010*p1*p2第四十三頁,共一百二十三頁,編輯于2023年,星期一2023/6/643指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:

inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20; //*p2=20a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF010*p1*p220第四十四頁,共一百二十三頁,編輯于2023年,星期一2023/6/644指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:

inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;

a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF010*p1*p220+第四十五頁,共一百二十三頁,編輯于2023年,星期一2023/6/645指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:

inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;

a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF030*p1*p220+第四十六頁,共一百二十三頁,編輯于2023年,星期一2023/6/646指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”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ù)第四十七頁,共一百二十三頁,編輯于2023年,星期一2023/6/647指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”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ù)第四十八頁,共一百二十三頁,編輯于2023年,星期一2023/6/648指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:

inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF030*p1*p220間址運算(指針運算)第四十九頁,共一百二十三頁,編輯于2023年,星期一2023/6/649指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:

inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF030*p1*p220指針類型說明第五十頁,共一百二十三頁,編輯于2023年,星期一2023/6/650

指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF030*p1*p220int*p1int*p2intaintb*p1*p2第五十一頁,共一百二十三頁,編輯于2023年,星期一2023/6/651定義形式:

類型*標識符;指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”第五十二頁,共一百二十三頁,編輯于2023年,星期一2023/6/652指針變量名定義形式:

類型*標識符;指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”指針類型說明符指針所指對象的類型(指針的關(guān)聯(lián))第五十三頁,共一百二十三頁,編輯于2023年,星期一2023/6/653例如int*iptr;//iptr是指向整型對象的指針,可以存放一個整型變量的地址

char*s; //s是指向字符對象的指針double*dPtr; //dPtr是指向浮點對象的指針定義形式:

類型*標識符;指針變量與間址訪問指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”第五十四頁,共一百二十三頁,編輯于2023年,星期一2023/6/654注意事項用變量地址作為初值時,該變量必須在指針初始化之前已說明過,且變量類型應(yīng)與指針類型一致??梢杂靡粋€已賦初值的指針去初始化另一個指針變量。指針變量與間址訪問指針變量的初始化第五十五頁,共一百二十三頁,編輯于2023年,星期一2023/6/655指針名=地址“地址”中存放的數(shù)據(jù)類型與指針類型必須相符。向指針變量賦的值必須是地址常量或變量,不能是普通整數(shù)。但可以賦值為整數(shù)0,表示空指針。指針的類型是它所指向變量的類型,而不是指針本身數(shù)據(jù)值的類型,任何一個指針本身的數(shù)據(jù)值都是unsignedlongint型。允許聲明指向void類型的指針。該指針可以被賦予任何類型對象的地址。例:void*general;指針變量與間址訪問第五十六頁,共一百二十三頁,編輯于2023年,星期一2023/6/656指針賦值//空指針:int*iPtr=0;char*s=NULL;double*dPtr=NULL;iPtrsdPtr指針變量與間址訪問第五十七頁,共一百二十三頁,編輯于2023年,星期一2023/6/657指針賦值inti=1;int*iPtr1,*iPtr2;char*cPtr;…iPtr1=&i; //合法iPtr2=iPtr1; //合法iPtr2=i;

//非法,i不是int*

對象cPtr=iPtr1;

//非法,iPtr1不是char*對象i=iPtr1; //非法,iPtr1不是int對象指針變量與間址訪問第五十八頁,共一百二十三頁,編輯于2023年,星期一2023/6/658舉例指針的聲明、賦值與使用#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=10第五十九頁,共一百二十三頁,編輯于2023年,星期一2023/6/659&

取地址操作 *

間址訪問操作

例如

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指針變量與間址訪問第六十頁,共一百二十三頁,編輯于2023年,星期一2023/6/660abcdef101010121014101810221023344.58.6xypapbpcpdpepf20022006`20102014201820222026101010121014101810221023&a3paa,*pa&b4pbb,*pb&c4.5pcc,*pc&d8.6pdd,*pd&expee,*pe&fypff,*pf第六十一頁,共一百二十三頁,編輯于2023年,星期一2023/6/661//例間址訪問對象voidmain(){inti,*p;

p=&i;*p=5;cout<<i<<endl;cout<<*p<<endl;cout<<p<<endl;cout<<&i<<endl;}//通過指針變量間指訪問對象用名訪問對象通過指針變量間址訪問對象指針變量的值對象i的地址取對象i的直接地址值第六十二頁,共一百二十三頁,編輯于2023年,星期一2023/6/662//例交換指針值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;第六十三頁,共一百二十三頁,編輯于2023年,星期一2023/6/663//例交換指針值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第六十四頁,共一百二十三頁,編輯于2023年,星期一2023/6/664//例交換指針值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第六十五頁,共一百二十三頁,編輯于2023年,星期一2023/6/665//例交換指針值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第六十六頁,共一百二十三頁,編輯于2023年,星期一2023/6/666//例交換指針值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第六十七頁,共一百二十三頁,編輯于2023年,星期一2023/6/667//例交換指針值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第六十八頁,共一百二十三頁,編輯于2023年,星期一2023/6/668//例交換指針值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第六十九頁,共一百二十三頁,編輯于2023年,星期一2023/6/669//例交換指針值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第七十頁,共一百二十三頁,編輯于2023年,星期一2023/6/670//例交換指針值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第七十一頁,共一百二十三頁,編輯于2023年,星期一2023/6/671//例交換指針值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第七十二頁,共一百二十三頁,編輯于2023年,星期一2023/6/672//例交換指針所指對象的值#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;第七十三頁,共一百二十三頁,編輯于2023年,星期一2023/6/673//例交換指針所指對象的值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

20i2p1=&i1;p2=&i2;*p1*p2

i第七十四頁,共一百二十三頁,編輯于2023年,星期一2023/6/674//例交換指針所指對象的值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

20i2cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;*p1*p2

iOutput*p1=10 *p2=20第七十五頁,共一百二十三頁,編輯于2023年,星期一2023/6/675//例交換指針所指對象的值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

20i2i=*p1;*p1*p2

i10Output*p1=10 *p2=20第七十六頁,共一百二十三頁,編輯于2023年,星期一2023/6/676//例交換指針所指對象的值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*p1=*p2;*p1*p210i

20Output*p1=10 *p2=20第七十七頁,共一百二十三頁,編輯于2023年,星期一2023/6/677//例交換指針所指對象的值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

20i1

p2

20i2*p2=i;10i*p1*p2

10Output*p1=10 *p2=20第七十八頁,共一百二十三頁,編輯于2023年,星期一2023/6/678//例交換指針所指對象的值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

20i1

p2

10i2cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;*p1=20 *p2=1010i*p1*p2Output*p1=10 *p2=20第七十九頁,共一百二十三頁,編輯于2023年,星期一2023/6/679【例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;}第八十頁,共一百二十三頁,編輯于2023年,星期一2023/6/680指針變量的賦值、初始化與簡單應(yīng)用指針常量:指針常量是固定指向一個對象的指針,即指針本身是常量:charch=’a’,ch1=’x’;char*constptr=&ch;//注意const放在類型說明之后,變量名之前*ptr=’b’;//正確ptr=&ch1;//錯誤ptr本身在初始化時所指向的地址是不可改變的,但它指向的目標ch的值是可以改變的。第八十一頁,共一百二十三頁,編輯于2023年,星期一2023/6/681指針變量的賦值、初始化與簡單應(yīng)用常量指針:常量指針是指向“常量”的指針,即指針本身可以改指向別的對象,但不能通過該指針修改對象,該對象可以通過其他方式修改,常用于函數(shù)的參數(shù),以免誤改了實參。類似于在“運算符重載”一節(jié)中引用參數(shù)前加const。charch=’a’,ch1=’x’;constchar*ptr1=&ch;//ptr1是常量指針*ptr1=’b’;//錯誤,只能做ch=’b’ptr1=&ch1;//正確第八十二頁,共一百二十三頁,編輯于2023年,星期一2023/6/682this指針

問:當在對象的外部訪問該對象的公有成員時,必須指明是哪一個對象。但是當我們用對象的成員函數(shù)來訪問本對象的成員時,在成員函數(shù)中只要給出成員名就可以實現(xiàn)對該對象成員的訪問。再進一步可用同一個類創(chuàng)建很多個對象,但它們共用同一份成員函數(shù)的代碼。既然是同一份代碼,那么成員函數(shù)又怎么知道是取哪一個對象的成員數(shù)據(jù)呢?答:

當調(diào)用一個成員函數(shù)時,系統(tǒng)自動產(chǎn)生一個隱藏的指針,這個指針稱為this指針,它始終指向產(chǎn)生這個調(diào)用的對象,并將該指針作為一個參數(shù)自動傳遞給該成員函數(shù)。這就是說,成員操作符總是要使用的,只不過在對象內(nèi)是隱式的,而在對象外是顯式的。即在對象內(nèi)省略了this指針。第八十三頁,共一百二十三頁,編輯于2023年,星期一2023/6/683this指針this指針的實現(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)用,加上一個附加的實參——被調(diào)用對象的地址。如:Car1.RegisterGoods(String,number,pr);改變?yōu)椋篟egisterGoods(&Car1,String,number,pr);第八十四頁,共一百二十三頁,編輯于2023年,星期一2023/6/684this指針this指針的使用:通常this指針不必寫成顯式的,但是有時必須寫成顯式的,如在對復數(shù)類的賦值號重載中需要返回當前調(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指針。因為普通成員函數(shù)雖然在物理上只有一份代碼,但在邏輯上都認為一個對象有一份代碼,所以有this指針,而靜態(tài)成員函數(shù)在邏輯上也只有一份代碼,不屬于具體的對象,當然沒有this指針第八十五頁,共一百二十三頁,編輯于2023年,星期一2023/6/685數(shù)組與指針的關(guān)系

5.5.1數(shù)組名、指針和指針運算

5.5.

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論