1 / 17

מבוא למדעי המחשב

מבוא למדעי המחשב. תרגול 11 – מצביעים שעת קבלה: יום שני 11:00-12:00 דוא"ל: keren@eli-wigs.com. הקדמה. זיכרון המחשב בנוי מרצף של תאי זיכרון. גודל כל תא הוא בית ( byte ) לכל תא יש כתובת – מספר המציין את מיקומו בזיכרון.

Download Presentation

מבוא למדעי המחשב

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. מבוא למדעי המחשב תרגול 11 – מצביעים שעת קבלה: יום שני 11:00-12:00 דוא"ל: keren@eli-wigs.com

  2. הקדמה • זיכרון המחשב בנוי מרצף של תאי זיכרון. גודל כל תא הוא בית (byte) לכל תא יש כתובת – מספר המציין את מיקומו בזיכרון. • כשאנו מצהירים על משתנה, המחשב מקצה לו תאים רצופים בזיכרון. מספר הבתים המוקצים הוא בהתאם לטיפוס המשתנה. למשל: משתנה מטיפוס char תופס בית אחד. משתנה מטיפוס double תופס בד"כ 4 בתים. • כתובת הזיכרון הניתנת למשתנה היא הכתובת של הבית הראשון מתוך הבתים שהמשתנה תופס.

  3. דוגמה: double num; char c; כתובת הזיכרון של המשתנה c: 200 כתובת הזיכרון של המשתנה num:203 200 201 202 203 204 205 206 207 num c

  4. על מנת לדעת היכן מאוחסן המשתנה כולו בזיכרון, מספיק לדעת את כתובתו (מיקום הבית הראשון שמוקצה לו) ואת טיפוסו (הקובע את מספר הבתים שהמשתנה תופס)

  5. האופרטור & • משמעותו: כתובת הזיכרון של המשתנה. • אם num הוא משתנה אז &num הוא כתובת הזיכרון של num. • בדוגמה הנ"ל: &num=203 &c=200

  6. מהו מצביע: • מצביע הוא משתנה שמכיל כתובת זיכרון. בדרך-כלל, זוהי כתובת של משתנה אחר. • הצהרה על מצביע: type *pointer_name הטיפוס הוא טיפוס המשתנה שיושב בכתובת זו. כלומר, טיפוס המשתנה המוצבע. • למשל, אם הגדרנו משתנה num מטיפוס double ונרצה להצהיר על מצביע שיכיל את הכתובת של num: double *p; • שימו בפקודה האחרונה הצהרנו על מצביע אך לא נתנו לו עדיין כתובת, ולכן הוא עדיין לא מכיל את הכתובת של num.

  7. דוגמה נוספת: char *ptr; הצהרה על מצביע שיכיל כתובת של משתנה מטיפוס char. • לאחר ההצהרה ניתן לתת ערך למצביע – כתובת של משתנה. • דוגמה: void main() { int x=5; int *px; px=&x; }

  8. int x=5; הצהרה על משתנה מטיפוס שלם והצבת הערך 5 בתוך x. int *px; הצהרה על מצביע שיצביע על משתנה מטיפוס int px=&x; הצבת ערך במשתנה px. הערך הוא כתובת הזיכרון של המשתנה x הערה: מספר הבתים שתופס משתנה שהוא מצביע תלוי בגודל הזכרון. 1007 1008 5 x 1009 1010 1007 2230 px

  9. האופרטור * • *pointer = המשתנה עליו אנו מצביעים. • דוגמה: Double y=4.5; Double *p; P=&y; Printf (“ the value of y is %lf”,*p); • בדוגמה זו, p הוא מצביע שמכיל את הכתובת של משתנה y ולכן *p=y כלומר: *p=4.5

  10. תרגיל מה יהיה פלט התכנית הבאה? #include <stdio.h> Void main() { int x,y,*px,*py; printf (“\n enter 2 integers”); scanf (“%d%d”,&x,&y); px=&x; py=&y; *px+=*py; printf (“\n x=%d”,x); }

  11. תרגיל מה יהיה פלט התכנית הבאה? #include <stdio.h> void main() { char c,*p1,*p2; c=‘a’; p1=&c; p2=p1; *p2=‘z’; printf (“\n *p1=%c”,*p1); printf (“\n c=%c”,c); }

  12. גישה לא חוקית לזיכרון לדוגמה: int *p; p=100; *p=5; הגדרנו מצביע בשם p ונתנו לו ערך מספרי. הערכים שמצביעים יכולים לקבל הם כתובות זיכרון, ברגע שניתן ערך מספרי למצביע, אנו מנסים לגשת לתא בזיכרון שממוקם בכתובת זו. בדוגמה קבענו שהמצביע p יצביע לתא שכתובתו 100, ותא זה יכיל את הערך 5. הבעיה: ישנם תאים בזיכרון שלתכנית את הרשאה לשנותם, השגיאה תתגלה בזמן הרצת התכנית. לכן,על מנת לאתחל מצביע, לא ניתן לו ערך מספרי. ניתן לאתחל מצביע לערך NULL שפירושו: המצביע אינו מצביע על אף ערך חוקי.

  13. העברת מצביעים כפרמטרים לפונקציה תזכוורת: כשדברנו על פונקציות, הסתכלנו על התכנית הבאה: #include <stdio.h> void func(int x,int y) } x=10; y=30; printf ("\n x=%d y=%d",x,y); { void main() } int a=3,b=7; func(a,b); printf ("\n a=%d b=%d",a,b); { כזכור, הפונקציה לא שינתה את הערכים של המשתנים a ו b

  14. כאשר מעבירים משתנים לפונקציה, הפונקציה מקבלת את ערכם של המשתנים. • בדוגמה האחרונה אנו מעבירים את המשתנים a ו b לפונקציה. הפונקציה מקבלת רק את ערכיהם (3 ו 7) ולכן x מקבל את הערך 3 ו y מקבל את הערך 7, ואין יותר קשר בין המשתנים בפונקציה הקוראת a ו b למשתנים x ו y. (כאמור מנגנון זה נקרא call by value) • על מנת לשנות את ערכי המשתנים של הפונקציה הקוראת נעביר לפונקציה מצביעים, וכך בעצם נעביר את כתובות המשתנים ולא את ערכם מנגנון זה נקרא call by reference.

  15. תרגיל שנו את התכנית האחרונה, כך שהפונקציה תשנה את ערכי ההמשתנים a ו b של הפונקציה הקוראת #include <stdio.h> void func(int *x,int *y) { *x=10; *y=30; printf ("\n x=%d y=%d",*x,*y); } void main() { int a=3,b=7; func(&a,&b); printf ("\n a=%d b=%d",a,b); } העברת כתובות המשתנים a ו b

  16. מערכים ומצביעים • שם המערך זהו מצביע לאיבר הראשון במערך. • אם נגדיר מערך באופן הבא int ar[4]; אז ar ההוא מצביע שמכיל את כתובת תחילת המערך. אם משתנה מטיפוס int תופס שני בתים בזיכרון, נקבל למשל: בדוגמה זו ar=521 525 526 527 528 520 521 522 523 524 529 3 1 2 0

  17. תרגיל מה יהיה פלט התכנית הבאה: #include <stdio.h> void main() } int ar[]={1,2,3,4,5},*p,i; p=ar; for (i=0;i<5;i++) } *(p+i)+=ar[i]; printf (" %d",*(ar+i)); { {

More Related