第八章 指标Word文档下载推荐.docx
《第八章 指标Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《第八章 指标Word文档下载推荐.docx(35页珍藏版)》请在冰豆网上搜索。
練習:
已知A33=1,2,3,4,5,6,7,8,9,試求A陣列中A之位址及A12位址指標:
存放記憶體位址的特殊變數(pointer)1、例:
double*APtr;
/定義一個指標,名稱為APtrAPtr=&
A;
/將資料A的位址用&
A存入指標說明:
APtrA0x0065FDFC0x0065FE00由上圖可知A之內容為2.5,位址為0x0065FE00,APtr將A之位址存入,變成內容,為0x0065FE00,但因為APtr本身也是資料的一種,故亦有資料四大要素名稱:
APtr資料型態:
double*資料內容:
0x0065FE00(為unsignedint)記憶體位置:
0x0065FDFC2、指標資料型態指標資料型態必須與所對應之數值相同例:
錯誤正確intX=12;
intX=12;
doubleXPtr;
intXPtr;
XPtr=&
X;
上述範例為錯誤範例因為X為integer格式而XPtr為倍精度浮點數,會在編譯時發生問題因為宣告時所指定的目標資料型態無法改變且指標只能儲存宣告時所指定資料型態的位址3、指標之意義:
一般指標的用途為間接存取資料之工具,APtr與A關係為指標APtr指向變數AAPtrA0x0065FDFC0x0065FE00例:
APtr=&
APtror&
以APtr或&
A皆可表明A之位址指標的定義方式1.定義一個指標Fptr,其中*與float及Fptr之間距離無所謂float*Fptr;
float*Fptr;
2.定義兩個指標float*Fptr,*Gptr;
3.定義時一倂給初始直float*Aptr=&
/指標Aptr指向變數A取值運算子(*indirectionoperator)例:
/A之值為2.5double*APtr=&
/A之位址存入APtr之值doubleB=*APtr;
/APtr之值所對應之數值存入B說明:
doubleB=*APtr;
表示將存在指標APtr所指之處的內容存至B之中建立A=2.5之指標APtr,再將APtr之值存入B,再將B印出變數指標與常數指標I.變數指標:
1.指標指向內容可改double*Fptr;
doubleX=2.5;
doubleY=3.5;
Fptr=&
coutTheaddressoftheXisFptrendl;
coutThevalueoftheXis*Fptrendl;
Y;
coutTheaddressoftheYisFptrendl;
coutThevalueoftheYis*Fptrendl;
2.指標可以有好幾個,如下範例double*F1ptr,*F2ptr;
doubleF=1.0;
F1ptr=&
F;
F2ptr=&
3.取值運算子可更動內容,將2.之程式加下列兩行敘述*F1ptr=56;
cout*F1ptr;
將授課內容寫成程式碼II.常數指標(constantpointer):
陣列名稱之值是陣列開頭元素的位址,即陣列名稱即是指標,因為內容不允許變動,故稱為V常數指標(constantpointer)doubleV5;
V5=1,2,3,4,5;
coutVendl;
coutV0endl;
cout&
V0endl;
以圖形表示如下VV0V1V2V3V4範例程式3.宣告一個變數a=10,然後宣告一個指標aPtr指向a,然後宣告一個變數b,以取值運算子(indirectionoperator),使b之內容為aPtr所指向變數之值。
/A-6A-2#includeusingstd:
int*aPtr=&
a;
intb;
b=*aPtr;
couta=a,andb=bendl;
8-2指標與參照指標與參照1.複習取址運算子(addressoperator)&
和取值運算子(indirectionoperator)Example:
上述程式碼片段表示,A為double格式,其值為2.5,APtr為指向A之指標,A之位址(&
A)存入APtr,而B為double格式,其值為APtr所指向之值(*APtr),其圖形如下:
APtrA0x0065FE002.複習參照doubleA;
double&
B=A;
A為double格式,B亦為double格式,且B為A之參照3.關於指標與參照的一些規定I.指標存的是變數的位置,而參照存的是變數之值且指標可以先定義,後設定指向對象,而參照必須於定義同時就進行參照範例:
coutThevalueoftheAPtris:
APtrendl;
coutThevalueoftheBis:
Bendl;
II.指標指向對象可改,而參照指向對象不可以改錯誤範例:
doubleB=3.5;
double*ABPtr=&
B;
C=A;
C=B;
/錯誤,C已參照A,故不可再改參照對象範例程式1:
/Ref.cpp#includeusingstd:
intmain()doublex=1.0;
y=x;
/定義y為x之參照double*Xptr=&
x;
/定義Xptr為x之指標coutTheoriginalvalueofthexis:
xendl;
*Xptr=5.0;
coutAfter*Xptr=5.0,thevalueofthexis:
y=7.3;
coutAftery=7.3,thevalueofthexis:
範例程式2:
已知x=2.5,y為x的參照(double&
y=x),且xPtr=&
x為指向x的指標,請用程式撰寫出(a)y=5.0時,&
y、&
x、xPtr、x及*xPtr之值為多少。
(b)x=12.5時,&
x、&
y、xPtr、y及*xPtr為多少。
/A-7B-2#includeusingstd:
setw;
intmain()/declarationofelementdoublex=2.5;
double*xPtr=&
/y=5;
y=5;
coutWhenyequalsto5,&
y=&
y,&
x=&
coutxPtr=xPtr,*xPtr=*xPtrendl;
/x=12.5;
x=12.5;
coutWhenxequalsto12.5,&
coutxPtr=xPtr,*xPtr=*xPtr,y=yendl;
範例程式3:
已知a=2.5,b=3.1;
請撰寫一個SwapF(&
a,&
b)函數,以傳址方式來交換a及b之值。
voidSwapF(double*,double*);
intmain()doublea=2.5;
doubleb=3.1;
coutBeforeswap,a=a,andb=bendl;
SwapF(&
b);
coutAfterswap,a=a,andb=bendl;
voidSwapF(double*aPtr,double*bPtr)doubletemp;
temp=*aPtr;
*aPtr=*bPtr;
*bPtr=temp;
8-3陣列元素位址計算陣列元素位址計算1、一維陣列constintm=5;
doubleAm;
inti;
coutPleaseinputthenumberwhichyouwanttoknowtheaddressi;
coutTheaddressoftheAi-1is&
A0+(i-1)or&
Ai-1endl;
A0&
A1&
A2&
A3&
A4-8bytes-8bytes-8bytes-8bytes-8bytes-故A0=&
A0+(i-1)orAm=&
Ai-12、二維陣列例如2060的二維陣列constintm=20;
constintn=60;
doubleBmn;
inti,j;
coutPleaseinputtherownumberyouwanttoshowi;
coutPleaseinputthecolumnnumberyouwanttoshowj;
coutTheaddressofBijis:
(&
B00+i*n+j)or&
Bijendl;
3、利用指標存取陣列元素指標代數doubleA5=1,2,3,4,5;
double*Aptr;
Aptr=&
A0;
/或用Aptr=A;
coutThevaluetheA0is:
*Aptrendl;
coutThevaluetheA2is:
*(Aptr+2)endl;
歸納指標代數之寫法*+p*(+p)先增加指標再取用元素*p+*(p+)先取用元素再增加指標*-p*(-p)先減少指標再取用元素*p-*(p-)先取用元素再減少指標範例程式1.#includeusingstd:
intmain()constintsize=5;
doubleVsize=48.4,39.8,40.5,42.6,41.2;
doubleSum=0.0;
doubleaverage=0.0;
double*Vptr=V;
for(inti=0;
isize;
i+)Sum+=*Vptr;
coutThesunmuationofmatrixVis:
Sumendl;
coutTheaveragevalueofmatrixVis:
Sum/(double)(size)endl;
範例程式2:
已知陣列V5=48.4,39.8,40.5,42.6,41.2,而VPtr為指標,令VPtr=V,試以*VPtr+去逐一獲得向量的各個元素,以求得向量的總合及平均值。
intmain()constintm=5;
doubleV5=48.4,39.8,40.5,42.6,41.2;
double*VPtr=V;
doublesum=0.0;
doubleaverage;
im;
i+)sum+=*VPtr+;
average=sum/m;
coutThesumofVectorVaresumendl;
coutTheaverageofVectorVis:
averageendl;
4、二維陣列的指標指標說明:
以23的double矩陣B:
constintm=2;
constintn=3;
產生1.二維陣列B232.常數指標B,B0和B1課本圖8-3-1說明:
可將二維陣列看成是由列為單位元素所組合而成的向量,而各列本身又由很多元素所組成二維陣列元素表示法下標表示法指標表示法
(1)指標表示法
(2)B00*B0*(*B)B01*(B0+1)*(*B+1)B02*(B0+2)*(*B+2)B10*B1*(*(B+1)B11*(B1+1)*(*(B+1)+1)B12*(B1+2)*(*(B+1)+2)Generalequation:
Bij=*(Bi+j)=*(*(B+i)+j)範例程式3:
用三種二維陣列的元素表示法寫成完整程式#includeusingstd:
constintrow=2;
/globalvariableconstintcol=3;
intmain()doubleBrowcol=1.8,4.9,6.8,6.2,2.1,3.4;
coutThematrixBis:
irow;
i+)for(intj=0;
jcol;
j+)coutsetw(5)Bij;
coutendl;
for(intii=0;
iirow;
ii+)for(intjj=0;
jjcol;
jj+)coutsetw(5)*(Bii+jj);
for(intiii=0;
iiirow;
iii+)for(intjjj=0;
jjjcol;
jjj+)coutsetw(5)*(*(B+iii)+jjj);
練習題:
二維陣列的表示法可以有三種,例如B00可以用指標表示成*B0或*(*B),已知二維陣列B23=1.8,4.9,6.8,6.2,2.1,3.4,請利用兩種指標表示法將此陣列印出。
8-4PointerasParameters1、首先複習callbyreference,如下例intN;
int&
M=N;
上例M為N的參數,&
為參照運算子(referenceoperator)表示M和N所代表的變數位於同一個位址上當參照用於函數時,其參數傳遞會將原有值改變,如下例#includeusingstd:
voidswap1(int&
int&
);
voidswap2(int,int);
intmain()intA=5;
intB=10;
swap1(A,B);
coutAfterexecutingswap1n;
coutThevalueofAis:
An,andthevalueofBis:
swap2(A,B);
coutAfterexecutingswap2n;
x,int&
y)inttemp;
temp=x;
x=y;
y=temp;
voidswap2(intx,inty)inttemp;
1.swap2沒有使用參照,因此函數內的值並不會改變2、參照的效果可以直接使用傳遞位址(passbyaddress)即將位址當成參數來傳遞接收端使用指標來接收位址說明:
將上例之宣告voidswap1(int&
)改成voidswap1(int*,int*)呼叫改成swap1(&
A,&
B)定義標頭voidswap1(int*x,int*y)內容temp=*x;
*x=*y;
*y=temp;
3、傳遞指標以存取陣列首先複習如何將陣列當成函數的參數(參P.7-6)如下例#includeusingstd:
doubleAverage(double,int);
doubleMaxElem(double,int);
doublePsize=48.4,39.8,40.5,42.6,41.2;
coutTheaveragevalueofPis:
Average(P,size)endl;
coutThemaximumvalueofPis:
MaxElem(P,size)endl;
doubleAverage(doubleX,intS)doublesum=0;
iS;
i+)sum+=Xi;
returnsum/double(S);
doubleMaxElem(doubleY,intS)doubleMaxE;
MaxE=Y0;
for(inti=1;
i+)if(MaxEYi)MaxE=Yi;
returnMaxE;
陣列當成函數參數時1.宣告:
doubleAverage(double,int)2.呼叫:
Average(P,size)3.定義:
Average(doubleX,intS)若採用指標來存取陣列時,其宣告定義呼叫如下1.宣告:
Average(double*,int)2.呼叫:
Average(double*V,intS)說明:
對照陣列與指標兩種傳遞方式,可了解double可轉成double*doubleXdouble*V範例程式1.利用指標的方式將兩個3*5的二維整數陣列相加,其陣列之內容可自行設定。
/B-7A-2#includeusingstd:
intmain()/declarationofelementconstintrow=3;
constintcol=5;
intArowcol=1,2,3,4,5,6,7,8,9,10,11,12,9,3,5;
intBrowcol=5,6,10,7,8,9,9,3,5,1,2,3,10,11,12;
intCrowcol=0;
/Usingpointerfor(inti=0;
irow;
jcol;
j+)*(*(C+i)+j)=*(*(A+i)+j)+*(*(B+i)+j);
for(intm=0;
mrow;
m+)for(intn=0;
ncol;
n+)coutsetw(6)*(*(C+m)+n);
請撰寫一氣泡排序之程式,其中資料的傳遞採用指標方式(Passbyreference),其需要排列之陣列為a=1,12.2,2.3,9.2,4.3,5.5,6,1,10.2,9.3,22.1,3.2。
voidbubble(double*,int);
intmain()constintsize=12;
doubleasize=1,12.2,2.3,9.2,4.3,5.5,6,1,10.2,9.3,22.1,3.2;
double*APtr=a;
bubble(APtr,size);
isize;
i+)coutai;
voidbubble(double*ptr,ints)doubleswap;
is;
i+)for(intj=i+1;
j*(ptr+j)swap=*(ptr+i);
*(ptr+i)=*(ptr+j);
*(ptr+j)=swap;
8-5FunctionPointers何謂指標函數?
函數在程式執行時,必須存在於記憶體內的某一個位址,既然有位址,就可以用指標指出其位址例如:
1、定義函數Func()的(prototype)原型doubleFunc(int);
2、定義函數指標Fptr,並給定初始化,指向函數Func()double(*Fptr)(int);
/定義函數指標Fptr,(int)與doubleFunc(int)的(int)相同Fptr=Func;
/將函數指標指向Func,函數本身就是常數指標,故可寫成本式函數指標可以直接代替函數名稱範例程式1:
在主程式中使用函數指標函數triangle(int,int)可以計算三角形面積,試於主程式中定義一個函數指標,其寫法為int(*triPtr)(int,int),使用函數指標呼叫函數以計算其面積。
程式碼/A-7A-1#includeusingstd:
inttriangle(int,int);
intmain()/declarationofelementintbase;
intheight;
int(*triPtr)(int,int);
triPtr=triangle;
coutPleaseinputthebaseoftrianglebase;
coutPleaseinputtheheightoftriangleheight;
coutTheareaoftriangleistriPtr(base,height)endl;
inttriangle(intb,inth)returnb*h/2;
將函數指標當成函數之參數#i