עבור לתוכן
  • צור חשבון
  • מי אנחנו?

    שלום אורח/ת!

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

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

    לא אוהבים שמציקים לכם במייל? ניתן להירשם לאתר אך לוותר על הרישום לעידכוני המייל השבועיים.

Dolmiti

שפת C - מצביעים

Recommended Posts

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

מישהו יוכל לעזור לי  להסביר מה הקשר בין התכנית לפלט שלה?

char *k[] = {"HOUSE", "FOR", "SHARE", "DEBUG"};
char **kk[] = {k+3, k+2, k+1, k};
char ***kkk=kk;
int main()
{
printf("%s\n", **++kkk);
printf("%s\n", *--*++kkk+3);
printf("%s\n", *kkk[-2]+3);
printf("%s\n", kkk[-1][-1]+1);

return 0;
}

/***********
OUTPUT:

SHARE
SE
UG
OR
**********/

פלט מהתכנית הזאת?

 

שתף דיון


קישור ישיר להודעה
שתף באתרים אחרים

המערך הראשון k הוא מערך של מצביעים. האיבר הראשון במערך מצביע למחרוזת "HELLO", השני למחרוזת "FOR" וכן הלאה.

להזכירך, כל מערך הוא בעצם גם מצביע לאיבר הראשון במערך. ככה ש-k+x הוא בעצם מצביע לאיבר ה-x במערך, או פשוט אותו המערך החל ממקום x (לדוגמה אם [a=[1,2,3,4 אז [a+1=[2,3,4).

תחשוב מכאן מה זה בדיוק kk ולאן האיברים שלו מצביעים, ותמשיך משם.

 

שתף דיון


קישור ישיר להודעה
שתף באתרים אחרים

אוקיי. הצלחתי להבין את 2 ההדפסות הראשונות, אך לא מצליח להבין את 2 האחרונות

אפשר המשך הסבר בבקשה?

נערך על-ידי Dolmiti

שתף דיון


קישור ישיר להודעה
שתף באתרים אחרים

מקווה שהבנתי את ההדפסה השלישית

אבל הריביעית אין לי מושג. איך ייתכן p[-1][-1] במצביע?

שתף דיון


קישור ישיר להודעה
שתף באתרים אחרים

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

 

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

 

כך שלמעשה אחרי השורה הראשונה kkk הוא לא kk אלא kk+1. ואחרי השורה השנייה kkk זה kk+2. ולכן בשורה השלישית [2-]kkk הוא למעשה [0]kk ובשורה הרביעית [1-]kkk הוא [1]kk. משם מקווה שזה ברור.

שתף דיון


קישור ישיר להודעה
שתף באתרים אחרים

הצטרפ/י לדיון

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

אורח
הוסף תגובה

×   התוכן שהודבק הוא עם עיצוב.   הסר עיצוב

  Only 75 emoji are allowed.

×   הקישור שלך הוטמע אוטומטית.   הצג כקישור רגיל

×   התוכן הקודם שלך שוחזר אוטומטית.   נקה הכל

×   You cannot paste images directly. Upload or insert images from URL.


×
  • צור חדש...
Back to top button
Close