Presentation is loading. Please wait.

Presentation is loading. Please wait.

第十章 指標.

Similar presentations


Presentation on theme: "第十章 指標."— Presentation transcript:

1 第十章 指標

2 10-1 指標的基本概念 何謂指標(pointer) 『&』與『*』是指標中最常見的兩種運算符號 指標在C語言中代表一種變數
用來存取記憶體位址,可能是字元,可能是整數型態,也可能為指標本身變數的位址。 藉由指標,程式可間接取得該指標所指位址的變數值。 『&』與『*』是指標中最常見的兩種運算符號 『&』:取得位址運算符號 用來取得該變數在記憶體中的位址。 『*』 :間接定址運算符號 用來取得該指標所指向變數(位址)的內容值。

3 『&』運算符號的使用方法 int x = 8, *ptr; /* x是一個整數變數,而*ptr 是指向整數變數的內容值*/
位址 內容值 1268 8 x (1) 整數變數x = 8 ptr (2)‘&’用來取得x在記憶體中的位址

4 『*』運算符號的使用方法 int x = 8; ptr = &x; y = *ptr; /* 符號*用來取得該指標所指向
變數(位址)的內容值 = 8 */ 位址:1268 8 (1) (2) 1268 y *ptr x

5 範例 Ch10_1 (1/2) Ch10_1 『&』與『*』基本搭配運用 1 #include<stdio.h>
2 void main( ) 3 { 4 int x = 15; 5 int *ptr; /*宣告ptr是一個指向整數變數的指標*/ 6 ptr = &x; /*以&取得x的位址,然後設定給ptr */ 7 printf("ptr = %p, *ptr = %d\n", ptr, *ptr); 8 printf("&x = %p, x = %d\n", &x, x); 9 }

6 Ch10_1 輸出結果 (2/2) 程式執行結果 圖解說明 ptr = FFF4, *ptr = 15 &x = FFF4, x =15

7 10-1-2 指標與位址 指標與位址間基本之運用 以傳值呼叫(Call by value)為例,來說明指標如何來傳遞資料
傳值呼叫特色在於主程式呼叫副程式時,主程式之實際參數串列的值,傳給對應的副程式形式參數串列。 副程式執行時,作業系統額外分配記憶體位置給副程式的參數串列。副程式執行完畢,主程式的參數值不變。

8 範例 Ch10_2(1/4) Ch10_2 傳址法的應用 1 #include<stdio.h>
2 int func(int *, int *); 3 void main( ) 4 { int x = 5, y = 10, z; z = func(&x, &y); /* 呼叫函數func( )傳入x與y的 位址值,將傳回值給z */ printf("x = %d &x = %d\n", x, &x); printf("y = %d &y = %d\n", y, &y); printf("z = x + y = %d &z = %d\n", z, &z); 10 }

9 範例 Ch10_2 (2/4) 11 int func(int *m, int *n) /*將x的位址給m指標來指向,
而y的位址給n指標來指向 */ 12 { int r; r = *m + *n; printf("*m = %d n = %d\n", *m, m); printf("*n = %d n = %d\n", *n, n); printf(“r = x + y = %d &r = %d\n", r, &r); return(r); 19 }

10 Ch10_2 輸出結果 (3/4) 程式執行結果 *m = 5 m = 1245052 *n = 10 n = 1245048
r = x + y = 15 &r = x = 5 &x = y = 10 &y = z = x + y = 15 &z =

11 Ch10_2 輸出結果 (4/4) 圖解說明 副程式 主程式 5 10 15 x + y x y z *m *n r 位址:1244948
位址: 位址: 位址: 副程式 主程式 5 10 15 x + y x y z *m *n r

12 10-2 雙重指標 何謂雙重指標 雙重指標又可以稱做指標中的指標 表示方式為: **ptr int x = 8; int *ptr1;
int **ptr2; /* ptr2就是所謂的雙重指標表示方式*/ ptr1 = &x; ptr2 = &ptr1; x 位址:100 位址:300 位址:200 (1) (2) ptr1 ptr2 位址200 位址300 8

13 範例 Ch10_3 (1/2) Ch10_3 雙重指標應用 1 #include<stdio.h> 2 void main( )
3 { int i = 5; int *p1; int **p2; p1 = &i; /*指標p1指向i的位址*/ p2 = &p1; /*雙指標p2指向指標p1的位址 */ printf(“i = %d &i = %d\n", i, &i); printf("*p1 = %d p1 = %d\n", *p1, p1); printf("**p2 = %d *p2 = %d\n", **p2, *p2); printf("p2 = %p &p1 = %p\n", p2, &p1); 13 }

14 Ch10_3 輸出結果 (2/2) 程式執行結果 i = 5 &i = 1245052 *p1 = 5 p1 = 1245052
p2 = 0012FF78 &p1 = 0012FF78

15 10-5 指標運算 指標用途很廣泛,它可以使用運算子『*』來做運算,假設ptr為一指標變數,如下所示:
另外,指標運算也可以使用下面的兩種方式來表示: *(ptr + i) /*表示ptr指向的位址再往後位移i個元素的值*/ *ptr /*表示先取得ptr所指向位址的內容值, 然後再將ptr指標指向下一 個元素 */ *++ptr /*表示先將指標指向下一個元素,然後 再取得ptr所指向位址的內容值 */

16 範例 Ch10_11 (1/2) 1 #include<stdio.h> 2 void main( ) 3 {
3 { char str[ ]="Taiwan University"; printf("The string's length is %d\n", strlen(str)); 6 } 7 int strlen(char *str) 8 { char *ptr; ptr = str; /* 將str的起始字元的位址給指標ptr來指 */ while(*++ptr); /* *++ptr會先讓指標ptr指向下一個字元, 再取該字元的內容值 */ return (ptr-str); /* 傳回ptr和str的差值,即為字串的長度 */ 13 }

17 Ch10_11 輸出結果 (2/2) 程式執行結果 The string’s length is 17


Download ppt "第十章 指標."

Similar presentations


Ads by Google