למה פוינטרים זה טוב ?

vespa

New member
למה פוינטרים זה טוב ?

מישהו יכול אולי להסביר למה פוינטרים זה טוב ? יש כאן מישהו שחושב אולי שפוינטרים זה לא טוב?
 

edg

New member
כמה סיבות:

הינה 3 מהם: 1.כשאתה שולח מערך עם 1000 תאים לפונקציה, אז הוא מעתיק את המערך, וזה תופס זיכרון, ואם את שולח מצביע אז הוא לא מעתיק את המערך, אלה שולח מצביע. 2.אם אתה שולח משתנים לפונקציה ומשנה אותם, לאחר סיום הפונקציה הם לא ישתנו. אבל אם אתה שולח מצביע לפונקציה אז הערכים ישתנו (כי אתה משנה את המשתנה המקורי ולא עותק שלו). 3.אפשר לתת למשתנה/פונקציה/כל חלק בתוכנית כמה שמות.
 

linuxius

New member
מערך עובר כפוינטר ! ../images/Emo150.gif

שם של מערך הוא פוינטר קבוע לתא הראשון במערך!
 

edg

New member
נכון, אבל

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

linuxius

New member
נוצר רק פוינטר! לא מערך חדש!

הגודל של הפוינטר הוא 2BYTE במודל זיכרון small ו-4BYTE ב-HUGE.
 

edg

New member
טעות

הוא כן יוצר מערך חדש. כי כשאתה שולח מערך לפונקציה, ומשנה אותו, ואז חוזר לתוכנית הראשית המערך לא מישתנה!!!
 

linuxius

New member
edg אתה בטוח שאתה יודע C?

אני מצטער שאני צריך לשאול אותך את זה, אבל ההתעקשות הזו היא חסרת בסיס!
 

amni

New member
פוינטר זה בערך: משתנה שערכיו כתובות

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

vespa

New member
יש הטוענים כי זה לא טוב.

יש הסבורים כי פוינטרים מסבך והנושא גורם לכאב ראש. האם יש לפוינטרים גם חסרונות ?
 

nahsh

New member
מי אומר את זה?

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

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

linuxius

New member
ב-JAVA יש סיבה למה אין פוינטרים!

ב-JAVA חשבו על כך שהמתכנת בונה גם APPLETS שרצים אצל הלקוח ובעזרת פוינטרים הוא יכול לפנות לכתובות זיכרון של הלקוח ובכך לכתוב וירוסים או להרוס מידע בלקוח. מבחינת המתכנת כל אובייקט הוא REFERNCE שאנו מקצים לו כתובת בעזרת new תנסו לחשוב על זה כעל פוינטר שהוקצה עבורו זיכרון ו-REFERNCE שמצביע לאותו זיכרון כמו הפוינטר. לנו יש גישה רק ל-REFERENCE אך ב-garbage collection נשמר הפוינטר וכשיש צורך (עקב יציאה מהסקופ) הזיכרון משוחרר.
 

voguemaster

New member
הרבה יותר קשה ליישום ממה שנדמה

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

חובבן

New member
כמה טיפים לעבודה עם פוינטרים ב ++C

קודם כל אני מסכים שרצוי לא לעבוד עם פוינטרים איפה שניתן. 1. עדיף תמיד להעביר פרמטרים לפונקציה כ reference ולא כפוינטר (או const ref) 2. רצוי תמיד לעבוד עם auto_ptr לא עם פוינטר רגיל. כך לא צריך לעשות delete. זה ביחוד חשוב בקוד עם exeptions, כי אז לא בטוח שתגיע ל delete. 3. אם אתה חייב אריטמטיקה של פוינטרים, רצוי לבודד בתוך ה class במקום יחיד, ולא להשתמש בכל הקוד. 4. רצוי לעבוד עם STL containers גם לאיחסון פוינטרים. גם יעיל, גם בדוק וגם יפה. זהו.
 
מסכימה עם כל מה שכתבת

למרות שיותר נחמד לעבוד עם ה tamplate של autoDelPtr ואז בכלל העבודה נעשית נוחה מאוד.
 
למעלה