דוגמה קלאסית: החלפה
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C של Coddy. שיעור 28 מתוך 63.
פונקציית ההחלפה היא אחת הדוגמאות המפורסמות ביותר שמדגימה מדוע מצביעים חיוניים בתכנות ב-C. המטרה פשוטה: לכתוב פונקציה שמחליפה בין הערכים של שני משתנים. עם זאת, המשימה שנראית פשוטה לכאורה חושפת מגבלה בסיסית של העברה לפי ערך.
חשבו מה קורה אם מנסים להחליף בין שני משתנים באמצעות העברה רגילה לפי ערך:
void badSwap(int a, int b) {
int temp = a;
a = b;
b = temp;
// זה מחליף רק את העותקים, לא את המשתנים המקוריים!
}הגישה הזו נכשלת מפני שהפונקציה מקבלת רק עותקים של הערכים. המשתנים המקוריים בפונקציה הקוראת נשארים ללא שינוי.
הפתרון דורש להעביר במקום זאת מצביעים למשתנים:
void swap(int *a, int *b) {
int temp = *a; // שמור את הערך שבכתובת a
*a = *b; // הכנס את הערך מכתובת b לכתובת a
*b = temp; // הכנס את הערך שנשמר לכתובת b
}על ידי העברת הכתובות של המשתנים ושימוש באופרטור ביטול ההפניה, הפונקציה יכולה לשנות ישירות את הערכים של המשתנים המקוריים. כך פונקציית ההחלפה ממחישה היטב מתי ולמה צריך מצביעים כדי לבצע משימות שהעברה לפי ערך פשוט לא יכולה להתמודד איתן.
אתגר
קלכתוב תוכנית C שמממשת ומדגימה את פונקציית ההחלפה הקלאסית באמצעות מצביעים. התוכנית שלך צריכה:
- ליצור פונקציה בשם
swapשמקבלת שני מצביעים למספרים שלמים כפרמטרים - בתוך הפונקציה
swap, להחליף את הערכים בכתובות הזיכרון שאליהן מצביעים שני המצביעים, באמצעות משתנה זמני - בפונקציה
main, לקרוא שני מספרים שלמים מקלט המשתמש - להדפיס את הערכים המקוריים בתבנית:
Before swap: a = [value], b = [value] - לקרוא לפונקציה
swapולהעביר את הכתובות של שני המשתנים באמצעות אופרטור קבלת הכתובת - לאחר קריאת הפונקציה, להדפיס את הערכים שהוחלפו בתבנית:
After swap: a = [value], b = [value]
הפלט שלך צריך להדגים שהפונקציה מחליפה בהצלחה את הערכים של המשתנים המקוריים:
Before swap: a = [first_input], b = [second_input]
After swap: a = [second_input], b = [first_input]האתגר הזה מדגים מדוע מצביעים חיוניים לפעולת ההחלפה — הפונקציה חייבת לגשת למיקומי הזיכרון של המשתנים המקוריים כדי להחליף את ערכיהם לצמיתות, דבר שאינו אפשרי בהעברה לפי ערך.
נסו בעצמכם
#include <stdio.h>
// TODO: כתבו כאן את פונקציית ההחלפה שלכם
int main() {
int a, b;
// קראו קלט
scanf("%d", &a);
scanf("%d", &b);
// הדפיסו את הערכים המקוריים
printf("Before swap: a = %d, b = %d\n", a, b);
// TODO: קראו כאן לפונקציית ההחלפה שלכם
// הדפיסו את הערכים לאחר ההחלפה
printf("After swap: a = %d, b = %d\n", a, b);
return 0;
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1יסודות המצביעים
מהו מצביע?הכרזה על מצביעיםאופרטור לקיחת הכתובת (&)אופרטור ביטול ההפניה (*)מצביעי NULLסיכום: יסודות המצביעים2מצביעים ומערכים
שמות מערכים כמצביעיםאיברי מערך ומצביעיםאריתמטיקה של מצביעיםהשוואת מצביעיםסיכום: מעבר על מערך באמצעות מצביעים5מצביעים ופונקציות
העברה לפי ערךהעברת מצביעים לפונקציותשינוי משתנים באמצעות מצביעיםדוגמה קלאסית: החלפההעברת מערכים לפונקציותחזרה: ארגומנטים של מצביעי פונקציה3מערכי תווים ומחרוזות
מחרוזות כמערכי charתו הסיום nullקלט מחרוזת באמצעות scanfשימוש ב־strlen()שימוש ב־strcpy()שימוש ב־strcat()שימוש ב־strcmp()סיכום: פונקציות מחרוזת בסיסיותתרגלו בעצמכם: קומפיילר C אונליין