מצביע

מתוך ויקיפדיה, האנציקלופדיה החופשית
קפיצה אל: ניווט, חיפוש

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

מהו מצביע[עריכת קוד מקור | עריכה]

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

מצביעים הם מאבני היסוד של שפות התכנות הקלאסיות. הם מאפשרים:

  1. להתייחס למידע המאוחסן בזיכרון המחשב באופן מופשט.
  2. העברת פרמטרים בין שגרות באופן חסכוני משום שלא נדרשת העתקה.
  3. הקצאה דינמית של זיכרון בזמן ריצה ועוד.

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

מצביעי טיפוס[עריכת קוד מקור | עריכה]

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

מצביע לשגרה[עריכת קוד מקור | עריכה]

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

מצביע האפס[עריכת קוד מקור | עריכה]

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

שימוש מושכל במצביעים[עריכת קוד מקור | עריכה]

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

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

מחלקות לטיפול במצביעים[עריכת קוד מקור | עריכה]

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

כך למשל ב-Visual Basic באמצעות מחלקת אוסף (Collection) ניתן להוסיף ולהסיר איברים באופן דינמי. האיברים יכולים להיות מכל סוגי המשתנים הקיימים, ויכולים להיות בו-זמנית שונים בגודלם ובסוגם, והגישה לאיברים היא באמצעות אינדקס כמו במערך. בדוט נט ישנה מחלקה מיוחדת (Marshal בשיתוף עם המשתנה IntPtr) שתפקידה לטפל בהקצאה דינמית מבלי לאפשר הקצאה דינמית ישירה. למחלקה זו יש אפשרויות רבות ומגוונות, וייחודה בכך שהיא מאפשרת הקצאה דינמית אך מצמצמת את הבעיות הכרוכות בכך.

ראו גם[עריכת קוד מקור | עריכה]