לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #1  
ישן 05-11-2007, 21:57
  DCD DCD אינו מחובר  
 
חבר מתאריך: 17.05.05
הודעות: 7,321
מצביעים ואופן השימוש בהם

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

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

-------------------------

הקוד הבא אומר שהמשתנה(? או שצריך לקרוא לו מצביע?) p הוא מצביע ל-char:
קוד:
char *p = "Hello World!";


אופן השימוש הוא כזה:

קוד:
*p = "Other string.";

בקוד למעלה, p מצביע עבור סידרת תוים שונה. כלומר שינוי ערכם של ערכי הכתובות בזיכרון ש-p מצביע עליהם.
קוד:
p = 13;

בקוד למעלה, ערכו של p הוא 13, כלומר שהוא מצביע על תא מסוים בזיכרון, שכתובתו היא 13.

קוד:
char *p; char n = "a"; p = &n;

בקוד למעלה, בשורה האחרונה, p מצביע על התוים שהמשתנה n שווה אליהם.

--------

הקוד הבא אומר שהמשתנה p מצביע ל-int:
קוד:
int* p = 57;

כלומר ש-57 זה הכתובת בזיכרון ש-p מאחסן בו (זהו ערכו של p), ויכול להיות שבכתובת זו יש ערך (ואולי גם אין ערך). לא בהכרח יש ערך בכתובת זו.

ואני מניח שאופן השימוש בו הוא כמו שכתבתי למעלה בנוגע ל:
קוד:
char *p = "Hello World!";



בקיצור...התבלגן לי הנושא הזה...מישהו יכול לעשות לי סדר?

תודה רבה!
ערב טוב

נ.ב. אני מבין את כל הנושא של המצביעים. הבעיה היא שאני רק מסתבך בצורה ש-C "משחק" איתם.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #2  
ישן 05-11-2007, 22:13
צלמית המשתמש של דור
  דור דור אינו מחובר  
 
חבר מתאריך: 09.04.02
הודעות: 8,000
בתגובה להודעה מספר 1 שנכתבה על ידי DCD שמתחילה ב "מצביעים ואופן השימוש בהם"

ציטוט:
במקור נכתב על ידי DCD
הקוד הבא אומר שהמשתנה(? או שצריך לקרוא לו מצביע?) p הוא מצביע ל-char:
קוד:
char *p = "Hello World!";

אמת ויציב. שים לב ש-p לא מצביע אל סדרה של כתובות, אלא אל כתובת אחת בלבד, שבה שמור התו הראשון במחרוזת.
ציטוט:
במקור נכתב על ידי DCD
קוד:
p = 13;

בקוד למעלה, ערכו של p הוא 13, כלומר שהוא מצביע על תא מסוים בזיכרון, שכתובתו היא 13.
נכון, אבל אתה לא תוכל לבצע הצבה כזאת במציאות, מכיוון שטווח הזיכרון שמוקצה לתוכנה משתנה מהרצה להרצה. אין לך שום דרך לדעת מה הטווח שהוקצה - הכל מנוהל על ידי מערכת ההפעלה.
ציטוט:
במקור נכתב על ידי DCD
קוד:
char *p; char n = "a"; p = &n;

בקוד למעלה, בשורה האחרונה, p מצביע על התוים שהמשתנה n שווה אליהם.
הקוד הזה לא חוקי ב-C. כשאתה משתמש במרכאות כפולות, אתה מציין מחרוזת - מערך של תוים שמסתיים בתו 0\. אסור לך להציב מחרוזת במשתנה מטיפוס char, משום ש-char הוא בסך הכל מספר בגודל בית אחד. אם היית כותב char * n או []char n, אז היית יכול להציב את המחרוזת בלי בעיות.
ציטוט:
במקור נכתב על ידי DCD
הקוד הבא אומר שהמשתנה p מצביע ל-int:
קוד:
int* p = 57;

כלומר ש-57 זה הכתובת בזיכרון ש-p מאחסן בו (זהו ערכו של p), ויכול להיות שבכתובת זו יש ערך (ואולי גם אין ערך). לא בהכרח יש ערך בכתובת זו.

נכון, אבל שים לב להערה למעלה.

מקווה שהבנת...
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #8  
ישן 06-11-2007, 13:13
  Dark Knight Dark Knight אינו מחובר  
 
חבר מתאריך: 30.07.05
הודעות: 949
שלח הודעה דרך ICQ אל Dark Knight
בתגובה להודעה מספר 7 שנכתבה על ידי DCD שמתחילה ב "נכון כי שניהם מצביעים על אותו..."

אם הקומפיילר יתן לשטות הזו לעבור - וזה אם גדול מאד, ואם במקרה הכתובת של n היא כתובת זוגית\כפולה של 4 אז מה שבעצם יקרה פה הוא שתקרא "מילה" [אוסף של 4 בתים] החל מהכתובת של n, תתורגם כ-unsigned int והערך המתקבל [זבל, ככל הנראה] יוצב ככתובת בפויינטר...

זה ברמה העקרונית...
ברמה המעשית כנראה שכל קומפיילר שמכבד את עצמו יפלוט לך syntax error.
אם לא, אז יש סבירות גבוהה למדי שהתוכנית תעוף על שגיאת odd word address שכן יכול להיות שהמשתנה נמצא במקום בזיכרון שהוא לא כפולה שלמה של אורך מילה (משתנה CHAR למשל).

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

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 07:59

הדף נוצר ב 0.06 שניות עם 12 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר