Download presentation
Presentation is loading. Please wait.
1
P. 1 Pointer( 指標 ) o 指標的宣告及給值 宣告 : 型態 * 指標變數名稱 給值 : 指標變數 = 一般變數位址 宣告時給值 : 型態 * 指標變數 = 一般變數位址 #include void main() { int a=5; int *p; int *q=&a; p=&a; printf(“a=%d \t %d \t %d \n”,a,*p,*q); /*5,5,5 */ } (1) 指標變數 p 內裝的是 a 的位址 (2) *p 表示 a 的內容 ( 值 ) 5 a 00000010 p P : 00000010 *p: 5 指標 (Pointer)
2
P. 2 Pointer( 指標 ) 指標與數值陣列 : #include void main() { int a[5]={1,3,5,7,9}; int *p,*q; int i; p=a; q=&a[0]; for (i=0;i<=4;i++) printf(“a=%d \t %d \t %d \t %d \n”,a[i],*(p+i),*(q+i),*(a+i)); // *p+1 與 *(p+1) 不同值 } a 表示 a[0] 的位址 a+1 表示 a[1] 的位址 p, a, &a[0] 均表示 a[0] 的位址 p+1, a+1, &a[1] 均表 a[1] 之值 *p, a[0], *a 均表 a[0] 之值 *(p+1), a[1], *(a+1) 均表 a[1] 之值
3
P. 3 Pointer( 指標 ) 指標與數值陣列 : #include void main() { int a[5]={1,3,5,7,9}; int *p,*q; int i; p=a; q=&a[0]; for (i=0;i<=4;i++) printf(“a=%d \t %d \t %d \t %d \n”,a[i],*(p+i),*(q+i),*(a+i)); // *p+1 與 *(p+1) 不同值 }
4
P. 4 Pointer( 指標 ) 指標與數值陣列 :( 利用指標輸入每日溫度並求平均值後印出 ) #include void main() { /* example for pointer and one dimentional integer array */ float temp[40]; int num,day=0; float sum=0.0; clrscr(); /* input temp array untial negative value */ do { printf("Enter temperature for day %d: ",day); scanf("%f",temp+day); } while ( *(temp+day++)>0) ; num=day-1; clrscr(); /* make sum for the array elements */ for (day=0;day<num;day++) sum+=*(temp+day); printf("average is: %.1f\n",sum/num); }
5
P. 5 Pointer( 指標 ) o 變數前加上 * 表示指向之意, 如 int *ip 表示 ip 之內容為一個整數變數之位址值。 o void 指標型別 : 所定義之 pointer 能用來指各種型別。 o pointer 本身也是變數, 也有自己的位址, 也可以讓一個 pointer 指向另一 pointer 。 void *p, *q; int i=36; double d=1.22; p=&i; q=&d; void *p, *q; int i=36; double d=1.22; p=&i; q=&d; int I=5, *p=&I; int *q=&p int I=5, *p=&I; int *q=&p i 5 0010 p 0020 q 0030 o 陣列與 pointer 的差異 : * 當我們定義陣列時,C 會配置一塊連續的記憶體位置給此陣列, 而陣列名稱即代表 這塊記憶體的起始位址, 我們不能更改它的值。 * 當我們定義一個 pointer 時,C 會配置一塊足以容納位址值的記憶體給它, 在使用 指標前一定要先存入適當的位址值, 來使其指向正確的記憶體位置, 所以我們可 以任意更改 pointer 的值。
6
P. 6 Pointer( 指標 ) #include void swap(int *first, int *second); void main() { int a=50,b=100; clrscr(); printf("a=%d b=%d\n",a,b); swap(&a,&b); printf("after swap \n"); printf("a=%d b=%d\n",a,b); } void swap(int *first, int *second) { int temp; temp=*first; *first=*second; *second=temp; } #include int maximul(int *ptr,int size); void main() { /* pointer and two dimentional integer array */ int a[3]={10,20,15}; int max; clrscr(); max=maximul(a,3); printf("the max value is:%d\n",max); } int maximul(int *ptr,int size) { int largest,i; for (largest=*ptr,i=0;i<size;i++) if (largest < *(ptr+i)) largest=*(ptr+i); return(largest); } 數值指標當副程式參數 : 呼叫時傳位址給指標變數
7
P. 7 Pointer( 指標 ) 數值指標當副程式參數 : 排序及二分搜尋法 #include void Sort(int *array,int array_size); void swap(int *first, int *second); int BSearch(int *array,int array_size,int goal); void pause(); void main() { int i,search; int a[]={2,6,4,8,10,12,89,68,45,37}; int *ptr=a; int size=sizeof(a)/sizeof(int); int position; char c; clrscr(); printf("Original data:\n"); for (i=0;i<size;i++) printf("%4d",*(ptr+i)); printf("\n"); Sort(a,size); printf("After sorting:\n"); for (i=0;i<size;i++) printf("%4d",*(ptr+i)); printf("\n"); pause(); while (1) { printf("Please input a number(negative to exit):"); scanf("%d",&search); if (search<0) break; position=BSearch(a,size,search); if (position==-1) printf("this data not found\n"); else printf("the %dth position is what you want\n",position); pause(); } clrscr(); gotoxy(20,20); printf("thank you for your use!"); }
8
P. 8 Pointer( 指標 ) void Sort(int *array, int array_size) { int i,j; for (i=0; i<array_size-1;i++) for (j=i;j<array_size;j++) if (*(array+i) > *(array+j)) swap(array+i,array+j); } void swap(int *first, int *second) { int temp; temp=*first; *first=*second; *second=temp; } void pause() { char c; gotoxy(20,20); printf("press any key to continue..."); c=getche(); clrscr(); } int BSearch(int *array, int array_size, int goal) { int *first=array,*last=array+array_size-1,*mid; while (first<=last) { mid=(int)((last-first)/2)+first; if (*mid==goal) return(mid-array); if (*mid>goal) last=mid-1; else first=mid+1; } return(-1); }
9
P. 9 Pointer( 指標 ) // page:7-7 傳值呼叫 #include void cubeByValue(int); void main() { int number=5; printf(“The original value of number is %d \n”, number); number=cubeByValue(number); printf(“The new value of number is %d \n”, number); } int cubeByValue(int n) { return n*n*n } 課本範例 : // page:7-8 傳址呼叫 #include void cubeByReference(int *); void main() { int number=5; printf(“The original value of number is %d \n”, number); number=cubeByReference(&number); printf(“The new value of number is %d \n”, number); } void cubeByReference(int *nptr) { *nptr =*nptr * *nptr * *nptr }
10
P. 10 Pointer( 指標 ) 指標與二維數值陣列的關係 #include void main() { /* pointer and two dimentional integer array */ int a[2][3]={{1,2,3},{4,5,6}}; int *ptr1,*ptr2; int i,j; clrscr(); ptr1=a[0]; ptr2=&a[0][0]; for (i=0;i<3;i++) printf("value of array a[0][%d] is %d,%d, or %d\n",i,*(ptr1+i),*(ptr2+i),a[0][i]); /* 1 1 1 */ /* 2 2 2 */ /* 3 3 3 */ /***********************/ for (i=0;i<2;i++) for (j=0;j<3;j++) printf("array a[%d][%d]=%d or %d \n",i,j,*(ptr1+i*3+j),*(*(a+i)+j)); /* array[0][0]=1 or 1 */ /* array[0][1]=2 or 2 */ }
11
P. 11 Pointer( 指標 ) 指標與字串變數的關係 #include void main() { char a[6]="abcde"; char *p; p=a; printf("Original p is:%s \n",p); printf("Please input a string:"); scanf("%s",p); printf("The new value of p is:%s \n",p); } #include void main() { int i; char name[3][6]={"Johny","Mary","Lucy"}; char *p,*q=name[0]; clrscr(); p=name[0]; printf("0th person's name is:%s \n",p); printf("1th person's name is:%s \n",p+6); printf("please input 2th person's name:"); scanf("%s",p+12); for (i=0;i<3;i++) printf("%dth person's name is:%s \n",i,p+i*6); }
12
P. 12 Pointer( 指標 ) 指標與字串變數的關係 #include void main() { char str1[]=”defined as an array"; char *str2=“defined as a pointer”; char *str3; str3=“string3”; printf(”str1:%s\n",str1); printf(”str2:%s\n",str2); printf(“str3:%s\n”,str3); str2++; printf(”new str2:%s\n",str2); }
13
P. 13 Pointer( 指標 ) 指標與字串變數的關係 # include #define MAXNUM 30 #define MAXLEN 80 void main() { char name[MAXNUM][MAXLEN]; char *ptr=name[0],*temp; int count=0,i,j; clrscr(); while (count < MAXNUM) { printf("Name %d:",count); gets(name[count]); if (strlen(name[count])==0) break; count++; } count--; for (i=0;i<=count-1;i++) for (j=i+1;j<=count;j++) if (strcmp(ptr+i*MAXLEN,ptr+j*MAXLEN)>0) { strcpy(temp,ptr+i*MAXLEN); strcpy(ptr+i*MAXLEN,ptr+j*MAXLEN ); strcpy(ptr+j*MAXLEN,temp); } printf("The sorted list:\n"); for (i=0;i<=count;i++) printf("Name %d :%s \n",i,ptr+i*MAXLEN); }
14
P. 14 Pointer( 指標 ) #include /* char pointer as the parameter */ void add(char *p,char *q); void main() { char a[20]="Mr."; char b[20]=" Johny"; add(a,b); printf("contents of a is:%s\n",a); } void add(char *p,char *q) { p= strcat(p,q); } #include /* char pointer as the parameter */ void output(char *p); void main() { char a[20]="Johny"; output(a); } void output(char *p) { printf("content of a is:%s \n",p); } 字串指標當參數
15
P. 15 Pointer( 指標 ) 指標函數 #include char *getstr(); void main() { clrscr(); printf(“\n%s\n”,getstr()); } char *getstr() {char *p; printf(“please input a string:”); scanf(“%s”,p); return(p); } #include char *add(char *p1, char *p2); void main() { char *q1,*q2; q1=“abcde”; q2=“nopqrs”; q1=add(q1,q2); clrscr(); printf(“\n%s\n”,q1); } char *add(char *p1, char *p2) { return(strcat(p1,p2)); }
16
P. 16 Pointer( 指標 ) 指標函數的應用 ( 計算字串長度 ) #include int strlen(char *ptr); void main() { char string[100]; int len; printf("input a string:"); gets(string); len=strlen(string); printf("the length of input is: %d \n",len); } int strlen(char *ptr) { int i; for(i=0; ptr[i]!='\0';i++); // for(i=0; *(ptr+i)!='\0'; i++); return(i); } 指標函數的應用 ( 字串複製 ) #include int strlen(char *ptr); void main() { char string[100]; int len; printf("input a string:"); gets(string); len=strlen(string); printf("the length of input is: %d \n",len); } int strlen(char *ptr) { int i; for(i=0; ptr[i]!='\0';i++); // for(i=0; *(ptr+i)!='\0'; i++); return(i); } #include char *strcpy(char *str1,char *str2) { int i; for(i=0; str2[i]!='\0'; i++) str1[i]=str2[i]; str1[i]='\0'; return(str1); } void main() { char from[100]; char to[100]; printf("input source string:"); gets(from); strcpy(to,from); printf("the destination string:%s \n",to); }
17
P. 17 Pointer( 指標 ) 指標函數的應用 ( 字串連結 ) #include char *strcat(char *str1,char *str2); void main() { char first[100]; char second[100]; printf("input first string:"); gets(first); printf("input second string:"); gets(second); strcat(first,second); printf("the combination string:%s \n",first); } char *strcat(char *str1, char *str2) { int i,j; for(i=0; str1[i]!='\0'; i++); for(j=0; str2[j]!='\0'; j++) str1[i+j]=str2[j]; str1[i+j]='\0'; return(str1); }
18
P. 18 Pointer( 指標 ) 動態配置記憶體 (malloc) 與指標 指令格式 : 指標變數 =( 強迫轉型 ) malloc( 容量 ) 例 : int *ptr; ptr=(int *) malloc(sizeof(int)); #include void main() { int *ptr; ptr=(int *) malloc(sizeof(int)); if (!ptr) printf("out of memory... \n"); else { *ptr=64; printf("score is:%d \n",*ptr); } 整數資料 0010 ptr #include void main() { int *score; int i,num,sum; float avg; clrscr(); sum=0; printf("input number of students:"); scanf("%d",&num); score=(int *) malloc(num * sizeof(int)); for(i=0;i<num;i++) { printf("input %d's student's score:",i); scanf("%d",&score[i]); sum+=score[i]; } avg=(float) sum/num; printf("average is:%6.2f \n",avg); } 範例 :
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.