פורסם 2018 בפברואר 217 שנים ניסיתי להבין את מבנה הזיכרון, ההצבעות והפלט אך ללא הצלחה. מישהו יוכל לעזור לי להסביר מה הקשר בין התכנית לפלט שלה? 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 **********/ פלט מהתכנית הזאת?
פורסם 2018 בפברואר 227 שנים המערך הראשון k הוא מערך של מצביעים. האיבר הראשון במערך מצביע למחרוזת "HELLO", השני למחרוזת "FOR" וכן הלאה. להזכירך, כל מערך הוא בעצם גם מצביע לאיבר הראשון במערך. ככה ש-k+x הוא בעצם מצביע לאיבר ה-x במערך, או פשוט אותו המערך החל ממקום x (לדוגמה אם [a=[1,2,3,4 אז [a+1=[2,3,4). תחשוב מכאן מה זה בדיוק kk ולאן האיברים שלו מצביעים, ותמשיך משם.
פורסם 2018 בפברואר 227 שנים מחבר אוקיי. הצלחתי להבין את 2 ההדפסות הראשונות, אך לא מצליח להבין את 2 האחרונות אפשר המשך הסבר בבקשה? נערך 2018 בפברואר 227 שנים על-ידי Dolmiti
פורסם 2018 בפברואר 227 שנים מחבר מקווה שהבנתי את ההדפסה השלישית אבל הריביעית אין לי מושג. איך ייתכן p[-1][-1] במצביע?
פורסם 2018 בפברואר 247 שנים למרות שאני לא אוהב תרגילים כאלה, כי לפעמים הם נראים יותר כמו תרגילים בסדר עדיפות של אופרטורים ולא באמת תרגילים במבנה זכרון, יש פה הגיון שאחרי שאתה מבין אותו די קל להכליל אותו לתרגילים הבאים. הנקודה שקל להתעלם ממנה פה היא שהפעולה kkk++ משנה את ערך המצביע kkk. לכן השורות אינן בלתי תלויות והסדר שלהן משנה. אם הן היו נתונות לך בסדר שונה, גם ההדפסות היו שונות והיית יכול גם לקבל התרסקות. כך שלמעשה אחרי השורה הראשונה kkk הוא לא kk אלא kk+1. ואחרי השורה השנייה kkk זה kk+2. ולכן בשורה השלישית [2-]kkk הוא למעשה [0]kk ובשורה הרביעית [1-]kkk הוא [1]kk. משם מקווה שזה ברור.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.