שימוש במצביעים

מדוע נרצה להשתמש בכלל במצביעים? נביט בדוגמא הבאה:

void swap(int x, int y)
{
     int temp = x;
     x = y;
     y = temp;
}


int main()
{
     int x = 5, y = 10;
     printf("%d %d\n", x, y);
     swap(x, y);
     printf("%d %d\n", x, y);
     return 0;
}   

נרצה שעל המסך יודפס בתחילה 5 10, ולאחר מכן יודפס 10 5. בפועל זהו לא המצב. בשני המקרים, גם אחרי וגם לפני הקריאה לפונקציה swap(), יודפס 5 10. הסיבה: אל הפונקציה swap() לא העברנו ממש את המשתנים x, y, אלא את הערכים שלהם, כלומר את המספרים 5,10.

swap() שמה מספרים אלו במשתנים המקומיים שלה, והחליפה ביניהם. לעומת זאת, המשתנים x, y של main() נשארו ללא שינוי.

כיצד נפתור את הבעיה הזו, ונשנה באמת את המשתנים של main() בתוך הפונקציה swap()?

התשובה: בעזרת מצביעים. במקום להעביר לפונקציה swap() את המספרים 5, 10, נעביר אליה את הכתובת של המשתנה x של main(), ואת הכתובת של המשתנה y של main(). בעזרת כתובות אלו, הפונקציה swap() תיגש ישר אל התאים בזיכרון בהם שמורים המשתנים x, y של main() ותשנה את התוכן של תאים אלו. נשנה את התוכנית הקודמת על מנת שבאמת יוחלף התוכן של המשתנים x, y של main():

void swap(int *x, int *y)
{
     int temp = *x;
     *x = *y;
     *y = temp;
}

int main()
{
     int x = 5, y = 10;
     printf("%d %d\n", x, y);
     swap(&x, &y);
     printf("%d %d\n", x, y);
     return 0;
}   



אין תגובות!
שיתוף:
| עוד