מצביעי Null
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C++ של Coddy. שיעור 4 מתוך 56.
כשמכריזים על מצביע, הוא לא מצביע באופן אוטומטי על שום דבר בעל משמעות. מצביע שלא אותחל מכיל כתובות זיכרון אקראיות, והדבר עלול לגרום לשגיאות חמורות אם מנסים להשתמש בו. כאן מצביעי null הופכים לחיוניים לתכנות בטוח.
מצביע null הוא מצביע שמצביע במפורש לשום דבר. ב-C++ מודרנית, יוצרים מצביע null על ידי אתחול שלו באמצעות nullptr:
int* ptr = nullptr; // ptr הוא כעת מצביע nullמילת המפתח nullptr מציינת שהמצביע אינו מצביע על מיקום זיכרון תקין כלשהו. זה בטוח הרבה יותר מהשארת מצביע ללא אתחול, מכיוון שניתן לבדוק אם המצביע הוא null לפני שמנסים לבצע לו dereference.
לפני השימוש במצביע כלשהו, עליך לוודא שהוא אינו null באמצעות משפט if פשוט:
if (ptr != nullptr) {
// בטוח להשתמש כאן ב-*ptr
int value = *ptr;
}תרגול זה מונע מהתוכנית שלך לקרוס עקב גישה למיקומי זיכרון לא תקינים. אתחל תמיד מצביעים ל-nullptr כשאתה מצהיר עליהם, ובדוק שהם אינם null לפני ביצוע הפניה דרך המצביע.
אתגר
קלצרו תוכנית שמדגימה שימוש בטוח במצביעים באמצעות בדיקה שהמצביעים אינם null לפני ביצוע פעולת dereference שלהם.
הקלט הבא יינתן:
- מחרוזת שתהיה
"valid"או"null"
על התוכנית שלכם:
- להכריז על משתנה שלם בשם
dataולאתחל אותו לערך42 - להכריז על מצביע בשם
ptr - אם הקלט הוא
"valid", להקצות ל-ptrאת הכתובת שלdata - אם הקלט הוא
"null", להקצות ל-ptrאתnullptr - להשתמש במשפט if כדי לבדוק ש-
ptrאינו null לפני שמנסים להשתמש בו - אם המצביע אינו null, להדפיס את הערך שאליו הוא מצביע
- אם המצביע הוא null, להדפיס הודעת בטיחות
השתמשו בפורמט הפלט המדויק הבא:
Value: [value]עבור מצביעי null, השתמשו בפורמט הזה:
Pointer is null - cannot dereferenceנסו בעצמכם
#include <iostream>
#include <string>
using namespace std;
int main() {
// קראו את הקלט
string input;
cin >> input;
// הכריזו על המשתנה data
int data = 42;
// TODO: כתבו כאן את הקוד שלכם
// - הכריזו על מצביע בשם ptr
// - בדקו את הקלט והקצו ל-ptr ערך מתאים
// - השתמשו במשפט if כדי לבדוק את המצביע ולהשתמש בו בבטחה
return 0;
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1מצביעים וזיכרון
מהו מצביע?אופרטור קבלת כתובתאופרטור ביטול הפניהמצביעי Nullמצביעים ומערכיםזיכרון דינמי באמצעות 'new'שחרור זיכרון באמצעות 'delete'סיכום — תרגול מצביעים2וקטורים (מערכים דינמיים)
היכרות עם std::vectorיצירת וקטורהוספת איבריםגישה לאיבריםגודל הווקטורמעבר על איברים באמצעות לולאת forלולאת for מבוססת טווחהסרת איבריםסיכום — פעולות על וקטורים5פרויקט: כלי לניהול מלאי
הגדרת הפרויקטהוספה ועדכון של פריטיםתרגלו בעצמכם: קומפיילר C++ אונליין