עבור לתוכן

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

Featured Replies

פורסם

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

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

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 האחרונות

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

פורסם
  • מחבר

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

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

פורסם

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

 

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

 

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

פורסם
  • מחבר

אחלה עכשיו הבנתי תודה רבה

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים