"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > المؤشرات الفارغة في C وC++: لماذا تختلف التحويلات الضمنية؟

المؤشرات الفارغة في C وC++: لماذا تختلف التحويلات الضمنية؟

تم النشر بتاريخ 2024-11-20
تصفح:888

  Void Pointers in C and C  : Why are Implicit Conversions Different?

فهم المؤشرات الفارغة: الاختلافات بين C و C

تعد المؤشرات الفارغة جانبًا رئيسيًا لكل من C و C، ولكن هناك اختلافات ملحوظة في تعاملهم. تستكشف هذه المقالة هذه الاختلافات وتشرح سبب حدوث سلوكيات متناقضة على ما يبدو.

التحويلات الضمنية في C

في لغة C، التحويلات بين مؤشر إلى نوع معين (على سبيل المثال، int) والمؤشر الفارغ (void) دائمًا ما يكونان ضمنيين. هذا يعني أن العبارة التالية صحيحة:

int* p = malloc(sizeof(int));

ترجع الدالة malloc فراغًا*، والذي يتم تعيينه بعد ذلك إلى مؤشر كثافة العمليات *. ومع ذلك، في لغة C، لا يُسمح بمثل هذه التحويلات الضمنية.

التحويل الصريح في لغة C

في لغة C، لا يزال التحويل من مؤشر إلى مؤشر فارغ ضمنيًا، ولكن يتطلب التحويل من مؤشر فارغ إلى نوع معين تحويلًا واضحًا. وهذا ما يفسر سبب تجميع التعليمات البرمجية التالية في كل من C وC:

void foo(void* vptr)
{
}

int main()
{
    int* p = (int*) malloc(sizeof(int));
    foo(p);
    return 0;
}

ترجع الدالة malloc فراغًا*، والذي يتم تمريره إلى الدالة foo. على الرغم من تعيين مؤشر int* للمعلمة void*، إلا أن لغة C تسمح بهذا التحويل الضمني. ومع ذلك، فإن الاستدعاء اللاحق إلى p يتطلب تحويلًا صريحًا إلى النوع int*.

المنظور القياسي

وفقًا لمواصفات K&R2، يمكن لأي مؤشر إلى كائن أن يمكن تحويلها بأمان إلى باطلة* دون فقدان المعلومات. علاوة على ذلك، يؤدي التحويل مرة أخرى إلى نوع المؤشر الأصلي إلى استعادة القيمة الأصلية. في لغة C، يحدد المعيار أن التحويلات الضمنية من أي نوع مؤشر إلى void* مسموح بها، ولكن التحويل الصريح ضروري للتحويلات من void* إلى أي نوع آخر.

الاستنتاج

يكمن الاختلاف الرئيسي بين التعامل مع مؤشر الفراغ C و C في متطلبات الصب الصريح عند التحويل من void* إلى نوع معين في C . يساعد هذا النهج الأكثر صرامة على منع السلوك غير المحدد ويحافظ على أمان النوع في كود C.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3