指標(biāo)變數(shù)的定義及初始值設(shè)定精_第1頁(yè)
指標(biāo)變數(shù)的定義及初始值設(shè)定精_第2頁(yè)
指標(biāo)變數(shù)的定義及初始值設(shè)定精_第3頁(yè)
指標(biāo)變數(shù)的定義及初始值設(shè)定精_第4頁(yè)
指標(biāo)變數(shù)的定義及初始值設(shè)定精_第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Class :SeatNo :NAME :資訊專題研究課堂講義-指標(biāo)(Pointer)3SchoollD :指標(biāo)變數(shù)的定義及初始值設(shè)定【定義1 :指標(biāo)是代表記憶體位址的變數(shù)。【比較1通常一個(gè)變數(shù)都會(huì)存放某個(gè)特定的數(shù)值。而指標(biāo)所存放的卻是某個(gè)變數(shù)的位址?!拘?【意義1【讀作1int *co untPtr, count;指定變數(shù)countPtr是指向countPtr的型別為int *int 的指標(biāo)(也就是指向整數(shù)的指標(biāo))變數(shù)count宣告int 型別,它不是一個(gè)指向int的指標(biāo)。在這個(gè)宣告中,*只會(huì)作用在yPtryPtr = &y;會(huì)將變數(shù)y的位址指定給指標(biāo)變數(shù)yPtr指定運(yùn)算式執(zhí)行後記憶體內(nèi)的

2、表示圖 這時(shí),變數(shù)yPtr 就可以說(shuō)它指向y。(二)*運(yùn)算子*運(yùn)算子通常稱為間接運(yùn)算子(indirection operator)或反參照運(yùn)算子(dereferencing operator),它會(huì)傳回其運(yùn)算元(即指 標(biāo))所指向的物件的 數(shù)值。例如,下面的敘述式prin tf( %d,* yPtr);將會(huì)印出變數(shù)y的值,也就是5。練習(xí):int a;int *aP tr;a=7;aPtr = &a;prin tf(%d, *a Ptr);試問(wèn):結(jié)果如何?.指標(biāo)運(yùn)算式和指標(biāo)的算術(shù)運(yùn)算假設(shè)陣列int v 5 ; v0 ,亦即vPtr vPtr = v; vPtr = &v已經(jīng)定義過(guò),它的第一元素在記

