8 מצביעים

28
1 שיעור שמיני: מצביעים וכתובותonline.shenkar.ac.il/moodle online.shenkar.ac.il/moodle http:// http:// קורס מבוא למדעי המחשב קורס מבוא למדעי המחשב סמסטר א סמסטר א' ' תשס תשס" ח מחרוזות מחרוזות תזכורת תזכורת מחרוזת מחרוזת היא רצף תווים בעל משמעות היא רצף תווים בעל משמעות) משפט למשל מילה או משפט למשל מילה או.( .( כדי לייצג מחרוזת משתמשים כדי לייצג מחרוזת משתמשים במערך של תווים במערך של תווים, , כשאחרי תווי המחרוזת כשאחרי תווי המחרוזת שמים את תו שמים את תו- הסיום הסיום‘\0’ . אפשר לאתחל מחרוזת בהגדרה אפשר לאתחל מחרוזת בהגדרה: : char message[ ]= char message[ ]=Hello world! Hello world!; אפשר לבצע קלט אפשר לבצע קלט/ פלט של מחרוזות תו פלט של מחרוזות תו- תו בלולאה תו בלולאה, , או בבת או בבת- אחת אחת: cin.width(40), cin.width(40), cin cin >> >> str str , , gets(str gets(str ), ), cout cout << << str str בספריה בספריהstring.h string.h יש פעולות שימושיות על מחרוזות יש פעולות שימושיות על מחרוזות) כמו כל מערך כמו כל מערך, , אי אי- אפשר אפשר לכתוב לכתובa=b a=b כדי להעתיק מחרוזות או כדי להעתיק מחרוזות אוa==b a==b כדי להשוות כדי להשוות.( .( בספריה בספריהctype.h ctype.h יש פעולות שימושיות על תווים יש פעולות שימושיות על תווים) ) islower,toupper islower,toupper ,... ,... .( .(

Upload: yosef-joron

Post on 23-Mar-2016

214 views

Category:

Documents


1 download

DESCRIPTION

C LAN, C LANG

TRANSCRIPT

Page 1: 8 מצביעים

1

: שיע ור שמי נ י

מצביע ים וכ תובות

online.shenkar.ac.il/moodleonline.shenkar.ac.il/moodlehttp://http://

קורס מבוא למדעי המחשבקורס מבוא למדעי המחשב

חח""תש סתש ס' ' סמסטר אסמסטר א

