מצביע

מתוך המכלול, האנציקלופדיה היהודית
גרסה מ־18:42, 29 ביוני 2017 מאת Davidnead (שיחה | תרומות) (גרסה אחת של הדף wikipedia:he:מצביע יובאה)
קפיצה לניווט קפיצה לחיפוש

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

מהו מצביע

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

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

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

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

מצביעי טיפוס

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

מצביע לשגרה

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

מצביע האפס

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

שימוש מושכל במצביעים

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

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

מחלקות לטיפול במצביעים

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

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

ראו גם