المؤشرات الفارغة (Null Pointers)
جزء من قسم Logic & Flow في رحلة C++ على Coddy — الدرس 4 من 56.
عندما تقوم بالتصريح عن مؤشر (pointer)، فإنه لا يشير تلقائياً إلى أي شيء ذي معنى. يحتوي المؤشر غير المهيأ (uninitialized pointer) على عناوين ذاكرة عشوائية، مما قد يؤدي إلى أخطاء جسيمة إذا حاولت استخدامه. هنا تصبح المؤشرات الفارغة (null pointers) ضرورية للبرمجة الآمنة.
المؤشر الفارغ (null pointer) هو مؤشر يشير صراحةً إلى لا شيء. في لغة ++C الحديثة، يمكنك إنشاء مؤشر فارغ عن طريق تهيئته بـ nullptr:
int* ptr = nullptr; // ptr هو الآن مؤشر فارغتشير الكلمة الرئيسية nullptr إلى أن المؤشر لا يشير إلى أي موقع ذاكرة صالح. وهذا أكثر أماناً بكثير من ترك المؤشر غير مهيأ، لأنه يمكنك التحقق مما إذا كان المؤشر فارغاً قبل محاولة إلغاء الإسناد (dereference) الخاص به.
قبل استخدام أي مؤشر، يجب عليك التحقق من أنه ليس فارغاً (null) باستخدام جملة if بسيطة:
if (ptr != nullptr) {
// من الآمن استخدام *ptr هنا
int value = *ptr;
}تمنع هذه الممارسة برنامجك من الانهيار بسبب الوصول إلى مواقع ذاكرة غير صالحة. قم دائمًا بتهيئة المؤشرات إلى nullptr عند التصريح عنها، والتحقق من القيمة الفارغة (null) قبل إلغاء المرجعية (dereferencing).
التحدي
سهلقم بإنشاء برنامج يوضح الاستخدام الآمن للمؤشرات (pointers) من خلال التحقق من المؤشرات الفارغة (null pointers) قبل إلغاء مرجعيتها (dereferencing).
سيتم توفير المدخلات التالية:
- سلسلة نصية ستكون إما
"valid"أو"null"
يجب أن يقوم برنامجك بما يلي:
- الإعلان عن متغير صحيح (integer) باسم
dataوتهيئته بالقيمة42 - الإعلان عن مؤشر باسم
ptr - إذا كانت المدخلات
"valid"، فقم بتعيين عنوانdataإلىptr - إذا كانت المدخلات
"null"، فقم بتعيينnullptrإلىptr - استخدم جملة if للتحقق مما إذا كان
ptrليس فارغاً قبل محاولة استخدامه - إذا لم يكن المؤشر فارغاً، فقم بطباعة القيمة التي يشير إليها
- إذا كان المؤشر فارغاً، فقم بطباعة رسالة أمان
استخدم تنسيق المخرجات الدقيق التالي:
Value: [value]بالنسبة للمؤشرات الفارغة، استخدم هذا التنسيق:
Pointer is null - cannot dereferenceورقة مرجعية
قم بتهيئة المؤشرات إلى nullptr لتجنب السلوك غير المحدد:
int* ptr = nullptr; // ptr هو الآن مؤشر فارغتحقق دائماً مما إذا كان المؤشر ليس فارغاً قبل إلغاء المرجعية (dereferencing):
if (ptr != nullptr) {
// من الآمن استخدام *ptr هنا
int value = *ptr;
}تشير الكلمة المفتاحية nullptr صراحةً إلى أن المؤشر لا يشير إلى أي موقع ذاكرة صالح، مما يجعل الكود الخاص بك أكثر أماناً ويمنع الانهيارات الناتجة عن الوصول إلى ذاكرة غير صالحة.
جرّب بنفسك
#include <iostream>
#include <string>
using namespace std;
int main() {
// قراءة المدخلات
string input;
cin >> input;
// التصريح عن متغير البيانات
int data = 42;
// TODO: اكتب كودك هنا
// - التصريح عن مؤشر باسم ptr
// - التحقق من المدخلات وتعيين القيمة المناسبة لـ ptr
// - استخدام جملة if للتحقق من المؤشر واستخدامه بأمان
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1المؤشرات والذاكرة
ما هو المؤشر؟معامل العنوان (Address-Of)معامل الوصول للقيمة (Dereference)المؤشرات الفارغة (Null Pointers)المؤشرات والمصفوفاتالذاكرة الديناميكية باستخدام 'new'تحرير الذاكرة باستخدام 'delete'مراجعة - تمارين على المؤشرات2المتجهات (المصفوفات الديناميكية)
مقدمة إلى std::vectorإنشاء Vectorإضافة العناصرالوصول إلى العناصرحجم الـ Vectorالتكرار باستخدام For Loopالـ Range-Based For Loopإزالة العناصرملخص - عمليات الـ Vector