版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Class :SeatNo :NAME :資訊專題研究課堂講義-指標(Pointer)3SchoollD :指標變數的定義及初始值設定【定義1 :指標是代表記憶體位址的變數。【比較1通常一個變數都會存放某個特定的數值。而指標所存放的卻是某個變數的位址。【宣告1【意義1【讀作1int *co untPtr, count;指定變數countPtr是指向countPtr的型別為int *int 的指標(也就是指向整數的指標)變數count宣告int 型別,它不是一個指向int的指標。在這個宣告中,*只會作用在yPtryPtr = &y;會將變數y的位址指定給指標變數yPtr指定運算式執行後記憶體內的
2、表示圖 這時,變數yPtr 就可以說它指向y。(二)*運算子*運算子通常稱為間接運算子(indirection operator)或反參照運算子(dereferencing operator),它會傳回其運算元(即指 標)所指向的物件的 數值。例如,下面的敘述式prin tf( %d,* yPtr);將會印出變數y的值,也就是5。練習:int a;int *aP tr;a=7;aPtr = &a;prin tf(%d, *a Ptr);試問:結果如何?.指標運算式和指標的算術運算假設陣列int v 5 ; v0 ,亦即vPtr vPtr = v; vPtr = &v已經定義過,它的第一元素在記
3、憶體中的位置為3000。假設指標vPtr 設定成指向的值為3000。我們可以用下兩個敘述式之一,將vPtr設定成指向陣列V。countPtr。當*用於宣告中時,表示此變數是要宣告為指標。指標可以定義成指向任何型別的物件。【問題11:如果要將 xPtr 和yPtr 宣告成int指標,該如何寫呢?【注意】:請為指標設定初始值,以避免非預期的結果產生。指標運算子(一)& 運算元-取址運算元 (address operator是一個會傳回運算元位址的一元運算子。舉例來說,我們宣告變數如下:int y=5;int *yP tr;以下的敘述式在傳統的算術運算裡,3000 + 2可得到3002。但對指標算術
4、運算 當某個指標要加上或減去某個整數時,指標並不只是加上或減去這個整數值而已, 之物件的大小。需要加減的數目取決於物件的資料型別。例如,下面的敘述式(pointer arithmetic)而言,卻通常不是這個樣子。而是加上或減這個整數乘以指標所指向vPtr的值為何?.【假設】:整數(int)變數佔4個位元組(bytes)請問:vPtr += 2;之後,(2)VPtr指向陣列那一個元素?假設vPtr 已遞增成3016,亦即指向v4,則以下的敘述式vPtr -=4;(1) vPtr(2) vPtr的值為何?.指向陣列那一個元素?【假設】:整數(int)變數佔4個位元組(bytes)指標與陣列的關係
5、C的指標與陣列關係非常密切,而且他們兩個幾乎都可以交換使用。陣列的名稱可想成是一個常數指標。我們可以用指標 (Pointers )來進行任何的陣列註標 (array subscri pting)動作。假設整數陣列b 5 和整數指標常數bPtr宣告如下:int b 5 ;int *bPtr;/bPtr = b;陣列名稱(不具註標)是一個指向陣列第一個元素的指標將bPtr指定為陣列b的第一個元素的位址。這個敘述式與取得陣列中的第一個元素的位址是相同的,我們將它表示如下:(1).(2).(3).bPtr = &b0 ;b 3 元素的值可寫成指標形態的*( bPtr +位址 &b 3 可以寫成以下的指
6、標運算式運算式*( b +3 ) 也會參照元素b 3 3 ) 其中3是指這個指標開始算起的位移值(offset)。bPtr +3而且以陣列名稱來當作指標。不過,在任何情況下,你一般而言,所以註標式的陣列運算式,都可以改寫成指標與位移的形式,都不可以更改上述敘述式中的陣列名稱;b依然指向陣列的第一個元素。指標也可以如陣列般地使用註標表示法。例如,如果bPtr的值是b, bPtr 1 參照了陣列元素b 1 這樣的表示法稱為指標/註標表示法(Pointer/subscript notation )。請不要忘記陣列名稱實際上是個常數指標,它會一直指向陣列的開頭。因此下列的運算式 b += 3是不合法的
7、,因為它嘗試以指標算術運算來更改陣列名稱的值。傳址呼叫 Calling Functions傳遞引數給函式值呼叫(pass-by-value)和傳址呼叫(pass-by-reference)。C語言中所有的引數都是以 值來進行傳遞。 在C中,程式設計師會利用指標和間接運算子來模擬傳址呼叫的動作。&來加以達成。若傳給某個函式的引數應該要更改的話,則傳遞此引數的位址給函式。這可以在欲更改的變數之前加上swap( & array j ,&array j + 1 );當傳遞變數的位址給函式時,函式可以利用間接運算子(* )來更改位於呼叫者記憶體內的數值。例:void swap( int *element
8、1 Ptr, int *element2 Ptr) int hold =* element1 Ptr;* element1 Ptr =* element2Ptr;* element2Ptr = hold;使用傳址呼叫的氣泡排序法當你在傳遞一個陣列給某函式時,請務必將此陣列的大小一起傳進去。這可以使你的函式更一般化。一般化的函式通常可在許多程式裡重複使用。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());資訊專題研究課堂講義-指標(Pointer)11sizeof運算子sizeof (變數型態)會傳回一個整數,這個整數便是此變數型態所佔用的位元組個數。用來存放某一種資料型別的位元組個數,可能會隨著系統上的不同而有所差異。當你撰寫的程式與資料型別的大小有關, 而且必須在數種電腦上執行時,你最好使用sizeof來判斷資料型別所佔用的位元組個數。問題 問題 問題 問題2:3:4:5:sizeof (
12、 int ) sizeof ( float ) sizeof ( double ) 若 float real答案為何?一 答案為何?_ 答案為何?20;答案為何?22;答案為何?sizeof ( real )問題 6:若 double money sizeof ( money )指標與函數當程式中需要傳遞兩個以上的值,就無法利用 指標就可以解決函數間傳遞多個傳回值的問題。在函數中,若是想傳回某個結果給原呼叫函數,可以用 所以, 此時,return敘述,但是,return敘述只能傳回一個值! return 敘述。【練習】:請寫下執行結果(並說明)#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;/*將兩數互換*/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;/* 將兩數互換*/void swa p(int *x , int *y)int temp;temp=*x;*x=*y;*y=te mp;return;CALL by VALUE (傳值呼叫) 執行結果:Call by Reference執行結果:(傳址呼叫)動態配置記憶體:【一維指標】float * abc;abc = (float *)malloc( sizeof( float )【二維指標】int *arra
15、yl =(int *)malloc( nrows * sizeof(int *)for(i = 0; i nrows; i+)array1i=(int *) malloc( ncolumns * sizeof(int)【範例】:#include #include int main()int * score;int i;int num;int sum;float ave;sum=0;p rintf(scanf(score =“請輸入學生人數%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】:請依據使用者輸入的資料數n,亂數產生n個數,存入陣列中,並進行排序。Class :SeatNo :NAME :SchoollD :2/7指標隨堂練習:時間(3 0 min)運算子會傳回其運算元存放在記憶體中的位置。(5pt)運算子會傳回其運算元所指之物件的值。(5pt
17、)請寫岀以下敘述式(20 pt)1.宣告兩個整數變數a, b 。a的初始值為5, b的初始值為10。2.宣告兩個整數指標ptr1和 ptr23.將 ptr1設為a的位址4.將 ptr2設為b的位址四、int a;int *p2;a=10;p2 = &a;五、試問:*p2的值為何?(5pt)若宣告與程式敘述如下:int a5= 4, 6 20, 30, 5;int *ptr;ptr = a;請寫岀下列運算式的值:1.*( ptr + 3)(5pt)2.*( ptr + 0)(5pt)請寫岀下列程式執行結果#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;執行結果:sum =Bytes )o請問以下的陣列宣告,七、假設double所佔記憶體空間為8個位元組(double stude nt40;貝 U sizeof(stude nt)的值為(Bytes) ? (5pt)八、請寫岀下列程式執行結果(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);/*計算面積及邊長*/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;執行結果:area=,total le ngth=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 合伙固定分红合同范本
- 合同权利义务让与协议
- 利雅德酒店住宿协议书
- 保理合同协议文本模板
- 修车协议合同模板模板
- 农村供水工艺流程优化
- 兼职托管教师合同范本
- 会所转让委托合同范本
- 合同对数据的保密协议
- 合伙合同增资补充协议
- 2024年国家公务员考试《行测》真题卷(行政执法)答案和解析
- 生猪屠宰兽医卫生检验人员理论考试题库及答案
- 仙居县国企招聘考试真题及答案
- 工业机器人系统集成(高职)PPT全套完整教学课件
- 美学原理PPT课件:技术美
- 应力腐蚀和氢脆
- GA/T 830-2021尸体解剖检验室建设规范
- 责任担当斗争精神自查问题清单
- 基于STM32的自动灌溉系统
- 《等边三角形》第1课时-示范教学课件【初中数学人教版八年级上册】
- 电梯日常巡视记录表(日检查表)
评论
0/150
提交评论