3、憶體中的位置為3000。假設(shè)指標(biāo)vPtr 設(shè)定成指向的值為3000。我們可以用下兩個(gè)敘述式之一,將vPtr設(shè)定成指向陣列V。countPtr。當(dāng)*用於宣告中時(shí),表示此變數(shù)是要宣告為指標(biāo)。指標(biāo)可以定義成指向任何型別的物件。【問(wèn)題11:如果要將 xPtr 和yPtr 宣告成int指標(biāo),該如何寫(xiě)呢?【注意】:請(qǐng)為指標(biāo)設(shè)定初始值,以避免非預(yù)期的結(jié)果產(chǎn)生。指標(biāo)運(yùn)算子(一)& 運(yùn)算元-取址運(yùn)算元 (address operator是一個(gè)會(huì)傳回運(yùn)算元位址的一元運(yùn)算子。舉例來(lái)說(shuō),我們宣告變數(shù)如下:int y=5;int *yP tr;以下的敘述式在傳統(tǒng)的算術(shù)運(yùn)算裡,3000 + 2可得到3002。但對(duì)指標(biāo)算術(shù)

4、運(yùn)算 當(dāng)某個(gè)指標(biāo)要加上或減去某個(gè)整數(shù)時(shí),指標(biāo)並不只是加上或減去這個(gè)整數(shù)值而已, 之物件的大小。需要加減的數(shù)目取決於物件的資料型別。例如,下面的敘述式(pointer arithmetic)而言,卻通常不是這個(gè)樣子。而是加上或減這個(gè)整數(shù)乘以指標(biāo)所指向vPtr的值為何?.【假設(shè)】:整數(shù)(int)變數(shù)佔(zhàn)4個(gè)位元組(bytes)請(qǐng)問(wèn):vPtr += 2;之後,(2)VPtr指向陣列那一個(gè)元素?假設(shè)vPtr 已遞增成3016,亦即指向v4,則以下的敘述式vPtr -=4;(1) vPtr(2) vPtr的值為何?.指向陣列那一個(gè)元素?【假設(shè)】:整數(shù)(int)變數(shù)佔(zhàn)4個(gè)位元組(bytes)指標(biāo)與陣列的關(guān)係

5、C的指標(biāo)與陣列關(guān)係非常密切,而且他們兩個(gè)幾乎都可以交換使用。陣列的名稱可想成是一個(gè)常數(shù)指標(biāo)。我們可以用指標(biāo) (Pointers )來(lái)進(jìn)行任何的陣列註標(biāo) (array subscri pting)動(dòng)作。假設(shè)整數(shù)陣列b 5 和整數(shù)指標(biāo)常數(shù)bPtr宣告如下:int b 5 ;int *bPtr;/bPtr = b;陣列名稱(不具註標(biāo))是一個(gè)指向陣列第一個(gè)元素的指標(biāo)將bPtr指定為陣列b的第一個(gè)元素的位址。這個(gè)敘述式與取得陣列中的第一個(gè)元素的位址是相同的,我們將它表示如下:(1).(2).(3).bPtr = &b0 ;b 3 元素的值可寫(xiě)成指標(biāo)形態(tài)的*( bPtr +位址 &b 3 可以寫(xiě)成以下的指

6、標(biāo)運(yùn)算式運(yùn)算式*( b +3 ) 也會(huì)參照元素b 3 3 ) 其中3是指這個(gè)指標(biāo)開(kāi)始算起的位移值(offset)。bPtr +3而且以陣列名稱來(lái)當(dāng)作指標(biāo)。不過(guò),在任何情況下,你一般而言,所以註標(biāo)式的陣列運(yùn)算式,都可以改寫(xiě)成指標(biāo)與位移的形式,都不可以更改上述敘述式中的陣列名稱;b依然指向陣列的第一個(gè)元素。指標(biāo)也可以如陣列般地使用註標(biāo)表示法。例如,如果bPtr的值是b, bPtr 1 參照了陣列元素b 1 這樣的表示法稱為指標(biāo)/註標(biāo)表示法(Pointer/subscript notation )。請(qǐng)不要忘記陣列名稱實(shí)際上是個(gè)常數(shù)指標(biāo),它會(huì)一直指向陣列的開(kāi)頭。因此下列的運(yùn)算式 b += 3是不合法的

7、,因?yàn)樗鼑L試以指標(biāo)算術(shù)運(yùn)算來(lái)更改陣列名稱的值。傳址呼叫 Calling Functions傳遞引數(shù)給函式值呼叫(pass-by-value)和傳址呼叫(pass-by-reference)。C語(yǔ)言中所有的引數(shù)都是以 值來(lái)進(jìn)行傳遞。 在C中,程式設(shè)計(jì)師會(huì)利用指標(biāo)和間接運(yùn)算子來(lái)模擬傳址呼叫的動(dòng)作。&來(lái)加以達(dá)成。若傳給某個(gè)函式的引數(shù)應(yīng)該要更改的話,則傳遞此引數(shù)的位址給函式。這可以在欲更改的變數(shù)之前加上swap( & array j ,&array j + 1 );當(dāng)傳遞變數(shù)的位址給函式時(shí),函式可以利用間接運(yùn)算子(* )來(lái)更改位於呼叫者記憶體內(nèi)的數(shù)值。例:void swap( int *element

8、1 Ptr, int *element2 Ptr) int hold =* element1 Ptr;* element1 Ptr =* element2Ptr;* element2Ptr = hold;使用傳址呼叫的氣泡排序法當(dāng)你在傳遞一個(gè)陣列給某函式時(shí),請(qǐng)務(wù)必將此陣列的大小一起傳進(jìn)去。這可以使你的函式更一般化。一般化的函式通常可在許多程式裡重複使用。1456789/* Fig. 7.15: fig07_15.c*/ #include #define SIZE 10void bubbleSoil(int * const arrayconst int size);101112int a SIZ

9、E = 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 ;14int i;16p rintf( Data items in original ordern);19for ( i = 0; i SIZE; i+ ) 20p rintf( %4d, a i );2123bubbleSort(a, SIZE );/* sort the array */2425p rintf( nData items in ascending ordern)262728for ( i = 0; i SIZE; i+ ) 29p rintf( %4d, a i );3032p rintf( n);

