שפת C - מצביעים - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

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


Dolmiti

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 ולאן האיברים שלו מצביעים, ותמשיך משם.

 

קישור לתוכן
שתף באתרים אחרים

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

 

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

 

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

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...