第十章 指標
10-1 指標的基本概念 何謂指標(pointer) 『&』與『*』是指標中最常見的兩種運算符號 指標在C語言中代表一種變數 用來存取記憶體位址,可能是字元,可能是整數型態,也可能為指標本身變數的位址。 藉由指標,程式可間接取得該指標所指位址的變數值。 『&』與『*』是指標中最常見的兩種運算符號 『&』:取得位址運算符號 用來取得該變數在記憶體中的位址。 『*』 :間接定址運算符號 用來取得該指標所指向變數(位址)的內容值。
『&』運算符號的使用方法 int x = 8, *ptr; /* x是一個整數變數,而*ptr 是指向整數變數的內容值*/ 位址 內容值 1268 8 x (1) 整數變數x = 8 ptr (2)‘&’用來取得x在記憶體中的位址
『*』運算符號的使用方法 int x = 8; ptr = &x; y = *ptr; /* 符號*用來取得該指標所指向 變數(位址)的內容值 = 8 */ 位址:1268 8 (1) (2) 1268 y *ptr x
範例 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 }
Ch10_1 輸出結果 (2/2) 程式執行結果 圖解說明 ptr = FFF4, *ptr = 15 &x = FFF4, x =15
10-1-2 指標與位址 指標與位址間基本之運用 以傳值呼叫(Call by value)為例,來說明指標如何來傳遞資料 傳值呼叫特色在於主程式呼叫副程式時,主程式之實際參數串列的值,傳給對應的副程式形式參數串列。 副程式執行時,作業系統額外分配記憶體位置給副程式的參數串列。副程式執行完畢,主程式的參數值不變。
範例 Ch10_2(1/4) Ch10_2 傳址法的應用 1 #include<stdio.h> 2 int func(int *, int *); 3 void main( ) 4 { 5 int x = 5, y = 10, z; 6 z = func(&x, &y); /* 呼叫函數func( )傳入x與y的 位址值,將傳回值給z */ 7 printf("x = %d &x = %d\n", x, &x); 8 printf("y = %d &y = %d\n", y, &y); 9 printf("z = x + y = %d &z = %d\n", z, &z); 10 }
範例 Ch10_2 (2/4) 11 int func(int *m, int *n) /*將x的位址給m指標來指向, 而y的位址給n指標來指向 */ 12 { 13 int r; 14 r = *m + *n; 15 printf("*m = %d n = %d\n", *m, m); 16 printf("*n = %d n = %d\n", *n, n); 17 printf(“r = x + y = %d &r = %d\n", r, &r); 18 return(r); 19 }
Ch10_2 輸出結果 (3/4) 程式執行結果 *m = 5 m = 1245052 *n = 10 n = 1245048 r = x + y = 15 &r = 1244948 x = 5 &x = 1245052 y = 10 &y = 1245048 z = x + y = 15 &z = 1245044
Ch10_2 輸出結果 (4/4) 圖解說明 副程式 主程式 5 10 15 x + y x y z *m *n r 位址:1244948 位址:1245044 位址:1245048 位址:1245052 副程式 主程式 5 10 15 x + y x y z *m *n r
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
範例 Ch10_3 (1/2) Ch10_3 雙重指標應用 1 #include<stdio.h> 2 void main( ) 3 { 4 int i = 5; 5 int *p1; 6 int **p2; 7 p1 = &i; /*指標p1指向i的位址*/ 8 p2 = &p1; /*雙指標p2指向指標p1的位址 */ 9 printf(“i = %d &i = %d\n", i, &i); 10 printf("*p1 = %d p1 = %d\n", *p1, p1); 11 printf("**p2 = %d *p2 = %d\n", **p2, *p2); 12 printf("p2 = %p &p1 = %p\n", p2, &p1); 13 }
Ch10_3 輸出結果 (2/2) 程式執行結果 i = 5 &i = 1245052 *p1 = 5 p1 = 1245052 p2 = 0012FF78 &p1 = 0012FF78
10-5 指標運算 指標用途很廣泛,它可以使用運算子『*』來做運算,假設ptr為一指標變數,如下所示: 另外,指標運算也可以使用下面的兩種方式來表示: *(ptr + i) /*表示ptr指向的位址再往後位移i個元素的值*/ *ptr++ /*表示先取得ptr所指向位址的內容值, 然後再將ptr指標指向下一 個元素 */ *++ptr /*表示先將指標指向下一個元素,然後 再取得ptr所指向位址的內容值 */
範例 Ch10_11 (1/2) 1 #include<stdio.h> 2 void main( ) 3 { 3 { 4 char str[ ]="Taiwan University"; 5 printf("The string's length is %d\n", strlen(str)); 6 } 7 int strlen(char *str) 8 { 9 char *ptr; 10 ptr = str; /* 將str的起始字元的位址給指標ptr來指 */ while(*++ptr); /* *++ptr會先讓指標ptr指向下一個字元, 再取該字元的內容值 */ 12 return (ptr-str); /* 傳回ptr和str的差值,即為字串的長度 */ 13 }
Ch10_11 輸出結果 (2/2) 程式執行結果 The string’s length is 17