Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

العمليات الحسابية على المؤشرات

جزء من قسم Logic & Flow في رحلة C على Coddy — الدرس 9 من 63.

لقد تعلمت كيفية الوصول إلى عناصر المصفوفة باستخدام تدوين المؤشرات مثل *(array + i). الآن ستكتشف تقنية أكثر قوة: حسابيات المؤشرات، والتي تتيح لك تحريك المؤشرات عبر الذاكرة باستخدام عمليات الزيادة والنقصان البسيطة.

عندما تقوم بزيادة مؤشر باستخدام ++ أو إنقاصه باستخدام --، فإن المؤشر لا يتحرك بمقدار بايت واحد فقط. بدلاً من ذلك، فإنه يتحرك بمقدار حجم نوع البيانات الذي يشير إليه. بالنسبة لمؤشر عدد صحيح، فإن ptr++ يتحرك للأمام بمقدار sizeof(int) بايت، مما يجعله يستقر تماماً على العدد الصحيح التالي في الذاكرة.

int numbers[5] = {10, 20, 30, 40, 50};
int *ptr = numbers;    // يشير إلى العنصر الأول (10)
ptr++;                 // يشير الآن إلى العنصر الثاني (20)
ptr++;                 // يشير الآن إلى العنصر الثالث (30)

هذا الحساب التلقائي للحجم هو ما يجعل حسابات المؤشرات (pointer arithmetic) قوية ومريحة للغاية. لا داعي للقلق بشأن حسابات البايتات - لغة C تتولى معالجة الذاكرة نيابة عنك بناءً على نوع بيانات المؤشر (pointer's data type).

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

challenge icon

التحدي

سهل

اكتب برنامجاً بلغة C يوضح حسابات المؤشرات (pointer arithmetic) باستخدام عمليات زيادة المؤشر للتنقل ومعالجة مصفوفة. يجب أن يقوم برنامجك بما يلي:

  1. الإعلان عن مصفوفة أعداد صحيحة تسمى data تحتوي على 5 عناصر وتهيئتها بالقيم {12, 24, 36, 48, 60}
  2. الإعلان عن مؤشر لعدد صحيح يسمى ptr وتهيئته ليشير إلى العنصر الأول في المصفوفة
  3. استخدام حلقة for تعمل 5 مرات للتنقل عبر المصفوفة بأكملها باستخدام حسابات المؤشرات فقط
  4. داخل الحلقة:
    • طباعة القيمة الحالية التي يشير إليها ptr باستخدام عامل إلغاء المرجعية (dereference operator)
    • طباعة عنوان الذاكرة المخزن في ptr باستخدام محدد التنسيق %p
    • زيادة المؤشر باستخدام ptr++ للانتقال إلى العنصر التالي
  5. بعد الحلقة، أعد تعيين ptr ليشير مرة أخرى إلى العنصر الأول في المصفوفة
  6. استخدام حسابات المؤشرات للوصول المباشر وطباعة العنصر الثالث (الفهرس 2) باستخدام *(ptr + 2)
  7. استخدام حسابات المؤشرات للوصول المباشر وطباعة العنصر الأخير (الفهرس 4) باستخدام *(ptr + 4)

يجب أن يعرض مخرج البرنامج النتائج بالتنسيق التالي:

Value: 12, Address: [address]
Value: 24, Address: [address]
Value: 36, Address: [address]
Value: 48, Address: [address]
Value: 60, Address: [address]
Third element: 36
Last element: 60

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

ورقة مرجعية

تسمح لك حسابات المؤشرات (Pointer arithmetic) بتحريك المؤشرات عبر الذاكرة باستخدام عمليات الزيادة والنقصان. عندما تقوم بزيادة مؤشر، فإنه يتحرك بمقدار حجم نوع البيانات الذي يشير إليه، وليس بمقدار بايت واحد.

عمليات حسابات المؤشرات الأساسية:

int numbers[5] = {10, 20, 30, 40, 50};
int *ptr = numbers;    // يشير إلى العنصر الأول (10)
ptr++;                 // يشير الآن إلى العنصر الثاني (20)
ptr++;                 // يشير الآن إلى العنصر الثالث (30)

يمكنك أيضاً استخدام حسابات المؤشرات للوصول إلى العناصر عند إزاحات (offsets) محددة:

*(ptr + 2)  // الوصول إلى العنصر عند الإزاحة 2 من الموضع الحالي

تعتبر حسابات المؤشرات مفيدة للتنقل عبر المصفوفات في الحلقات التكرارية، وغالباً ما تؤدي إلى كود أكثر كفاءة من استخدام فهارس المصفوفة.

جرّب بنفسك

#include <stdio.h>

int main() {
    // TODO: اكتب كودك هنا
    // قم بتعريف وتهيئة المصفوفة 'data' بالقيم {12, 24, 36, 48, 60}
    // قم بتعريف المؤشر 'ptr' وتهيئته ليشير إلى العنصر الأول
    // استخدم حلقة for مع حسابات المؤشرات للتنقل عبر المصفوفة
    // اطبع كل قيمة وعنوان، ثم قم بزيادة المؤشر
    // أعد ضبط المؤشر واستخدم حسابات المؤشرات للوصول إلى عناصر محددة
    
    return 0;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow