Introduction to the C Programming Language Pointer CSIM

  • Slides: 24
Download presentation
Introduction to the C Programming Language 指標 (Pointer) CSIM, PU C Language 1

Introduction to the C Programming Language 指標 (Pointer) CSIM, PU C Language 1

指標變數的宣告 q 範例一:指標變數的宣告 #include<stdio. h> #include<stdlib. h> int main(void) { int *ptr, num=20; /*宣告變數num與指標變數ptr

指標變數的宣告 q 範例一:指標變數的宣告 #include<stdio. h> #include<stdlib. h> int main(void) { int *ptr, num=20; /*宣告變數num與指標變數ptr */ ptr=&num; /*將num位址設給指標ptr存放 */ printf(“num=%d, &num=%xn”, num, &num); printf(“*ptr=%d, ptr=%x, &ptr=%xn”, *ptr, &ptr); system(“pause”); return 0; } Output: num=20, &num=ffd 6 *ptr=20, ptr=ffd 6, &ptr=ffd 4 CSIM, PU C Language 7

指標的宣告與定義 q 範例二: 比較輸出指標的位址與值 #include<stdio. h> void main() { int *ptr; int a, b;

指標的宣告與定義 q 範例二: 比較輸出指標的位址與值 #include<stdio. h> void main() { int *ptr; int a, b; a=20; ptr=&a; /* 將 ptr 指向變數 a 的位址 */ b=*ptr; /* 將 b設定為 ptr 所指位址的內容值 */ printf(“a=%d, *ptr=%d , b=%dn", a, *ptr , b ); printf(“ptr=%x , &a=%xn", ptr , &a ); system(“pause”); } Output: � a=20, *ptr=20, b=20 ptr=ffd 6 , &a=ffd 6 CSIM, PU C Language 8

指向指標的指標—雙重指標 q 範例三: 雙重指標 , 輸出其內容及位址 #include<stdio. h> void main() { int *ptr 1,

指向指標的指標—雙重指標 q 範例三: 雙重指標 , 輸出其內容及位址 #include<stdio. h> void main() { int *ptr 1, **ptr 2; int a=10; **ptr 2 *ptr 1 a ffd 4 ffd 6 10 ffd 2 ffd 4 ffd 6 ptr 1=&a; /* 指標 ptr 1指向 a 的位址 */ ptr 2=&ptr 1; /* 雙重指標 ptr 2 指向 ptr 1的位址 */ Output: printf("a=%d , &a=%xn", a , &a ); printf("*ptr 1=%d , ptr 1=%xn", *ptr 1 , ptr 1 ); printf("**ptr 2=%d , *ptr 2=%xn", **ptr 2 , *ptr 2); printf("ptr 2=%x, &ptr 1=%xn", ptr 2 , &ptr 1); a=10, &a=ffd 6 *ptr 1=10, ptr 1=ffd 6 **ptr 2=10 , *ptr 2=ffd 6 ptr 2=ffd 4 , &ptr 1=ffd 4 } � CSIM, PU C Language 10

指標與陣列 q 範例四: 用指標取出陣列元素的值與位址 #include<stdio. h> main() { int i; char *pa; char a[4]={'A',

指標與陣列 q 範例四: 用指標取出陣列元素的值與位址 #include<stdio. h> main() { int i; char *pa; char a[4]={'A', 'B', 'C', 'D'}; pa=a; Pointer指向陣列的開頭 for(i=0; i<4; i++) printf("a[%d] value: %c ; *(pa+%d) value: %cn", i, a[i], i, *(pa+i)); for(i=0; i<4; i++) printf("&a[%d] address: %x ; *(pa+%d) address: %xn", i, &a[i], i, pa+i); } CSIM, PU C Language 12

int a[5]={3, 8, 6, 2, 5}; int *ptr; ptr=&a[0]; ptr *(ptr+0) a[0] 3 fdd

int a[5]={3, 8, 6, 2, 5}; int *ptr; ptr=&a[0]; ptr *(ptr+0) a[0] 3 fdd 2 &a[0] ptr+0 *(ptr+1) a[1] 8 fdd 4 &a[1] ptr+1 *(ptr+2) a[2] 6 fdd 6 &a[2] ptr+2 *(ptr+3) a[3] 2 fdd 8 &a[3] ptr+3 a[4] 5 fdd 10 &a[4] ptr+4 *(ptr+4) CSIM, PU a C Language 14

q 若要存取第i列第j行的值: n *(*(a+i)+j)=5; n a[i][j]=5; n *(ptr + 3 *i + j)=5; /*a[i][j]=5;

q 若要存取第i列第j行的值: n *(*(a+i)+j)=5; n a[i][j]=5; n *(ptr + 3 *i + j)=5; /*a[i][j]=5; */ j i CSIM, PU a(0, 0) 0 a(0, 1) 1 a(0, 2) 2 a(1, 0) 3 a(1, 1) 4 a(1, 2) 5 a(2, 0) 6 a(2, 1) 7 a(2, 2) 8 a(3, 0) 9 a(3, 1) 10 a(3, 2) 11 C Language 16

q 續上頁 *(num+0)可取出此值 num+0 num+1 num+2 num[0] 1000 num[1] 1008 num[2] 1016 12 23

q 續上頁 *(num+0)可取出此值 num+0 num+1 num+2 num[0] 1000 num[1] 1008 num[2] 1016 12 23 42 18 1000 1002 1004 1006 43 22 16 14 1008 1010 1012 1014 31 13 19 28 1016 1018 1020 1022 *(num+2)可取出此值 CSIM, PU C Language 18

指標與陣列 q 範例五: 指標陣列 #include <stdio. h> int main(void) { int i; char *name[3]={"David",

指標與陣列 q 範例五: 指標陣列 #include <stdio. h> int main(void) { int i; char *name[3]={"David", "Jane Wang", "Tom Lee"}; for(i=0; i<3; i++) /* 印出指標陣列的內容 */ printf("name[%d]=%sn", i, name[i]); return 0; } CSIM, PU C Language 21

指標與函數 q 範例六: 設計一個傳值函式noswap(), 及一個傳址函式swap() #include<stdio. h> void noswap( int, int); void swap( int

指標與函數 q 範例六: 設計一個傳值函式noswap(), 及一個傳址函式swap() #include<stdio. h> void noswap( int, int); void swap( int * , int *); main() { int x=2, y=3; printf("The original values are: x=%d , y=%d n" , x , y ); noswap(x, y); printf(“call by value: x=%d , y=%d n", x , y ); 傳入pointer值(變數位址即為pointer的值) swap(&x, &y); printf(“call by address: x=%d , y=%d n", x , y ); } CSIM, PU C Language 23

指標與函數 q 接上頁(範例六) void noswap ( int a , int b ) { int

指標與函數 q 接上頁(範例六) void noswap ( int a , int b ) { int t; t=a; a=b; b=t; } /* call by value */ void swap ( int *a , int *b) { int t; t=*a; *a=*b; *b=t; } /* call by address*/ CSIM, PU C Language 24