البرمجة

تفسير عمل Pointer Arithmetic بعد عملية التحويل في لغة البرمجة C

في هذا الكود، تقوم عملية تحويل النوع (Casting) بتغيير كيفية تفسير البيانات التي يشير إليها المؤشر. يتم إنشاء مصفوفة من أرقام صحيحة قصيرة (short int) بأربع عناصر، حيث يتم تعيين القيم 1 للعناصر الأولى والثانية، و 1 للعنصر الرابع. ثم يتم إنشاء مؤشر من نوع int يشير إلى نفس المكان في الذاكرة الذي يشير إليه المؤشر الأصلي.

عند طباعة قيم المؤشر p والقيمة التي يشير إليها (*p)، يظهر لنا أن *p تساوي 65537. هذا يحدث لأن المتغير a هو مصفوفة من الأعداد الصحيحة القصيرة، وعندما نقوم بتحويل المؤشر إلى int، يتم توسيع الحجم الذي يتعامل معه المؤشر ليشمل 4 بايت بدلاً من 2 بايت. بالتالي، يتم قراءة قيمة 65537 من مكان الذاكرة الذي يشير إليه المؤشر.

أما عند طباعة *(p+1)، فإن هذا يعني أننا نقوم بالتحرك إلى البايت التالي في الذاكرة. ونظرًا لأن الجهاز يعتمد على نظام الترتيب البايتي Little-Endian، فإن القيمة 65536 تظهر كقيمة البايت الأكثر أهمية (Most Significant Byte – MSB) الواقعة في المكان التالي في الذاكرة بعد القيمة 65537.

المزيد من المعلومات

عندما نتحدث عن تحويل أنواع المؤشرات وعمليات الحسابات على المؤشرات في لغة البرمجة C، يصبح من المهم فهم كيفية عمل الذاكرة وكيف يتم تخزين البيانات فيها.

في الكود الخاص بك، تم استخدام مصفوفة من أنواع البيانات القصيرة (short int)، وعندما تقوم بتحويل المؤشر من نوع short int* إلى int*، يتم تغيير كيفية تفسير البيانات التي يشير إليها المؤشر.

مصفوفة a تحتوي على القيم {1، 1، 0، 1}، ولكن القيمة الثالثة هي قيمة افتراضية لأنك لم تعين قيمة لها، ولكن بسبب التهيئة التلقائية في لغة البرمجة C، فإن القيمة الافتراضية تكون صفر.

عندما تقوم بطباعة قيمة المؤشر p وقيمة *(p+1)، يكون لديك:

  1. *p: تعطي قيمة المؤشر p، والتي هي 65537. يحدث ذلك لأن المؤشر يشير إلى عنوان في الذاكرة حيث يبدأ المصفوفة، وتحدث توسيع النوع (casting) ليتم قراءة 4 بايت كـ int.

  2. *(p+1): تعطي قيمة المؤشر p + 1، والتي تشير إلى القيمة التالية في الذاكرة بعد 65537. يكون الناتج 65536. هذا يتم بسبب نظام الترتيب البايتي Little-Endian حيث يتم تخزين البيانات بحيث يكون البايت الأقل في العنوان الأقل.

زر الذهاب إلى الأعلى