מצביעים

sigal112

New member
מצביעים

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

yair24

Member
מצביעים...

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

ihovav

New member
בעיה ידועה ומוכרת

את לא הראשונה וגם לא האחרונה שנתקלת בה הנה הסבר קצר ומאוד כללי על פוינטרים : למחשב יש 2 סוגי "כתובות" - הכתובת ה"פיזית" - כלומר כתובת אמיתית של זכרון שבה ניתן לאחסן מידע , והכתובת ה"לוגית" - שזו כתובת שהיא לא קיימת באמת ולא ניתן לאחסן בה זכרון מרחב הכתובות הלוגיות גדול בהרבה ממרחב הכתובות הפיזיות מסיבות שונות שזה לא המקום לפרט אותן המחשב עצמו משתמש בכתובות הפיזיות אבל מערכת ההפעלה "מספקת" למשתמש\מתכנת כתובות פיזיות - וזה כדי לשמור על המחשב מפני פגיעה של מתכנתים בזיכרון ובמידע לכל כתובת לוגית שמוקצאת כמו שצריך "מוצמדת" מאחוריה כתובת פיזית - שבה למעשה מוחזק המידע בפועל הפוינטר הוא למעשה משתנה שמכיל מספר שמייצג כתובת לוגית - ככה שניתן "לקדם" אותו וא "להפחית" אותו וע"י כך לשנות את תאי הזיכרון אליהם אנו מתיחסים השימוש בפוינטרים נועד למ"ס רב של מטרות: * כדי להעביר לפונקציה משתנה ע"מ לבצע בו שינויים את חייבת להעביר פוינטר ולא מספיק העברה של משתנה רגיל מבחינת המערכת משתנה רגיל שמועבר הוא לא לשינוי ולכן היא יוצרת משתנה חדש מאותו הסוג ומעתיקה אותו אליו - וזה מכביד על המערכת גם מבחינת הזיכרון וגם מבחינת זמן ריצה - וגם מונע שינויים * כאשר את עובדת עם מערכים - ומגדירה משתנה אינדקס - המערכת מתרגמת כל גישה למערך כך : "גש לתא הראשון ואז תלך ממנו X תאים" - כלומר - את גם מגדירה משתנה לשוא וזה מכביד על הזיכרון ועל המהירות, וגם מכבידה על המהירות ושום שבכל פעם שאת רוצה לגשת לתא מסויים המערכת ניגשת לתא הראשון ואז הולכת לתא הנוכחי כל זה - משום שהמערכת בעצמה עובדת עם כתובות ולא עם אינדקסים - וע"י השימוש בפוינטרים את מאפשרת עבודה מהירה יותר ויותר אפשרויות לתכנית כמובן שישנן סיבות נוספות לפוינטרים - וזה ממש לא המקום למנות אותם - אבל הרעיון העיקרי הוא לאפשר למתכנת גישה לרובד יותר קרוב למערכת כדי לשפר את הביצועים של התכנית ולפתוח אפשרויות נוספות כמובן שזה פותח פתח (או יותר נכון שער ענק) לטעויות , אבל זו השפה - לטוב ולרע... אני אשמח לענות על שאלות נוספות
 

ihovav

New member
תיקון- מערכת ההפעלה מספקת כתובות

לוגיות למשתמש\מתכנת , ולא כתובות פיזיות כמו שכתבתי בטעות קודם
 
למעלה