תזכורת תזכורת ––מחרוזות מחרוזות ).).למש ל מילה א ו משפטלמש ל מילה א ו משפט(( היא רצף תוו ים בעל משמעות היא רצף תוו ים בעל משמעות מחרוזתמחרוזת••

כשא חרי תוו י המחרוזת כשא חרי תוו י המחרוזת , , במערך של תוו יםבמערך של תוו יםכדי לי יצג מחרוזת משתמש ים כדי לי יצג מחרוזת משתמש ים •• ..’’00\\‘‘הסי ום הסי ום --שמים את תו שמים את תו

;;””!char message[ ]=char message[ ]=““Hello world!Hello world: : אפשר לאתחל מחרוזת בה גדרהאפשר לאתחל מחרוזת בה גדרה••

::אחתאחת--או בבתאו בבת, , תו בל ולא התו בל ולא ה--פלט של מחרוזות תו פלט של מחרוזות תו //אפשר לבצע קלטאפשר לבצע קלט••

cin.width(40), cin.width(40), cincin >> >> strstr, , gets(strgets(str), ), coutcout << << strstr

, , כמו כל מערךכמו כל מערך(( יש פעולו ת שימוש יות על מחרוז ות יש פעולו ת שימוש יות על מחרוז ות string.hstring.hבספריה בספריה ••). ). כדי להש וות כדי להש וותa==ba==b כדי להעתי ק מחרוזות או כדי להעתי ק מחרוזות או a=ba=b לכתוב לכתוב אפשראפשר--אי אי

).)....,...,islower,toupperislower,toupper( ( יש פעולו ת שימוש יות על תו וים יש פעולו ת שימוש יות על תו וים ctype.hctype.hבספריה בספריה ••

Page 2: 8 מצביעים

2

string.hstring.h –– דוגמאות שימ ושיו ת דוגמאות שימ ושיו ת

) :) :''\\00''הסיום הסיום --לפי המקום של תולפי המקום של תו((מציאת אורך המחרוזת מציאת אורך המחרוזת ••

lenlen == strlen(my_stringstrlen(my_string););

):):00אם הן זהות מוחזר אם הן זהות מוחזר ((השוואת מחרוזות השוואת מחרוזות ••

equalequal == strcmp(str1, str2);strcmp(str1, str2);

):):targettarget-- מועתקת ל מועתקת לsourcesource((העתקת מחרוזת למחרוזת אחרת העתקת מחרוזת למחרוזת אחרת ••

strcpy(targetstrcpy(target, source);, source);

):):str1str1 לסוף לסוף str2str2מעתיק את מעתיק את (( מחרוזות מחרוזות שירשורשירשור••

strcat(str1, str2);strcat(str1, str2);

).).באחריותנו לוודא שהעתקה או שרשור לא יחרגו מגבולות המערךבאחריותנו לוודא שהעתקה או שרשור לא יחרגו מגבולות המערך((

? ? מה עו שה התוכנית הבאה מה עו שה התוכנית הבאה : : דוגמאדוגמא#include<#include<iostream.hiostream.h>>

#include<string.h>#include<string.h>

intint main()main()

{{

intint bush_votes = 0 , bush_votes = 0 , kerry_voteskerry_votes=0; =0;

char vote[6];char vote[6];

while(1)while(1)

{{

cin.width(6); cin.width(6); cincin >> vote;>> vote;

if if ((strcmp(votestrcmp(vote, , ““BushBush””)==0))==0) bush_votes++;bush_votes++;

else if else if ((strcmp(votestrcmp(vote, , ““KerryKerry””)==0))==0) kerry_voteskerry_votes++;++;

else if else if ((strcmp(votestrcmp(vote, , ““StopStop””)==0))==0) break;break;

else else coutcout << "Wrong vote!<< "Wrong vote!\\n";n";

}}

coutcout <<<< "Bush received " << "Bush received " << bush_votesbush_votes

<<<< " votes and Kerry received "<<" votes and Kerry received "<<kerry_voteskerry_votes << " votes<< " votes\\nn””; ;

}}

עד , סופרת הצבעות לב וש ו לקר י

שאומרים ל ה לעצור

break י "הלולא ה נמשכת עד שנצא ע

לכל הי ותר 5קליטת מחרוזת באו רך

משתנים לספיר ת הקו לות

בודקים

איזה

מחרוזת

נקלטה

Page 3: 8 מצביעים

3

כתו בות ו מצביעים כתו בות ו מצביעים : : נושאי השיעו ר היוםנושאי השיעו ר היום

מהן כתובות בזיכרון מהן כתובות בזיכרון ••

פעולות עם כתובותפעולות עם כתובות••

מהם מצביעים ומה אפשר לעשות איתםמהם מצביעים ומה אפשר לעשות איתם••

מצביעים ומערכיםמצביעים ומערכים••

כתובות ב זיכ רו ן כתובות ב זיכ רו ן

. . רביםרבים) ) ב תיםב תים((אמרנו בעבר שה זיכר ון ש ל המחשב מורכב מתאים אמרנו בעבר שה זיכר ון ש ל המחשב מורכב מתאים ••

..במחשבים הנ וכחי ים מדובר במיליו נים ו אפיל ו מילי ארדי םבמחשבים הנ וכחי ים מדובר במיליו נים ו אפיל ו מילי ארדי ם

). ). מספר תאמספר תא((כתו בת כתו בת לכל תא בזי כרו ן יש לכל תא בזי כרו ן יש ••

הו א יכו ל לתפוס הו א יכו ל לתפוס ( (מס וי ימתמס וי ימתהחל מכתובת החל מכתובת כל משתנה נ שמר בזיכר ון כל משתנה נ שמר בזיכר ון ••

). ). בהתאם ל טיפוס המשתנ הבהתאם ל טיפוס המשתנ ה, , יותר מתא אחדיותר מתא אחד

intint: : ידיידי--כשמגדיר ים משתנה עלכשמגדיר ים משתנה על, , למשללמשל•• i; i;

. . מקום בזיכרו ן בכת ו בת שהוא ב וחרמקום בזיכרו ן בכת ו בת שהוא ב וחר ii המחשב מקצה עבור המשתנה המחשב מקצה עבור המשתנה

. . של כת ובו ת המשתנים של כת ובו ת המשתניםטבלהטבלההוא ש ומר הוא ש ומר

Page 4: 8 מצביעים

4

כתובות ב זיכ רו ן כתובות ב זיכ רו ן -- דוגמא דוגמא

intint main()main()

{{

intint i; i;

}}

התוכני ת התוכני ת הזיכרוןהזיכרון

??

75007500

טבל ת ה כ תובו ת טבל ת ה כ תובו ת

i i 75007500

משתנה משתנה כתובתכתובת

כתובת כלשהי כתובת כלשהי

שהמחשב בחרשהמחשב בחר

כתובת כלשהי כתובת כלשהי

שהמחשב בחרשהמחשב בחר

1010

כתובות ב זיכ רו ן כתובות ב זיכ רו ן -- דוגמא דוגמא

intint main()main()

{{

intint i;i;

i=10; i=10;

}}

התוכני ת התוכני ת הזיכרוןהזיכרון

75007500

טבל ת ה כ תובו ת טבל ת ה כ תובו ת

i i 75007500

משתנה משתנה כתובתכתובת

ערך המשתנה ערך המשתנה

מתעדכן בזיכרוןמתעדכן בזיכרון

Page 5: 8 מצביעים

5

כתובות ב זיכ רו ן כתובות ב זיכ רו ן -- דוגמא דוגמא

intint main()main()

{{

intint i=10; i=10;

}}

התוכני ת התוכני ת הזיכרוןהזיכרון

1010

75007500

טבל ת ה כ תובו ת טבל ת ה כ תובו ת

i i 75007500

משתנה משתנה כתובתכתובת

כמעט אותו דבר אם כמעט אותו דבר אם

הערך ניתן באתחולהערך ניתן באתחול

כתובות ב זיכ רו ן כתובות ב זיכ רו ן -- דוגמא דוגמא

intint main()main()

{{

intint i=10; i=10;

char c=char c=‘‘AA’’;;

}}

התוכני ת התוכני ת הזיכרוןהזיכרון

1010

75007500

טבל ת ה כ תובו ת טבל ת ה כ תובו ת

i i 75007500

c c 99200200

משתנה משתנה כתובתכתובת

‘‘AA’’

99200200

כך גם עבור משתנים כך גם עבור משתנים

מסוגים אחריםמסוגים אחרים

Page 6: 8 מצביעים

6

כתובות ב זיכ רו ן כתובות ב זיכ רו ן -- דוגמא דוגמא

intint main()main()

{{

intint i=10; i=10;

char c=char c=‘‘AA’’;;

}}

התוכני ת התוכני ת הזיכרוןהזיכרון

1010

75007500

טבל ת ה כ תובו ת טבל ת ה כ תובו ת

i i 75007500

c c 99200200

משתנה משתנה כתובתכתובת

6565

99200200

למעשה נשמר למעשה נשמר

האסקיהאסקיערך ערך

של התושל התו

גודל ה מש תנה גודל ה מש תנה––כתובות ב זיכ רו ן כתובות ב זיכ רו ן

מספר התאיםמספר התאיםשהוא שהוא , , בטבלת הכתובות נשמר נתון נוסףבטבלת הכתובות נשמר נתון נוסף••

.. המשתנה הזה המשתנה הזהליצוגליצוגשמשמשים שמשמשים ) ) בתיםבתים((

ועבור ועבור , , ידי ארבעהידי ארבעה-- על עלintint, , ידי בית אחדידי בית אחד-- מיוצג על מיוצג עלcharchar, , למשללמשל••

doubledouble ברוב הקומפיילריםברוב הקומפיילרים(( שמונה שמונה.(.(

המחשב בודק המחשב בודק , , כשאנחנו מתייחסים בתוכנית לשם של משתנהכשאנחנו מתייחסים בתוכנית לשם של משתנה••

הוא הוא וכמה מקוםוכמה מקוםהמשתנה הזה נמצא בזיכרון המשתנה הזה נמצא בזיכרון איפהאיפהבטבלה בטבלה

..וכך הוא יודע להביא לנו את הערך שלווכך הוא יודע להביא לנו את הערך שלו, , תופסתופס

Page 7: 8 מצביעים

7

כתובות ב זיכ רו ן כתובות ב זיכ רו ן -- דוגמא דוגמא

intint main()main()

{{

intint i=10; i=10;

char c=char c=‘‘AA’’;;

}}

התוכני ת התוכני ת הזיכרוןהזיכרון

00

75007500

טבל ת ה כ תובו ת טבל ת ה כ תובו ת

i i 75007500 44

c c 99200200 11

משתנה משתנה כתובתכתובת

6565

99200200

גודלגודל00 00 1100

). ). בתיםבתים(( תאים תאים 44המחשב מקצה המחשב מקצה intint עבורעבור

..אם המספר קטן אז הספרו ת הראשו נות י הי ו מאופסות אם המספר קטן אז הספרו ת הראשו נות י הי ו מאופסות

כתובות ב זיכ רו ן כתובות ב זיכ רו ן

בזיכרון בזיכרוןמסויימתמסויימתכל משתנה נשמר בכתובת כל משתנה נשמר בכתובת ••

וגדליהםוגדליהםיש טבלה של כתובות המשתנים יש טבלה של כתובות המשתנים ••

? ? שאלותשאלות••

Page 8: 8 מצביעים

8

כתובות כתובות –– איך מתייחסים אלי הן איך מתייחסים אלי הן

שבה שבה בזיכרוןבזיכרון מהי הכתובתמהי הכתובת מאפשרת לנו לדעת מאפשרת לנו לדעת CCשפת שפת ••

..מסוייםמסוייםנשמר משתנה נשמר משתנה

. . נותנת את הכתובת של המשתנה נותנת את הכתובת של המשתנה&&הפעולה הפעולה ••

..ii היא הכתובת בז י כרון ש ל המשתנ ה היא הכתובת בז י כרון ש ל המשתנ ה i&i&למשל למשל ••

..75007500 נותן נותן i&i&בדוגמא הק ודמת בדוגמא הק ודמת ••

כתובות ב זיכ רו ן כתובות ב זיכ רו ן -- דוגמא דוגמא

intint main()main()

{{

intint i=10; i=10;

}}

התוכני ת התוכני ת הזיכרוןהזיכרון

75007500

טבל ת ה כ תובו ת טבל ת ה כ תובו ת

i i 75007500 44

משתנה משתנה כתובתכתובת גודלגודל1100

&i&i 75007500 זה זה

Page 9: 8 מצביעים

9

איך ניגשים אליהן איך ניגשים אליהן ––כתובות כתובות

.. של משתנה של משתנההכתובתהכתובת נותנת את נותנת את &&אמרנו שהפעולה אמרנו שהפעולה ••

..ii היא הכתובת בז י כרון ש ל המשתנ ה היא הכתובת בז י כרון ש ל המשתנ ה i&i&למשל למשל ••

..75007500 היה נ ו תן היה נ ו תן i&i&בדוגמא הק ודמת בדוגמא הק ודמת ••

. . מסויימתמסויימת שנמצא בכתובת שנמצא בכתובת לערךלערךניגשת ניגשת ** הפעולההפעולה••

. . 00004040 זה הערך שנמצא בכתו בת זה הערך שנמצא בכתו בת (4000)*(4000)*למשל למשל ••

••*(&c)*(&c) זה הערך של המשת נה זה הערך של המשת נה cc) ) כי זה הערך ש נמצא בכתובת ש ל כי זה הערך ש נמצא בכתובת ש ל(c (c ..

כתובות ב זיכ רו ן כתובות ב זיכ רו ן -- דוגמא דוגמא

intint main()main()

{{

char c=char c=‘‘AA’’; ;

}}

התוכני ת התוכני ת הזיכרוןהזיכרון

6565

92009200

טבל ת ה כ תובו ת טבל ת ה כ תובו ת

c c 92009200

משתנה משתנה כתובתכתובת

6565 זה זה (9200)*(9200)*

Page 10: 8 מצביעים

10

כתובות כתובות –– מה אפשר לעשות איתן מה אפשר לעשות איתן . . לשנות כתובת של משתנה לשנות כתובת של משתנהלא ניתןלא ניתן••

..i=5000&i=5000&: : כלומר לא ניתן לכתוב למשל כלומר לא ניתן לכתוב למשל

. . מסויימתמסויימת שנמצא בכתובת שנמצא בכתובת הערךהערךניתן לשנות את ניתן לשנות את •• ..;;’’AA‘‘=(c&)*=(c&)*: : למשללמשל••

..;;’’c=c=‘‘AA זה כמו לכת ובזה כמו לכת וב••

לשנות את הערך שנמצא בכתובת כלשהי שאיננה לשנות את הערך שנמצא בכתובת כלשהי שאיננה מסוכןמסוכן••..;123=(4000)*;123=(4000)*למשל למשל . . כתובת של משתנהכתובת של משתנה

, , אנחנו ע לול ים לשנ ות מקום בזיכר ון שש ייך למער כת ה הפעלהאנחנו ע לול ים לשנ ות מקום בזיכר ון שש ייך למער כת ה הפעלה••. . ולגרום לת וכ נית לע וףולגרום לת וכ נית לע וף

..ערכ ים של משתנים שה גדרנ וערכ ים של משתנים שה גדרנ ולכן נש נה רק לכן נש נה רק ••

? ? בשביל מה כל זה טו בבשביל מה כל זה טו ב

. . הרי כדי לשנות ערך של משתנה אפשר פשוט לשים בו ערךהרי כדי לשנות ערך של משתנה אפשר פשוט לשים בו ערך••

?? לדעת מה הכתובת שלו לדעת מה הכתובת שלונירצהנירצהאז בשביל מה אז בשביל מה . . ;i=10;i=10למשל למשל

ולא להשתמש פשוט ולא להשתמש פשוט מסויימתמסויימתבכתובת בכתובת לשים ערך לשים ערך שנירצהשנירצהלמה למה ••

? ? בשם המשתנהבשם המשתנה

Page 11: 8 מצביעים

11

בשביל מה נש תמש בכתו בות בשביל מה נש תמש בכתו בות

. . אמרנו שכל משתנה מוכר רק בתוך הפונקציה שהוא הוגדר בהאמרנו שכל משתנה מוכר רק בתוך הפונקציה שהוא הוגדר בה••

כדי לשנות ערך של משתנה מתוך פונקציה כדי לשנות ערך של משתנה מתוך פונקציה נשתמש בכתובות נשתמש בכתובות ••

..שהוא לא הוגדר בהשהוא לא הוגדר בה, , אחרתאחרת

ולא רק תחזיר ולא רק תחזיר ( (כמה משתניםכמה משתניםאם רוצים שפונקציה תשנה אם רוצים שפונקציה תשנה , , כלומרכלומר••

זה זה . . הכתובות שלהםהכתובות שלהםאז אפשר להעביר אליה את אז אפשר להעביר אליה את , , ))ערך אחדערך אחד

..מאפשר לה לשנות באופן ישיר את ערכיהם בזיכרוןמאפשר לה לשנות באופן ישיר את ערכיהם בזיכרון

דוגמא דוגמא כתובת כתובת שמקבלת את שמקבלת את , , scanfscanfמשתמשים בהעברת כת וב ת בפונקציה משתמשים בהעברת כת וב ת בפונקציה ••

::למשללמשל. . המשתנה ש אלי ו יו כנ ס הקל טהמשתנה ש אלי ו יו כנ ס הקל ט

intint grade;grade;

scanf(scanf(““%d%d””, &grade);, &grade);

והיא גם לא מחזירה לתו כו והיא גם לא מחזירה לתו כו scanfscanf לא מוגדר בפונקציה לא מוגדר בפונקציה gradegrade המשתנההמשתנה••..ערךערך

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

גם מה גודל המשתנה הז ה גם מה גודל המשתנה הז ה scanfscanf --אומר ל אומר ל ) ) d%d%למש ל למש ל ((קידוד הק לט קידוד הק לט ••..כלומר ל כמה תאים הקלט אמור לה יכנ סכלומר ל כמה תאים הקלט אמור לה יכנ ס, , בזיכר וןבזיכר ון

Page 12: 8 מצביעים

12

פעולות פעולות --כתובות ב זיכ רו ן כתובות ב זיכ רו ן

i&i&מציאת הכתובת מציאת הכתובת ••

**גישה למשתנה לפי הכתובת עם הפעולה גישה למשתנה לפי הכתובת עם הפעולה ••

זה יאפשר לנו לשנות יותר ממשתנה אחד בפונקציהזה יאפשר לנו לשנות יותר ממשתנה אחד בפונקציה••

? ? שאלותשאלות••

עבודה עם כתו בות עבודה עם כתו בות -- מצביעים מצביעים

. . משתני ם לשמירת כתובות בזיכרוןמשתני ם לשמירת כתובות בזיכרון-- טיפוסי טיפוסיCC--יש ביש ב••

".".פויינטריםפויינטרים"" או או ""מצביעיםמצביעים""הם נקראים הם נקראים ••

::אפשר להגדיר למשלאפשר להגדיר למשל••

•• char *char *my_pointer_to_char;my_pointer_to_char;

•• intint **the_pointer_to_intthe_pointer_to_int;;

סוג סוג רושמים את רושמים את , , מצביעמצביעכדי להגדיר משתנה מסוג כדי להגדיר משתנה מסוג , , באופן כלליבאופן כללי••

. . לפני שם המשתנה לפני שם המשתנה**וכותבים וכותבים , , המשתנה שעליו מצביעיםהמשתנה שעליו מצביעים

;;double *double *my_pointer;my_pointer; float *float *ptrptr : : עוד דוגמא ותעוד דוגמא ות••

charchar משתנה לשמיר ת כ תו בת של משתנה לשמיר ת כ תו בת של

intint משתנה לשמיר ת כ תו בת ש ל משתנה לשמיר ת כ תו בת ש ל

Page 13: 8 מצביעים

13

עבודה עם כתו בות עבודה עם כתו בות -- מצביעים מצביעים

. . משתני ם לשמירת כתובות בזיכרוןמשתני ם לשמירת כתובות בזיכרון-- טיפוסי טיפוסיCC--יש ביש ב••

".".פויינטריםפויינטרים"" או או ""מצביעיםמצביעים""הם נקראים הם נקראים ••

::אפשר להגדיר למשלאפשר להגדיר למשל••

•• char char **my_pointer_to_char;my_pointer_to_char;

•• intint **the_pointer_to_intthe_pointer_to_int;;

סוג סוג רושמים את רושמים את , , מצביעמצביעכדי להגדיר משתנה מסוג כדי להגדיר משתנה מסוג , , באופן כלליבאופן כללי••. . לפני שם המשתנה לפני שם המשתנה**וכותבים וכותבים , , המשתנה שעליו מצביעיםהמשתנה שעליו מצביעים

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

charchar משתנה לשמיר ת כ תו בת של משתנה לשמיר ת כ תו בת של

intint משתנה לשמיר ת כ תו בת ש ל משתנה לשמיר ת כ תו בת ש ל

300

מצביעים מצביעים –– משמעות משמעות

::לדוגמאלדוגמא. . למשתנה אחרלמשתנה אחר") ") חץחץ("("מצביע מכיל למעשה הפניה מצביע מכיל למעשה הפניה ••

intint i=10;i=10;

intint **my_pointer_to_intmy_pointer_to_int;;

my_pointer_to_intmy_pointer_to_int == &&i;i;

10

i my_pointer_to_int

) לדוגמא (300כתובת

intint הגדרת מצ ביע לשמיר ת כ תוב ת של הגדרת מצ ביע לשמיר ת כ תוב ת של

ii מוכנסת א ליו ה כת וב ת בזי כרון ש ל מוכנסת א ליו ה כת וב ת בזי כרון ש ל

Page 14: 8 מצביעים

14

100

גישה למשתנה עלגישה למשתנה על--ידי מצביע ידי מצביע

, , מסויימתמסויימת בכתובתבכתובת שנמצא שנמצא לערךלערךכדי להתייחס כדי להתייחס , , כאמורכאמור••

::ניראה קטע תוכנית לדוגמאניראה קטע תוכנית לדוגמא. . **משתמשים בסימן משתמשים בסימן

intint i=10;i=10;

intint **my_pointer_to_intmy_pointer_to_int;;

my_pointer_to_intmy_pointer_to_int = = &&i;i;

**my_pointer_to_intmy_pointer_to_int=100;=100;

cincin << << ““The value of i is now The value of i is now ”” << i;<< i;

מצביע עליו שהפויינ טר במקום 100שמים

100יודפס המספר

int הגדרת מצביע על

i שמים במצביע את כת ובת המשתנה

i my_pointer_to_int

למה יש מצביע שונה לכל טיפ וסלמה יש מצביע שונה לכל טיפ וס? ?

ואיך ואיך ,,גודל המשתנה שמצביעים עליוגודל המשתנה שמצביעים עליוסוג המצביע אומר מה סוג המצביע אומר מה ••

).).למשל שלם או ממשילמשל שלם או ממשי((רוצים להתייחס לתוכן הכתובת הזאת רוצים להתייחס לתוכן הכתובת הזאת

המחשב יודע בכמה המחשב יודע בכמה , , אז כשמתייחסים לערך שעליו מצביעיםאז כשמתייחסים לערך שעליו מצביעים••

..מאחסן את הערך הנכוןמאחסן את הערך הנכון//ומביאומביא, , בתים הוא מיוצג ואיךבתים הוא מיוצג ואיך

". ". כתובותכתובות--חישוביחישובי""ניראה בעתיד איך זה מאפשר גם לעשות ניראה בעתיד איך זה מאפשר גם לעשות ••

11אז נוכל ל הוס יף אז נוכל ל הוס יף , , ii שנמצא בזיכרו ן מייד אחרי שנמצא בזיכרו ן מייד אחרי intint -- לגשת ל לגשת ל נירצהנירצהאם אם ••

intintוהמחשב ידע בכמה בתים להתקדם בה תאם לגודל של והמחשב ידע בכמה בתים להתקדם בה תאם לגודל של , , iiלמצביע על למצביע על

Page 15: 8 מצביעים

15

מצביעים ו כתו בות מצביעים ו כתו בות –– נקודות לתשומת נקודות לתשומת--לבלב

::לא נכתובלא נכתוב, , למשללמשל. . אין כתובתאין כתובתנשים לב שלקבועים וביטויים נשים לב שלקבועים וביטויים ••

&5&5

&(i*2)&(i*2)

.. רק למשתנים יש כתובת רק למשתנים יש כתובת

המחשב קובע המחשב קובע ((כיוון שלא ניתן לשנות כתובת של משתנה כיוון שלא ניתן לשנות כתובת של משתנה ••

..a=&b&a=&b&: : לבצע עליה השמה לבצע עליה השמהלא ניתןלא ניתן, , ))אותהאותה

מצביעים מצביעים –– שתי נקודות נוספות שתי נקודות נוספות

למשל לפני למשל לפני ( (לא מצביע לשום משתנהלא מצביע לשום משתנהכדי לסמן שמצביע כדי לסמן שמצביע ••

: : למשללמשל. . NULLNULLנותנים לו את הערך נותנים לו את הערך , , )) אותו אותושאיתחלנושאיתחלנו

intint *pointer_to_i=NULL;*pointer_to_i=NULL;

••NULLNULL שמוגדר ב שמוגדר ב00 הוא קבו ע שערכו הוא קבו ע שערכו -- #define#define בספריה בספריה stdlib.hstdlib.h..

Page 16: 8 מצביעים

16

סיכום ביני ים סיכום ביני ים ––מצביעים מצביעים

.. של משתנה אחר של משתנה אחרלשמירת כתובתלשמירת כתובתאלה משתנים שמשמשים אלה משתנים שמשמשים ••

--י סוג המשתנה שמצביעים עליו וי סוג המשתנה שמצביעים עליו ו"" נרשם בהגדרה ע נרשם בהגדרה עסוג המצביעסוג המצביע••

intint : : למשללמשל. . ** **my_ptrmy_ptr;;

: : למשללמשל. . ** מצביע עליו בעזרת מצביע עליו בעזרת שהפויינטרשהפויינטראפשר לגשת למשתנה אפשר לגשת למשתנה ••

**my_ptrmy_ptr=5;=5;

? ? שאלותשאלות

מצביעים מצביעים –– דוגמא דוגמא

ומחליפה ומחליפה , , intint של ש ני משת נים מס וג של ש ני משת נים מס וג כ תובותכ תובותנתאר פונקצ יה שמקבל ת נתאר פונקצ יה שמקבל ת ••..בין הער כים של הםבין הער כים של הם

עד עכשי ו לא יכ ול נו ל כתוב פונקציה ל החלפת ערכים של שני משת נים עד עכשי ו לא יכ ול נו ל כתוב פונקציה ל החלפת ערכים של שני משת נים ((•• בפונקציה ל א משפיע על ערכם בפונקציה ל א משפיע על ערכם intintכי שינו י משתנ ים מסוג כי שינו י משתנ ים מסוג , , intintמסוג מסוג

).).ופונקצי ה יכ ול ה לה חזיר רק ערך אחדופונקצי ה יכ ול ה לה חזיר רק ערך אחד, , המקור יהמקור י

void void swap(swap(intint **first, first, intint **second)second)

{{

intint temp;temp;

temp=temp=**first;first;

**first=first=**second;second;

**second=temp;second=temp;

}}

;swap(&i, &j);swap(&i, &j) ::ידיידי--השימ וש למשל על השימ וש למשל על

first ערך המשתנה שכת וב תו הועבר ה אל

יוחלף עם ערך המשתנ ה ש כתובת ו הועבר ה אל

second

Page 17: 8 מצביעים

17

פ ונקצ יה להחלפה בין ע רכי משתנ ים פ ונקצ יה להחלפה בין ע רכי משתנ ים : : דוגמאדוגמא

void void swap(intswap(int *first, *first, intint *second)*second)

{{

intint temp;temp;

temp=*first;temp=*first;

*first=*second;*first=*second;

*second=temp;*second=temp;

}}

intint main()main()

{ {

intint i=10, j=20;i=10, j=20;

swap(&i,&j);swap(&i,&j);

}}

פ ונקצ יה להחלפה בין ע רכי משתנ ים פ ונקצ יה להחלפה בין ע רכי משתנ ים : : דוגמאדוגמא

void void swap(intswap(int *first, *first, intint *second)*second)

{{

intint temp;temp;

temp=*first;temp=*first;

*first=*second;*first=*second;

*second=temp;*second=temp;

}}

intint main()main()

{ {

intint i=10, j=20;i=10, j=20;

swap(&i,&j);swap(&i,&j);

}}

Page 18: 8 מצביעים

18

פ ונקצ יה להחלפה בין ע רכי משתנ ים פ ונקצ יה להחלפה בין ע רכי משתנ ים : : דוגמאדוגמא

void void swap(intswap(int *first, *first, intint *second)*second)

{{

intint temp;temp;

temp=*first;temp=*first;

*first=*second;*first=*second;

*second=temp;*second=temp;

}}

intint main()main()

{ {

intint i=10, j=20;i=10, j=20;

swap(&i,&j);swap(&i,&j);

}}

10

20i

j

void void swap(intswap(int *first, *first, intint *second)*second)

{{

intint temp;temp;

temp=*first;temp=*first;

*first=*second;*first=*second;

*second=temp;*second=temp;

}}

intint main()main()

{ {

intint i=10, j=20;i=10, j=20;

swap(&i,&j);swap(&i,&j);

}}

10

first

20

second

i

j

פ ונקצ יה להחלפה בין ע רכי משתנ ים פ ונקצ יה להחלפה בין ע רכי משתנ ים : : דוגמאדוגמא

Page 19: 8 מצביעים

19

void void swap(intswap(int *first, *first, intint *second)*second)

{{

intint temp;temp;

temp=*first;temp=*first;

*first=*second;*first=*second;

*second=temp;*second=temp;

}}

intint main()main()

{ {

intint i=10, j=20;i=10, j=20;

swap(&i,&j);swap(&i,&j);

}}

10

first

temp

20

second

i

j

פ ונקצ יה להחלפה בין ע רכי משתנ ים פ ונקצ יה להחלפה בין ע רכי משתנ ים : : דוגמאדוגמא

void void swap(intswap(int *first, *first, intint *second)*second)

{{

intint temp;temp;

temp=*first;temp=*first;

*first=*second;*first=*second;

*second=temp;*second=temp;

}}

intint main()main()

{ {

intint i=10, j=20;i=10, j=20;

swap(&i,&j);swap(&i,&j);

}}

10

first

temp 10

20

second

i

j

פ ונקצ יה להחלפה בין ע רכי משתנ ים פ ונקצ יה להחלפה בין ע רכי משתנ ים : : דוגמאדוגמא

Page 20: 8 מצביעים

20

void void swap(intswap(int *first, *first, intint *second)*second)

{{

intint temp;temp;

temp=*first;temp=*first;

*first=*second;*first=*second;

*second=temp;*second=temp;

}}

intint main()main()

{ {

intint i=10, j=20;i=10, j=20;

swap(&i,&j);swap(&i,&j);

}}

20

first

temp 10

20

second

i

j

פ ונקצ יה להחלפה בין ע רכי משתנ ים פ ונקצ יה להחלפה בין ע רכי משתנ ים : : דוגמאדוגמא

void void swap(intswap(int *first, *first, intint *second)*second)

{{

intint temp;temp;

temp=*first;temp=*first;

*first=*second;*first=*second;

*second=temp;*second=temp;

}}

intint main()main()

{ {

intint i=10, j=20;i=10, j=20;

swap(&i,&j);swap(&i,&j);

}}

20

first

temp 10

10

second

i

j

פ ונקצ יה להחלפה בין ע רכי משתנ ים פ ונקצ יה להחלפה בין ע רכי משתנ ים : : דוגמאדוגמא

Page 21: 8 מצביעים

21

void void swap(intswap(int *first, *first, intint *second)*second)

{{

intint temp;temp;

temp=*first;temp=*first;

*first=*second;*first=*second;

*second=temp;*second=temp;

}}

intint main()main()

{ {

intint i=10, j=20;i=10, j=20;

swap(&i,&j);swap(&i,&j);

}}

20

10i

j

פ ונקצ יה להחלפה בין ע רכי משתנ ים פ ונקצ יה להחלפה בין ע רכי משתנ ים : : דוגמאדוגמא

first

temp 10

second

void void swap(intswap(int *first, *first, intint *second)*second)

{{

intint temp;temp;

temp=*first;temp=*first;

*first=*second;*first=*second;

*second=temp;*second=temp;

}}

intint main()main()

{ {

intint i=10, j=20;i=10, j=20;

swap(&i,&j);swap(&i,&j);

}}

20

10i

j

בלי מצביעים לא בלי מצביעים לא

יכולנו לשנות יו תר יכולנו לשנות יו תר

--ממש תנה אחד על ממש תנה אחד על

ידי פונקציהידי פונקציה

פ ונקצ יה להחלפה בין ע רכי משתנ ים פ ונקצ יה להחלפה בין ע רכי משתנ ים : : דוגמאדוגמא

Page 22: 8 מצביעים

22

עוד על פונקציות ומצביעים עוד על פונקציות ומצביעים ::למשללמשל, , נציי ן שהערך המ וחזר מפונ קציה יכ ול ל הי ות מצביענציי ן שהערך המ וחזר מפונ קציה יכ ול ל הי ות מצביע••

•• intint* * address_ofaddress_of __the_higher_number(intthe_higher_number(int *a, *a, intint*b);*b);

. . תגרום לשגיא ה תגרום לשגיא המשתנ ה שהוגדר בת וך הפונ קציה משתנ ה שהוגדר בת וך הפונ קציה אבל החזרת כתוב ת אבל החזרת כתוב ת ••למשל למשל . . כי המשת נים שמוגדר ים בתוך הפונקצ יה נע למים עם סיומ הכי המשת נים שמוגדר ים בתוך הפונקצ יה נע למים עם סיומ ה

::הפונקצ יה הבא ה תגרום ל שגיא ההפונקצ יה הבא ה תגרום ל שגיא ה

intint *give_pointer_to_zero() *give_pointer_to_zero()

{ {

intint i=0;i=0;

return &i;return &i;

}}

??שאלות נוס פותשאלות נוס פות

מצביעים מצביעים

Page 23: 8 מצביעים

23

מצביעים ו מער כים מצביעים ו מער כים

::כשכותביםכשכותבים••

char array[10];char array[10];

והמשתנה והמשתנה , , תווים תווים1010 תאים רצופים עבור תאים רצופים עבור 1010מוקצים בזיכרון מוקצים בזיכרון

arrayarray התא הראשון מביניהם התא הראשון מביניהםכתובתכתובת מכיל את מכיל את . .

array[0] array[9]

.. . . . . . . ..500

array

) למשל (500כתובת

מצביעים ו מער כים מצביעים ו מער כים

). ). היא נקבעת כשהוא מוגדרהיא נקבעת כשהוא מוגדר((אפשר לשנות כתובת של מערך אפשר לשנות כתובת של מערך --איאי••

..array=0array=0או או , , array=array1array=array1לכן לא נ יתן ל כתוב לכן לא נ יתן ל כתוב ••

::אפשר לכתובאפשר לכתוב. . לשים כתובת של מערך בתוך מצביע לשים כתובת של מערך בתוך מצביעאפשראפשר••

char *char *array_ptrarray_ptr;;

array_ptrarray_ptr=array;=array;

) );array_ptrarray_ptr=&array[0];=&array[0]::הש ורה האחר ונה ש קול ה לשור ההש ורה האחר ונה ש קול ה לשור ה((••

).).אבל לא להיפךאבל לא להיפך ( (מערך הוא סוג של מצביעמערך הוא סוג של מצביע משתנהמשתנה ,,כלומרכלומר••

מערך הוא למעש ה מצביע שמקבל כתו בת בהגדרה ול א ניתן ל שנות מערך הוא למעש ה מצביע שמקבל כתו בת בהגדרה ול א ניתן ל שנות ••

. . אותהאותה

) ) שמים במצביע את כת ובת התא הראשו ן במערךשמים במצביע את כת ובת התא הראשו ן במערך((

Page 24: 8 מצביעים

24

גישה לתאי גישה לתאי --מערך לפי הכתו בתמערך לפי הכתו בת::אם הגדרנו למש לאם הגדרנו למש ל••

intint array[10];array[10];

intint **array_ptrarray_ptr;;

array_ptrarray_ptr=array;=array;

..כמו משתנים אחריםכמו משתנים אחרים, , הכתובת של הם הכתובת של הםה מערך גם לפיה מערך גם לפי-- אז אפשר לגשת לתאי אז אפשר לגשת לתאי):): במערך במערך55' ' בתא מס בתא מס100100שמ ות שמ ות (( הפעולות הבא ות עוש ות אותו דבר הפעולות הבא ות עוש ות אותו דבר 33

array[5]=100;array[5]=100;

**(array+5)=100;(array+5)=100;

**(array_ptr+5)=100;(array_ptr+5)=100;

תאים תאים 55-- המחשב יודע כמ ה בתים להתקדם כשא נחנ ו מבקשי ם להתקדם ב המחשב יודע כמ ה בתים להתקדם כשא נחנ ו מבקשי ם להתקדם ב--•• intint והו א יודע כמה בתים כל והו א יודע כמה בתים כל intintכי הגדר נו שטיפ וס הערכים ה וא כי הגדר נו שטיפ וס הערכים ה וא , , קדימהקדימה). ). ערכ י המער ך שמורים בזיכר ון ברצףערכ י המער ך שמורים בזיכר ון ברצף, , כאמורכאמור((תופס תופס

תאים אחרי התא הראש ון תאים אחרי התא הראש ון 55גישה לת א שנמצא גישה לת א שנמצא

))מצביע על התא הר אשו ן ב מערךמצביע על התא הר אשו ן ב מערך((

גישה למערך ל פי כתובת גישה למערך ל פי כתובת –– דו גמא נוספת דו גמא נוספת

:: האפשרויו ת הבאות ע ושו ת בדי וק אות ו דבר האפשרויו ת הבאות ע ושו ת בדי וק אות ו דבר33, , עבור הדפסת מערךעבור הדפסת מערך••

intint i,array[10];i,array[10];

intint **ptrptr;;

•• for (i=0; i<10; i++)for (i=0; i<10; i++)

coutcout << << array[iarray[i];];

•• for (i=0; i<10; i++)for (i=0; i<10; i++)

coutcout << << *(*(array+iarray+i));;

•• forfor ((ptrptr=array; =array; ptrptr <= &array[9]; <= &array[9]; ptrptr++++))

coutcout << << **ptrptr;;

י קידום מצביע י קידום מצביע ""הדפסה עהדפסה ע

מכתובת התא הר אשו ן מכתובת התא הר אשו ן

עד כתובת התא ה אחרון עד כתובת התא ה אחרון

ידי גי שה ידי גי שה --הדפסה על הדפסה על

רגילה לת אי המערך רגילה לת אי המערך

ידי גי שה לכ ל תא לפיידי גי שה לכ ל תא לפי--הדפסה על הדפסה על

הכתוב ת שלו יח סית לתא ה ראשו ן הכתוב ת שלו יח סית לתא ה ראשו ן

Page 25: 8 מצביעים

25

מערכים ופ ונקציות מערכים ופ ונקציות -- הסבר הסבר

אמרנו בעבר שכ שמעביר ים מערך לפונקציה ש ינ ויים ש נעשה בפו נקצי ה אמרנו בעבר שכ שמעביר ים מערך לפונקציה ש ינ ויים ש נעשה בפו נקצי ה ••. . ישפיע ו על המערך המקור יישפיע ו על המערך המקור י

של המערך של המערך הכת ובת בזי כרו ןהכת ובת בזי כרו ןזה נובע מכך שלפ ונקצ יה מועברת זה נובע מכך שלפ ונקצ יה מועברת ••). ). ולא על הע תק שלהםולא על הע תק שלהם( ( והיא פוע לת יש ירו ת על ערכיו והיא פוע לת יש ירו ת על ערכיו , , המקור יהמקור י

::הפונק ציה הבא ה תאפס מערך שמועבר אלי ההפונק ציה הבא ה תאפס מערך שמועבר אלי ה, , כפי שאמרנ וכפי שאמרנ ו, , למשללמשל••

void void zero_array(intzero_array(int a[], a[], intint size) size)

{ {

intint i;i;

for(i=0 ; i<size; i++) for(i=0 ; i<size; i++)

a[i]=0;a[i]=0;

}}

מערכים ופ ונקציות מערכים ופ ונקציות -- הסבר הסבר

אמרנו בעבר שכ שמעביר ים מערך לפונקציה ש ינ ויים ש נעשה בפו נקצי ה אמרנו בעבר שכ שמעביר ים מערך לפונקציה ש ינ ויים ש נעשה בפו נקצי ה •• ..ישפיע ו על המערך המקור יישפיע ו על המערך המקור י

של המערך של המערך הכת ובת בזי כרו ןהכת ובת בזי כרו ןזה נובע מכך שלפ ונקצ יה מועברת זה נובע מכך שלפ ונקצ יה מועברת ••). ). ולא על הע תק שלהםולא על הע תק שלהם( ( והיא פוע לת יש ירו ת על ערכיו והיא פוע לת יש ירו ת על ערכיו , , המקור יהמקור י

::הפונק ציה הבא ה תאפס מערך שמועבר אלי ההפונק ציה הבא ה תאפס מערך שמועבר אלי ה, , כפי שאמרנ וכפי שאמרנ ו, , למשללמשל••

void void zero_array(zero_array(intint *a*a, , intint size) size)

{ {

intint i;i;

for(i=0 ; i<size; i++) for(i=0 ; i<size; i++)

a[i]=0;a[i]=0;

}}

נציי ן שאם פונקצ יה מצפה לקבל נציי ן שאם פונקצ יה מצפה לקבל

אפשר להעביר אל י ה מערך אפשר להעביר אל י ה מערך , , מצביעמצביע

כי בשנ י המקר ים מה כי בשנ י המקר ים מה , , מהסוג הז המהסוג הז ה

. . שמועבר הו א כתובת בז יכר וןשמועבר הו א כתובת בז יכר ון

Page 26: 8 מצביעים

26

מערכים ופ ונקציותמערכים ופ ונקציות

מוגדרות מוגדרות ) ) strcmpstrcmp, , strlenstrlenכמו כמו ((למשל הפונ קצי ות שהזכר נו על מחרוזות למשל הפונ קצי ות שהזכר נו על מחרוזות ••

..* char *charלמעשה עבור מצב יעים מסו ג למעשה עבור מצב יעים מסו ג

--כלומר ר צף תווים שמסתי ים בכלומר ר צף תווים שמסתי ים ב((באחריות נו ל הפעיל א ותן ב אמת על מחרוזת באחריות נו ל הפעיל א ותן ב אמת על מחרוזת ••

). ). נקב ל תוצאות שג וי ות א ם אין את תו הס יוםנקב ל תוצאות שג וי ות א ם אין את תו הס יום((ולא סתם על מצביע ל תו ולא סתם על מצביע ל תו ) ) ''\\00''

ניתן ל העב יר אלי ה גם ניתן ל העב יר אלי ה גם , , מסוי יםמסוי יםאם פונקציה מו גדר ת על מערך בגודל אם פונקציה מו גדר ת על מערך בגודל , , כןכן--כמו כמו ••

כתובת כתובת כ י כאמור מה שמוע בר זה רק כ י כאמור מה שמוע בר זה רק ((מערך בגודל אחר של אות ו טיפוס מערך בגודל אחר של אות ו טיפוס

). ). ההתחל הההתחל ה

זה באחריו תנו שתת ב צע בפונקציה פעו לה הג יו ני ת ושהי א תדע מה זה באחריו תנו שתת ב צע בפונקציה פעו לה הג יו ני ת ושהי א תדע מה , , שובשוב••

..גודל המערך ו לא תחרוג ממנוגודל המערך ו לא תחרוג ממנו

מערכים ופ ונקציות מערכים ופ ונקציות –– נקודה לתשומת לב נקודה לתשומת לב

אם ננסה להחזיר מפונקציה מערך שהגדרנו בתוכה או אם ננסה להחזיר מפונקציה מערך שהגדרנו בתוכה או ••

..אז נקבל שגיאהאז נקבל שגיאה, , מצביע על מערך כזהמצביע על מערך כזה

intint * zero_array()* zero_array()

{ {

intint array[100]={0};array[100]={0};

return array;return array;

}}

אבל כל מה שהוגדר אבל כל מה שהוגדר , , זה מכיוון שמוחזרת כתובת של המערךזה מכיוון שמוחזרת כתובת של המערך••

..בתוך הפונקציה נמחק כשהיא מסתיימתבתוך הפונקציה נמחק כשהיא מסתיימת

Page 27: 8 מצביעים

27

מצביעים ו מער כים מצביעים ו מער כים -- סיכום סיכום

של התא של התא ((הוא מכיל כתובת הוא מכיל כתובת : : סוג של מצביעסוג של מצביעמשתנה מערך הוא משתנה מערך הוא ••..אפשר לשנות אותהאפשר לשנות אותה--אבל איאבל אי, , ))הראשון במערךהראשון במערך

..זו הסיבה שבהעברת מערך לפונקציה המערך המקורי מושפעזו הסיבה שבהעברת מערך לפונקציה המערך המקורי מושפע••

אפשר לגשת לתא במערך גם בעזרת חישוב כתובתו יחסית אפשר לגשת לתא במערך גם בעזרת חישוב כתובתו יחסית ••;100;*(array+5)=100=(array+5)*: : למשללמשל. . לכתובת התחלת המערךלכתובת התחלת המערך

??שאלותשאלות

סיכוםסיכום

:דיברנו היום על

כתובות בזיכרון•

מצביעים והשימוש בהם•

מערכים ומצביעים•

מערכים ופונקציות•

Page 28: 8 מצביעים

28

??שאלות נו ספות שאלות נו ספות

שיעור שמינ י שיעור שמינ י––מבוא למדעי המחשב מבוא למדעי המחשב