Slide 1

‫הרצאה קריטית‬
‫‪Pointers‬‬
‫השאלות הפתוחות‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫מה זה ה‪ & -‬שמופיע ב ‪scanf‬‬
‫מדוע כשמעבירים מחרוזת ל ‪ scanf‬אין צורך ב &‬
‫האם ניתן להכריז על מערך שגדלו אינו ידוע בתחילת‬
‫התכנית?‬
‫כיצד ניתן לשנות את ערכי הפרמטרים בפונקציה?‬
‫למה יש הבדל בין משתנים פשוטים למערכים?‬
‫האם ניתן להחזיר יותר מפרמטר אחד בפונקציה?‬
What is the matrix?
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];
}
Addresses
a: 2012
ch: 1052
arr: 3020
Memory
0
1052
22
25
2
2012
3055
17
25
3020
3024
3028
2
0
50
0
50
0
3032
‫הגדרות פוינטרים‬
‫• ‪ : &a‬הכתובת של ‪( a‬כתוב בטבלת הכתובות)‬
‫• ל * יש שני תפקידים‪:‬‬
‫– בזמן הגדרת משתנה‪ int *p :‬משמעו שהטיפוס של ‪ p‬הוא‬
‫מצביע ל ‪( int‬ויכיל כתובת)‬
‫– בזמן ביצוע פעולה‪ *p :‬משמעו‪ :‬תוכן התא שכתובתו רשומה ב ‪p‬‬
void main() {
int a,b,*pa,*pb;
a = 15; b = 20;
pa = &a;
b = *pa;
*pa = 0;
pb = &b;
pa=pb;
*pa=5;
}
Addresses
a: 5556
b: 524
pa: 3028
pb: 6080
Memory
0
524
359
15
20
5
3028
5556
524
2
5556
7663
15
0
6080
8797
524
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;
}
Addresses
a: 5572
p: 528
q: 3028
i: 6080
Memory
0
528
5572
17
3028
5576
2
5572
50
35
59
9
13
7
13
9
3
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;
else if (from == to)
return NULL;
else if (*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);
}