עבור לתוכן

עזרה - מצביעים שפת C

Featured Replies

פורסם

שלום,

יש לי שאלה מעבודה שאני לא מבין את הגיון הלוגי מאחורה:

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

השאלה שלי היא בשביל מה צריכים מערך של מצביעים, אם אפשר להשתמש במצביע אחד שכל פעם אני אתן לו את הערך התחלתי של כל מערך וישמור על המספר הגדול בתוך משתנה BIG וכמות הפעמיים במשתנה C_BIG?

ואם אפשר, אני אשמח מאוד לדוגמא של איך משתמשים במערך מסוג פיונטרים (לא הגענו לחומר הזה בשיעור ולא מצאתי באינטרנט שימושים\דוגמאות לשימוש במערכים של מצביעים - למרות שמחר המבחן :s05: ).

תודה רבה

פורסם

הדוגמה שלהם באמת לא כל כך טובה, כי כמו שאמרת אין שום צורך בכלל לשמור את כל הנתונים.

אבל נניח שהחלק בתוכנה שקורא את הנתונים לתוך המערכים יושב בנפרד מהחלק בתוכנה שמנתח אותם (מוציא את המספר הגדול ביותר וכו'). בתוכנה רגילה זה דבר מאוד סביר (ואפילו מומלץ) בסך הכל. אז אתה צריך שתהיה לך פונקציה שיודעת לטפל בכל הנתונים אחרי שהם כבר נקראו. על מנת לקבל את הנתונים הללו, היא צריכה לקבל מערך של מערכים - דהיינו, מערך של מצביעים (להזכירך, מערך הוא בעצמו מצביע).

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

פורסם
  • מחבר

מחיפוש ברשת על מערך של פוינטרים עולה הנושא של הקצאת זיכרון (דינמאי) ע"י פקודה:

c[i]=(int *)malloc(20* sizeof(int));

אשמח מאוד לתירגום הפקודה.

פורסם

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

במקרה שלך אתה יודע (3 מערכים בגודל 5 כל אחד).

פורסם
  • מחבר

אז אני פשוט מגדיר כך:

int a[5],b[5],*pointer[5];

?

פורסם

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

זה צריך להראות משהו כזה:




#define MAT_WIDTH (5)
#define MAT_HEIGHT (3)


void my_func_with_mat_param(int mat_param[][MAT_WIDTH], int size)
{
int i = 0, j = 0;
for (i = 0; i < size; ++i) {
for (j = 0; j < MAT_WIDTH; ++j) {


/* do some more things here */
mat_param[j] = (i + 1) * (j + 1);


}
}
}




int main()
{
int my_arr[MAT_HEIGHT][MAT_WIDTH] = { { 0 } };


/* do things with the matrix
*/


my_func_with_mat_param(my_arr, MAT_HEIGHT);


return 0;
}


פורסם
  • מחבר

אתה בטוח שצריך פה מטריצה?

בנוסף לא ראיתי איכן מערך הפוינטרים מצורף והשימוש בו..

שוב תודה.

פורסם

ההגדרות שקולות:




void func2(int m[][4])


void func(int (*m)[4])

ארכיון

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

דיונים חדשים