nullptr
nullptr وnullptr_t: مؤشّر فارغ آمن النوع nullptr
nullptr قيمة جديدة في C23 بنوع مخصّص nullptr_t، تتحوّل تلقائيًا لأي نوع مؤشّر ولا يمكن الخلط بينها وبين عدد صحيح كما يحدث أحيانًا مع NULL.
NULL تقليديًا مجرد ماكرو، غالبًا ((void*)0) أو 0 حسب المكتبة، وهذا يفتح احتمال معاملته كعدد صحيح بالخطأ في بعض السياقات مثل الدوال متغيّرة المعاملات. C23 يضيف nullptr كقيمة أصيلة باللغة من نوع مخصّص nullptr_t، يتحوّل ضمنيًا لأي نوع مؤشّر (بما فيها مؤشّرات الدوال) لكنه ليس عددًا صحيحًا إطلاقًا.
nullptr_t معرّف في stddef.h، وله قيمة صالحة وحيدة هي nullptr نفسها. الفكرة الأساسية: nullptr أوضح نيّة وأكثر أمانًا من NULL في كود C23 الجديد، مع بقاء NULL صالحًا للتوافق مع كود أقدم.
الصياغة
Type *p = nullptr;
📄 مثال
#include <stdio.h>
int main(void) {
int *p = nullptr;
if (p == nullptr) {
printf("المؤشر فارغ\n");
}
return 0;
}أهم النقاط
| العنصر | الوظيفة |
|---|---|
| nullptr | القيمة نفسها — تتحوّل تلقائيًا لأي نوع مؤشّر |
| nullptr_t | نوع nullptr، معرّف في stddef.h |
| NULL | ما زال صالحًا للتوافق، لكن nullptr أوضح وأكثر أمانًا بكود جديد |
💡 نصائح عملية
- فضّل nullptr على NULL بكود C23 جديد لوضوح النيّة وتفادي التباس الأنواع
- قارن المؤشّرات بـ nullptr مباشرة بدل 0 لزيادة وضوح الكود
⚠️ أخطاء شائعة
- تمرير nullptr لدالة variadic قديمة (مثل execl) دون تحويل صريح متى ما احتاج توقيعها ذلك تحديدًا
- الظن أن nullptr يمكن تحويله لعدد صحيح مثل NULL أحيانًا — nullptr ليس رقمًا إطلاقًا
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار C الكامل بالعربي.