المؤشرات الفارغة (Null Pointers)
جزء من قسم Logic & Flow في رحلة C++ على Coddy. الدرس 4 من 56.
عندما تُعلن عن pointer، فإنه لا يشير تلقائيًا إلى أي شيء ذي معنى. يحتوي pointer غير المُهيّأ على عناوين ذاكرة عشوائية، ما قد يؤدي إلى أخطاء خطيرة إذا حاولت استخدامه. وهنا تصبح مؤشرات null ضرورية للبرمجة الآمنة.
المؤشر الفارغ هو مؤشر يشير صراحةً إلى لا شيء. في C++ الحديثة، تنشئ مؤشرًا فارغًا بتهيئته باستخدام nullptr:
int* ptr = nullptr; // ptr أصبح الآن مؤشرًا فارغًاتشير الكلمة المفتاحية nullptr إلى أن المؤشر لا يشير إلى أي موقع ذاكرة صالح. وهذا أكثر أمانًا بكثير من ترك مؤشر من دون تهيئة، لأنه يمكنك التحقق مما إذا كان المؤشر null قبل محاولة إلغاء الإشارة إليه.
قبل استخدام أي pointer، يجب عليك التحقق من أنه ليس null باستخدام عبارة if بسيطة:
if (ptr != nullptr) {
// من الآمن استخدام *ptr هنا
int value = *ptr;
}تمنع هذه الممارسة برنامجك من التعطل بسبب الوصول إلى مواقع ذاكرة غير صالحة. ابدأ دائمًا بتهيئة pointer إلى nullptr عند تعريفها، وcheck بحثًا عن null قبل تنفيذ dereference.
التحدي
سهلأنشئ برنامجًا يوضّح الاستخدام الآمن لـ pointer من خلال التحقق من وجود مؤشرات null قبل إلغاء الإشارة إليها.
سيتم توفير input التالي:
- string ستكون إما
"valid"أو"null"
يجب أن يقوم برنامجك بما يلي:
- Declare متغيرًا صحيحًا named
dataوتهيئته بالقيمة42 - Declare مؤشرًا named
ptr - إذا كانت input هي
"valid"، assign عنوانdataإلىptr - إذا كانت input هي
"null"، assignnullptrإلىptr - استخدم if-statement للتحقق من أن
ptrليس null قبل محاولة استخدامه - إذا لم يكن pointer هو null، اطبع القيمة التي يشير إليها
- إذا كان pointer هو 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-statement للتحقق بأمان واستخدام المؤشر
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1المؤشرات والذاكرة
ما هو المؤشر؟معامل العنوان (Address-Of)معامل الوصول للقيمة (Dereference)المؤشرات الفارغة (Null Pointers)المؤشرات والمصفوفاتالذاكرة الديناميكية باستخدام 'new'تحرير الذاكرة باستخدام 'delete'مراجعة - تمارين على المؤشرات2المتجهات (المصفوفات الديناميكية)
مقدمة إلى std::vectorإنشاء Vectorإضافة العناصرالوصول إلى العناصرحجم الـ Vectorالتكرار باستخدام For Loopالـ Range-Based For Loopإزالة العناصرملخص - عمليات الـ Vectorتدرّب بنفسك: مترجم C++ عبر الإنترنت