שינוי משתנים באמצעות מצביעים
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C של Coddy. שיעור 27 מתוך 63.
עכשיו אפשר לרתום את מלוא העוצמה של מצביעים: שינוי המשתנה המקורי באמצעות פונקציה. כשמעבירים מצביע לפונקציה, הפונקציה יכולה להשתמש באופרטור ביטול ההפניה כדי לשנות את הערך שמאוחסן בכתובת הזיכרון הזאת.
בתוך הפונקציה, מבטלים את ההפניה של המצביע באמצעות האופרטור * כדי לגשת לערך של המשתנה המקורי ולשנות אותו. הטכניקה הזאת נקראת העברה באמצעות הפניה, כי מעבירים הפניה למיקום של המשתנה בזיכרון.
void doubleValue(int *ptr) {
*ptr = *ptr * 2; // בצע דה־רפרנס כדי לשנות את הערך המקורי
}
int main() {
int x = 5;
doubleValue(&x); // העבר את הכתובת של x
// x הוא כעת 10!
return 0;
}המפתח הוא להשתמש ב־*ptr בצד שמאל של ההשמה כדי לשנות את הערך בכתובת הזיכרון שהמצביע מחזיק. כך פונקציות יכולות לשנות באופן קבוע משתנים מהפונקציה הקוראת, מה שפותח אפשרויות תכנות עוצמתיות שהעברה לפי ערך פשוט לא יכולה לאפשר.
אתגר
קלכתבו תוכנית C שמדגימה שינוי משתנים באמצעות מצביעים, על ידי יצירת פונקציה שמשלשת את הערך של מספר שלם.
התוכנית שלכם צריכה:
- ליצור פונקציה בשם
tripleValueשמקבלת מצביע למספר שלם כפרמטר - בתוך הפונקציה
tripleValue, להשתמש באופרטור ביטול ההפניה כדי להכפיל ב־3 את הערך שבכתובת הזיכרון - בתוך הפונקציה
tripleValue, להדפיס את הערך החדש בתבנית:Value tripled to: [value] - בפונקציה
main, להכריז על משתנה של מספר שלם בשםnumberולאתחל אותו לערך 8 - להדפיס את הערך המקורי בתבנית:
Original value: [value] - לקרוא לפונקציה
tripleValueולהעביר אליה את הכתובת של המשתנהnumberבאמצעות אופרטור קבלת הכתובת - לאחר קריאת הפונקציה, להדפיס את הערך הסופי של
numberבתבנית:Final value: [value]
הפלט שלכם צריך להדגים שהפונקציה משנה בהצלחה את המשתנה המקורי באמצעות המצביע:
Original value: 8
Value tripled to: 24
Final value: 24האתגר הזה מדגים את העוצמה של העברה לפי הפניה באמצעות מצביעים, שבה הפונקציה יכולה לשנות לצמיתות את המשתנה המקורי על ידי ביטול ההפניה של המצביע ושינוי הערך במיקום הזיכרון הזה.
נסו בעצמכם
#include <stdio.h>
// TODO: כתבו כאן את הפונקציה tripleValue
int main() {
// TODO: כתבו כאן את הקוד שלכם
// הכריזו על המשתנה number ואתחלו אותו
// הדפיסו את הערך המקורי
// קראו לפונקציה tripleValue
// הדפיסו את הערך הסופי
return 0;
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1יסודות המצביעים
מהו מצביע?הכרזה על מצביעיםאופרטור לקיחת הכתובת (&)אופרטור ביטול ההפניה (*)מצביעי NULLסיכום: יסודות המצביעים2מצביעים ומערכים
שמות מערכים כמצביעיםאיברי מערך ומצביעיםאריתמטיקה של מצביעיםהשוואת מצביעיםסיכום: מעבר על מערך באמצעות מצביעים5מצביעים ופונקציות
העברה לפי ערךהעברת מצביעים לפונקציותשינוי משתנים באמצעות מצביעיםדוגמה קלאסית: החלפההעברת מערכים לפונקציותחזרה: ארגומנטים של מצביעי פונקציה3מערכי תווים ומחרוזות
מחרוזות כמערכי charתו הסיום nullקלט מחרוזת באמצעות scanfשימוש ב־strlen()שימוש ב־strcpy()שימוש ב־strcat()שימוש ב־strcmp()סיכום: פונקציות מחרוזת בסיסיותתרגלו בעצמכם: קומפיילר C אונליין