150 likes | 155 Views
Pointers. הרצאה קריטית. השאלות הפתוחות. מה זה ה- & שמופיע ב scanf מדוע כשמעבירים מחרוזת ל scanf אין צורך ב & האם ניתן להכריז על מערך שגדלו אינו ידוע בתחילת התכנית? כיצד ניתן לשנות את ערכי הפרמטרים בפונקציה? למה יש הבדל בין משתנים פשוטים למערכים?
E N D
Pointers הרצאה קריטית
השאלות הפתוחות • מה זה ה- & שמופיע ב scanf • מדוע כשמעבירים מחרוזת ל scanf אין צורך ב & • האם ניתן להכריז על מערך שגדלו אינו ידוע בתחילת התכנית? • כיצד ניתן לשנות את ערכי הפרמטרים בפונקציה? • למה יש הבדל בין משתנים פשוטים למערכים? • האם ניתן להחזיר יותר מפרמטר אחד בפונקציה?
Addresses Memory a: 2012 0 ch: 1052 arr: 3020 1052 25 22 2 void main() { int a; char ch; int arr[4]={2}; a=17; ch=25; a=ch; ch=arr[0]; arr[2]=a*ch; arr[3]=arr[2]; } 2012 17 25 3055 3020 2 3024 0 3028 0 50 3032 0 50
הגדרות פוינטרים • &a : הכתובת של a (כתוב בטבלת הכתובות) • ל * יש שני תפקידים: • בזמן הגדרת משתנה: int *p משמעו שהטיפוס של p הוא מצביע ל int (ויכיל כתובת) • בזמן ביצוע פעולה: *p משמעו: תוכן התא שכתובתו רשומה ב p
Addresses Memory a: 5556 0 b: 524 pa: 3028 524 5 359 15 20 void main() { int a,b,*pa,*pb; a = 15; b = 20; pa = &a; b = *pa; *pa = 0; pb = &b; pa=pb; *pa=5; } pb: 6080 3028 2 5556 524 5556 15 0 7663 6080 524 8797
Addresses Memory a: 5572 0 p: 528 q: 3028 528 5572 17 void main() { int a[6],*p,*q,i; p = &a[0]; *p = 50; q = &a[1]; *(p+2) = 7; *q=9; *(q+3)=*(p+1); i=q-p; } i: 6080 3028 5576 2 5572 35 50 59 9 13 7 13 3 9 7663 6080 10 1
לא עבר swap פונקצית #include <stdio.h> void swap(int x, int y){ int temp=x; x=y; y=temp; } void main(){ int a=5,b=7; printf("a: %d, b: %d\n",a,b); swap(a,b); printf("a: %d, b: %d\n",a,b); }
עבר swap פונקצית #include <stdio.h> void swap(int *x, int *y){ int temp=*x; *x=*y; *y=temp; } void main(){ int a=5,b=7; printf("a: %d, b: %d\n",a,b); swap(&a,&b); printf("a: %d, b: %d\n",a,b); }
החזרת יותר מפרמטר אחד #include <stdio.h> void minmax(int x, int y, int * min, int * max){ if (x<y){ *min=x; *max=y; } else{ *min=y; *max=x; } } void main(){ int a,b,min,max; printf("Enter a and b\n"); scanf("%d%d",&a,&b); minmax(a,b,&min,&max); printf("min: %d, max: %d\n",min,max); }
swap שימוש ב void minmax(int x, int y, int * min, int * max){ *min=x; *max=y; if (x>y) swap (min, max); }
קצת רקורסיה #include <stdio.h> int *binSearch (int value, int *from, int *to){ int *middle = from+(to-from)/2; if (*middle==value) return middle; elseif (from == to) return NULL; elseif (*middle < value) return binSearch (value, middle+1, to); else return binSearch (value, from, middle-1); }
שימוש void main(){ int a[10]={5,7,15,19,28,35,56,88,155,156}; int * p, index; p=binSearch(19,&a[0],&a[9]); if (p==NULL) index=-1; else index=p-a; printf ("%d\n",index); }
קלט/פלט void main(){ int a, b, *pa; char st[10]; pa=&a; scanf("%d%d%s", pa, &b, st); printf("%d %d %c\n",*pa, b, st[3]); printf("%d %d %c\n",a, *(&b), *(st+3)); }
הקצאת זיכרון דינאמית #include <stdio.h> #include <stdlib.h> void main(){ int *arr, n, i; printf ("Enter size of array\n"); scanf("%d",&n); arr=malloc(n*sizeof(int)); if (arr==NULL){ printf ("Failed to allocate memory\n"); return; } for (i=0; i<n; i++){ scanf("%d",arr+i); } free(arr); }