10、34return 0;363839void bubbleSort(int * const array, const int size4041void swa p(int *element1 Ptr,int *element2 Ptr42int p ass;43int j;4446for ( p ass = 0; p ass size - 1; p ass+ ) 49for ( j = 0; j array j + 1 ) 53swa p(&array j , &array j + 1 )545658606364void swa p(int *element1 Ptr, int*element2

11、 Ptr6566int hold = *element1 Ptr;67*element1 Ptr = *element2 Ptr;68*element2 Ptr = hold;69int main());資訊專題研究課堂講義-指標(biāo)(Pointer)11sizeof運(yùn)算子sizeof (變數(shù)型態(tài))會(huì)傳回一個(gè)整數(shù),這個(gè)整數(shù)便是此變數(shù)型態(tài)所佔(zhàn)用的位元組個(gè)數(shù)。用來(lái)存放某一種資料型別的位元組個(gè)數(shù),可能會(huì)隨著系統(tǒng)上的不同而有所差異。當(dāng)你撰寫(xiě)的程式與資料型別的大小有關(guān), 而且必須在數(shù)種電腦上執(zhí)行時(shí),你最好使用sizeof來(lái)判斷資料型別所佔(zhàn)用的位元組個(gè)數(shù)。問(wèn)題 問(wèn)題 問(wèn)題 問(wèn)題2:3:4:5:sizeof (

12、 int ) sizeof ( float ) sizeof ( double ) 若 float real答案為何?一 答案為何?_ 答案為何?20;答案為何?22;答案為何?sizeof ( real )問(wèn)題 6:若 double money sizeof ( money )指標(biāo)與函數(shù)當(dāng)程式中需要傳遞兩個(gè)以上的值,就無(wú)法利用 指標(biāo)就可以解決函數(shù)間傳遞多個(gè)傳回值的問(wèn)題。在函數(shù)中,若是想傳回某個(gè)結(jié)果給原呼叫函數(shù),可以用 所以, 此時(shí),return敘述,但是,return敘述只能傳回一個(gè)值! return 敘述。【練習(xí)】:請(qǐng)寫(xiě)下執(zhí)行結(jié)果(並說(shuō)明)#include void swa p(int,i

13、nt); int main(void)int a=3,b=5;#include void swa p(int *,int *); int main(void)int a=3,b=5;P rintf(Before swa p.);p rintf(a=%d,b=%dn,a,b); p rintf(After swap.);swa p(a,b);p rintf(a=%d,b=%dn,a,b); return 0;/*將兩數(shù)互換*/void swa p(int x , int y)int temp;temp=x;x=y;y=te mp;return;p rintf(Before swa p.);p r

14、intf(a=%d,b=%dn,a,b); p rintf(After swa p.);swa p(&a,&b);p rintf(a=%d,b=%dn,a,b); return 0;/* 將兩數(shù)互換*/void swa p(int *x , int *y)int temp;temp=*x;*x=*y;*y=te mp;return;CALL by VALUE (傳值呼叫) 執(zhí)行結(jié)果:Call by Reference執(zhí)行結(jié)果:(傳址呼叫)動(dòng)態(tài)配置記憶體:【一維指標(biāo)】float * abc;abc = (float *)malloc( sizeof( float )【二維指標(biāo)】int *arra

15、yl =(int *)malloc( nrows * sizeof(int *)for(i = 0; i nrows; i+)array1i=(int *) malloc( ncolumns * sizeof(int)【範(fàn)例】:#include #include int main()int * score;int i;int num;int sum;float ave;sum=0;p rintf(scanf(score =“請(qǐng)輸入學(xué)生人數(shù)%d,& num);(int *) malloc( num *:);sizeof(int));if (!score)p rintf(“Memory alloc

16、ate fail!exit(1);n );for (i=0; i %d , score + i );*(score + i) ;);ave =p rintf(float) sum / (float) The average is %6num;n” ,ave);system( “PAUSE); return 0;Homework】:請(qǐng)依據(jù)使用者輸入的資料數(shù)n,亂數(shù)產(chǎn)生n個(gè)數(shù),存入陣列中,並進(jìn)行排序。Class :SeatNo :NAME :SchoollD :2/7指標(biāo)隨堂練習(xí):時(shí)間(3 0 min)運(yùn)算子會(huì)傳回其運(yùn)算元存放在記憶體中的位置。(5pt)運(yùn)算子會(huì)傳回其運(yùn)算元所指之物件的值。(5pt

17、)請(qǐng)寫(xiě)岀以下敘述式(20 pt)1.宣告兩個(gè)整數(shù)變數(shù)a, b 。a的初始值為5, b的初始值為10。2.宣告兩個(gè)整數(shù)指標(biāo)ptr1和 ptr23.將 ptr1設(shè)為a的位址4.將 ptr2設(shè)為b的位址四、int a;int *p2;a=10;p2 = &a;五、試問(wèn):*p2的值為何?(5pt)若宣告與程式敘述如下:int a5= 4, 6 20, 30, 5;int *ptr;ptr = a;請(qǐng)寫(xiě)岀下列運(yùn)算式的值:1.*( ptr + 3)(5pt)2.*( ptr + 0)(5pt)請(qǐng)寫(xiě)岀下列程式執(zhí)行結(jié)果#i nclude int main(v oid)六、(5pt)int a3=5,7,9;i

18、nt i,sum=0;for(i=0;i3;i+)sum+=*(a+i);prin tf(sum=%dn,sum); return 0;執(zhí)行結(jié)果:sum =Bytes )o請(qǐng)問(wèn)以下的陣列宣告,七、假設(shè)double所佔(zhàn)記憶體空間為8個(gè)位元組(double stude nt40;貝 U sizeof(stude nt)的值為(Bytes) ? (5pt)八、請(qǐng)寫(xiě)岀下列程式執(zhí)行結(jié)果(10 pt)#i nclude void rect(i nt, in t, int *,i nt *); int main( void)int a=5,b=8;int area,le ngth;rect(a,b, &area,&len gth);/*計(jì)算面積及邊長(zhǎng)*/prin tf(area=%d,total le ngth=%dn,area,le ngth); return 0;void rect(i nt x , int y, int *p tr1, int *p tr2)*p tr1=x*y;*p tr2=2*(x+y);return;執(zhí)行結(jié)果:area=,total le ngth=

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論