עבור לתוכן

מבנים ומצביעים בשפת C

Featured Replies

פורסם

צהריים טובים,

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

אם נתון לי המבנה הבא :

struct complicated
{
char** p;
char arr[7];
};

מה למעשה מציין המצביע P, מה נותנות שתי הכוכביות?

בהמשך לזה אחרי שהוגדר טיפוס חדש כמבנה ישנה גם השורה הבא שאני לא מבין מה היא עושה בעצם:

(&com)->arr[i]=*com.p[e[i]];

com הוא משתנה שהוגדר כמבנה הנתון.

תודה רבה מראש.

פורסם

**char הוא מצביע למצביע ל-char. משתמשים בזה, לדוגמה, כשאתה רוצה להחזיק מערך של מצביעים (נניח, אם אתה רוצה ליצור מערך דו-מימדי של char, כשאתה לא יודע מראש את הגודל שלו).

השורה שאתה שואל לגביה, אז ככה - לגבי אגף שמאל:

אם a הוא מצביע ל-struct מסוים בעל שדה b, אז הביטוי הזה:

a->b

שקול לביטוי הזה:

(*a).b

הפעולה & היא הפעולה ההפוכה לפעולה *, כלומר:

*(&com)

זה פשוט כמו לכתוב com.

הקטע של [arr[i אמור להיות ברור.

אגף ימין:

אפשר להתייחס לכל מצביע בתור מערך, ולהיפך. כלומר, אם יש לך מצביע p, אז הביטוי הזה:

p[i]

שקול לביטוי:

*(p+i)

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

במקרה הזה, com.p פשוט מתייחסים ל-com.p בתור מערך וניגשים לתא שנמצא במקום ה-[e[i שבו.

com.p הוא מערך של מצביעים ל-char, אז אפשר לעשות לערך שבפנים dereference (כלומר להפעיל עליו *).

אני מקווה שעשיו קצת יותר מובן מה השורה עושה.

פורסם
  • מחבר

תודה רבה על העזרה וההסבר.

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

char* d[7]

האם הכוונה היא מערך של מצביעים כפי שאמרת?

ודבר נוסף, אם יש לי את התנאי הזה:

for ( com.p=d, q=b; q< b+7; q++)

איך אפשר להבין את שני הביטויים הראשונים משמאל?

תודה רבה שוב פעם.

פורסם

כן. אפשר להבין את זה כאתחול של מצביע לכתובת של מצביע אחר.

פורסם

אם כבר הועלה נושא על מבנים, אז יש לי שאלה אחרת באותו נושא:

אני צריך לשלוח שני מבנים לפונקציה מסויימת איך עושים זאת מבחינת סינטקס?

פורסם

כמו משתנה רגיל.

פורסם
  • מחבר

ערב טוב,

אני מנסה כבר יומיים לפתור את השאלה שנתנו לי ואני לא מצליח, אני אעלה אותה במלואה ואשמח אם תוכלו לעזור לי בהבנה שלה.

char b[] = {'i', 'o', 'n', 'n', 'm', 'g', 'r'};
int e[] = {4, 1, 6, 2, 0, 3, 5};
char* q;
char* d[7];
int i = 0;
struct complicated
{
char** p;
char arr[7];
};
typedef struct complicated Complicated;
Complicated com;
for (com.p=d, q=b; q < b+7; q++)
{
d[i]=q;
i++;
}
for (i=0; i < 7; i++)
{
(&com)->arr[i]=*com.p[e[i]];
}
הביטוי הינו מצביע, רשמו את מושא הצבעתו, לדוגמה, , בא הבאי הביטויי A כתבו את ער
.&x רישמו ,x- מצביע ל בא
com.arr[4] _______________________
*(&com)->p[3] _______________________
*(q-1) _______________________
?com.arr[] A המער B מהו תוכ

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

למשל, com.arr[4] אמור לקבל את הערך שיש בחלק P של המערך שהוא כביכול מצביע, אבל לכל אורך התוכנית החלק P הזה לא קיבל שום ערך חוץ מבתנאי הראשון וממנו אי אפשר לדעת מהו הערך הזה עצמו..

תודה רבה מראש.

פורסם

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

פורסם
  • מחבר

תודה. הסתדרתי בעזרת הDEBUGER כמו שהצעת..

ארכיון

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

דיונים חדשים