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

reinterpret_cast

إعادة تفسير البتّات reinterpret_cast

reinterpret_cast يعيد تفسير نمط بتّات الذاكرة كنوع مختلف تمامًا بلا أي علاقة منطقية — الأخطر والأقل أمانًا من بين عوامل التحويل، ومخصّص لحالات منخفضة المستوى فقط.

على عكس static_cast، لا يوجد أي منطق تحويل حقيقي هنا — فقط إعادة تسمية لنفس البتّات كنوع آخر (مؤشّر إلى عدد صحيح، أو مؤشّر لنوع إلى مؤشّر لنوع غير مرتبط إطلاقًا). النتيجة قابلة للاستخدام بأمان فقط بإعادة تحويلها لنوعها الأصلي مجددًا؛ أي استخدام آخر غير مضمون النقل بين مترجمات مختلفة. لا يمكنه إزالة const أو volatile — ذلك عمل const_cast حصرًا.

الصياغة

TargetType* p = reinterpret_cast<TargetType*>(sourcePtr);
uintptr_t addr = reinterpret_cast<uintptr_t>(ptr);

📄 مثال

int value = 65;
int* p = &value;

// مؤشّر إلى عدد صحيح — مفيد لدوال تجزئة (hashing) منخفضة المستوى
uintptr_t address = reinterpret_cast<uintptr_t>(p);

// تحويل بين نوعي مؤشّرات غير مرتبطين — خطر ويستخدم بحذر شديد فقط
char* bytes = reinterpret_cast<char*>(p);

أهم النقاط

العنصرالوظيفة
مؤشّر ↔ عدد صحيحالاستخدام الأشيع — hashing أو طباعة عنوان الذاكرة
مؤشّر ↔ مؤشّر غير مرتبطبلا أي تحقّق من التوافق — خطر حقيقي
لا يزيل constيفشل ترجمة لو حاولت إزالة const عبره — استخدم const_cast لذلك

💡 نصائح عملية

  • اعتبره الملاذ الأخير — لو تحتاجه بكود عادي (غير أنظمة/شبكات/تشفير)، هذا مؤشّر على مشكلة تصميم أعمق
  • النتيجة موثوقة فقط لو أعدت تحويلها لنوعها الأصلي لاحقًا — أي استخدام آخر غير مضمون

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

  • استخدامه لتفادي خطأ نوع بدل فهم سببه وإصلاح التصميم
  • الاعتماد على تمثيل بتّات معيّن يفترض بنية ذاكرة محدّدة — قد يختلف بين مترجم وآخر أو معمارية وأخرى

خصائص ذات صلة

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