تخطَّ إلى المحتوى

& vs *

المراجع مقابل المؤشّرات & vs *

المرجع (Type&) اسم مستعار لمتغيّر موجود لا يمكن أن يكون فارغًا ولا يُعاد ربطه، بينما المؤشّر (Type*) عنوان ذاكرة يمكن أن يكون nullptr ويُعاد توجيهه.

كلاهما يسمح بالوصول لمتغيّر دون نسخه، لكن الفروقات الجوهرية تحدد متى تستخدم كل واحد: المرجع يجب تهيئته فور إعلانه ولا يمكن أن يشير لاحقًا لمتغيّر آخر (يبقى اسمًا مستعارًا لنفس المتغيّر طوال حياته)، ولا وجود لـ«مرجع فارغ». المؤشّر أكثر مرونة: يمكن أن يكون nullptr، ويمكن إعادة توجيهه لمتغيّر آخر، ويحتاج * لإلغاء الإشارة صراحة.

القاعدة العملية: استخدم المراجع (خصوصًا const T&) لمعاملات الدوال افتراضيًا لأنها أوضح وأأمن، واستخدم المؤشّرات فقط لما تحتاج فعليًا القدرة على تمثيل «لا شيء» (nullptr) أو إعادة التوجيه لاحقًا.

الصياغة

Type& ref = variable;   // مرجع
Type* ptr = &variable;  // مؤشّر

📄 مثال

int x = 10;
int& ref = x;   // اسم مستعار لـ x نفسه
int* ptr = &x;  // عنوان x

ref = 20;       // x أصبح 20 أيضًا
*ptr = 30;      // x أصبح 30 أيضًا

ptr = nullptr;  // مسموح — المؤشّر يمكن أن يكون فارغًا
// ref لا يمكن أبدًا أن تصبح nullptr أو تشير لمتغيّر آخر

أهم النقاط

العنصرالوظيفة
Type& (مرجع)اسم مستعار إلزامي التهيئة، لا يمكن أن يكون فارغًا أو يُعاد ربطه
Type* (مؤشّر)عنوان ذاكرة صريح، يمكن أن يكون nullptr ويُعاد توجيهه
const Type&الخيار الافتراضي الموصى به لمعاملات الدوال — بلا نسخ وبلا تعديل

💡 نصائح عملية

  • مرّر الكائنات بمعاملات const T& افتراضيًا؛ استخدم T* فقط إن احتجت تمثيل غياب القيمة (nullptr) صراحة
  • استخدم T& (بدون const) فقط لما تنوي تعديل المتغيّر الأصلي فعليًا من داخل الدالة

⚠️ أخطاء شائعة

  • نسيان تهيئة مرجع فور إعلانه — خطأ ترجمة إلزامي، بعكس المؤشّر الذي يمكن تركه nullptr مؤقتًا
  • عدم التحقق من nullptr قبل إلغاء إشارة مؤشّر (*ptr) — سلوك غير معرَّف يسبب أعطالًا مباشرة

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CPP الكامل بالعربي.