Pointer vs Array
מצביע הוא סוג נתונים שמכיל הפניה למיקום זיכרון (כלומר, משתנה מצביע מאחסן כתובת של מיקום זיכרון שבו מאוחסנים נתונים מסוימים). מערכים הם מבנה הנתונים הנפוץ ביותר לאחסון אוסף של אלמנטים. רוב שפות התכנות מספקות שיטות להכריז בקלות על מערכים וגישה לאלמנטים במערכים.
מהו מצביע?
מצביע הוא סוג נתונים המאחסן כתובת של מיקום זיכרון שבו מאוחסנים נתונים מסוימים. במילים אחרות, מצביע מחזיק הפניה למיקום זיכרון. גישה לנתונים המאוחסנים במיקום הזיכרון שאליו מפנה המצביע נקראת הרחקה.בעת ביצוע פעולות חוזרות כמו מעבר עצים/מחרוזות, חיפושי טבלה וכו', שימוש במצביעים ישפר את הביצועים. הסיבה לכך היא שהעתק והעתקת מצביעים זולים יותר מאשר העתקה וגישה לנתונים המצביעים על ידי המצביעים. מצביע null הוא מצביע שאינו מצביע על שום דבר. ב-Java, גישה למצביע null תיצור חריג שנקרא NullPointerException.
מהו מערך?
מוצג באיור 1, הוא קטע קוד המשמש בדרך כלל להכרזה והקצאת ערכים למערך. איור 2 מתאר כיצד ייראה מערך בזיכרון.
int values[5]; values[0]=100; values[1]=101; values[2]=102; values[3]=103; values[4]=104; |
איור 1: קוד להכרזה והקצאת ערכים למערך
100 | 101 | 102 | 103 | 104 |
אינדקס: 0 | 1 | 2 | 3 | 4 |
איור 2: מערך מאוחסן בזיכרון
קוד למעלה מגדיר מערך שיכול לאחסן 5 מספרים שלמים והגישה אליהם מתבצעת באמצעות מדדים 0 עד 4. מאפיין חשוב אחד של מערך הוא שהמערך כולו מוקצה כגוש זיכרון בודד וכל אלמנט מקבל את שלו שטח משלו במערך. לאחר הגדרת מערך, גודלו קבוע. אז אם אתה לא בטוח לגבי גודל המערך בזמן ההידור, תצטרך להגדיר מערך גדול מספיק כדי להיות בצד הבטוח. אבל, רוב הפעמים, אנחנו בעצם הולכים להשתמש במספר קטן יותר של אלמנטים ממה שהקצנו. אז כמות ניכרת של זיכרון בעצם מבוזבזת.מצד שני, אם "המערך הגדול מספיק" אינו גדול מספיק, התוכנית תתרסק.
מה ההבדל בין מצביעים למערכים?
מצביע הוא סוג נתונים המאחסן כתובת של מיקום זיכרון שבו מאוחסנים נתונים מסוימים, בעוד שמערכים הם מבנה הנתונים הנפוץ ביותר לאחסון אוסף של אלמנטים. בשפת התכנות C, אינדקס מערך נעשה באמצעות אריתמטיקה מצביע (כלומר, האלמנט ה-ith של המערך x יהיה שווה ערך ל-(x+i)). לכן ב-C, ניתן לחשוב על סט מצביעים המצביע על קבוצה של מיקומי זיכרון שהם עוקבים, כמערך. יתר על כן, יש הבדל באופן שבו גודל האופרטור פועל על מצביעים ומערכים. כאשר מוחל על מערך, אופרטור sizeof יחזיר את כל גודל המערך, ואילו כאשר מוחל על מצביע, הוא יחזיר רק את גודל המצביע.