عناصر المصفوفة - المؤشرات
جزء من قسم Logic & Flow في رحلة C على Coddy — الدرس 8 من 63.
الآن بعد أن فهمت كيف تعمل أسماء المصفوفات كمؤشرات، يمكنك استخدام هذه المعرفة للوصول إلى عناصر المصفوفة بطريقة مختلفة تمامًا. بدلاً من استخدام تدوين الأقواس المألوف مثل array[i]، يمكنك استخدام تدوين المؤشرات لتحقيق نفس النتيجة.
الفكرة الجوهرية هي أن array[i] يعادل تماماً *(array + i). عندما تكتب array + i، فإنك تخبر لغة C بالتحرك i من المواقع للأمام من بداية المصفوفة. عامل إلغاء المرجعية * يحصل بعد ذلك على القيمة الموجودة في ذلك الموقع.
int numbers[5] = {10, 20, 30, 40, 50};
// هذان السطران يقومان بنفس الشيء تماماً:
printf("%d", numbers[2]); // يطبع 30
printf("%d", *(numbers + 2)); // يطبع 30 أيضاًتعمل طريقة تدوين المؤشر هذه لأن لغة C تحسب تلقائيًا عنوان الذاكرة الصحيح بناءً على حجم نوع البيانات. فعندما تضيف 2 إلى مؤشر مصفوفة أعداد صحيحة (integer array pointer)، تتحرك لغة C للأمام بمقدار 2 × sizeof(int) بايت، لتصل تمامًا إلى العنصر الثالث.
فهم هذا التكافؤ يمنحك مرونة في كيفية التعامل مع المصفوفات ويهيئك لتقنيات المؤشرات الأكثر تقدماً التي ستواجهها أثناء استمرارك في تعلم لغة C.
التحدي
سهلاكتب برنامجاً بلغة C يوضح كيفية الوصول إلى عناصر المصفوفة باستخدام تدوين المؤشر (pointer notation) بدلاً من فهرسة المصفوفة التقليدية. يجب أن يقوم برنامجك بما يلي:
- الإعلان عن مصفوفة أعداد صحيحة تسمى
valuesتحتوي على 6 عناصر وتهيئتها بالقيم {5, 15, 25, 35, 45, 55} - استخدام حلقة for للتكرار عبر جميع عناصر المصفوفة
- داخل الحلقة، استخدم تدوين المؤشر
*(values + i)للوصول إلى كل عنصر (لا تستخدم تدوين الأقواس مثلvalues[i]) - طباعة كل عنصر باستخدام طريقة الوصول بتدوين المؤشر
- بعد الحلقة، قم بإثبات التكافؤ عن طريق طباعة العنصر الثالث (الفهرس 2) باستخدام الطريقتين:
- أولاً باستخدام تدوين المؤشر:
*(values + 2) - ثم باستخدام تدوين المصفوفة التقليدي:
values[2]
- أولاً باستخدام تدوين المؤشر:
يجب أن يعرض مخرجك النتائج بالتنسيق التالي:
Element 0: 5
Element 1: 15
Element 2: 25
Element 3: 35
Element 4: 45
Element 5: 55
Third element via pointer: 25
Third element via array: 25يختبر هذا التحدي فهمك للتكافؤ بين array[i] و *(array + i)، موضحاً كيف يتيح لك حساب المؤشرات (pointer arithmetic) الوصول إلى عناصر المصفوفة باستخدام حسابات عناوين الذاكرة بدلاً من الفهرسة التقليدية.
ورقة مرجعية
يمكن الوصول إلى عناصر المصفوفة باستخدام ترميز المؤشر بدلاً من ترميز الأقواس. التعبير array[i] يكافئ *(array + i).
عندما تكتب array + i، تتحرك لغة C بمقدار i من المواقع للأمام من بداية المصفوفة. يقوم عامل إلغاء المرجعية * بالحصول على القيمة في ذلك الموقع.
int numbers[5] = {10, 20, 30, 40, 50};
// هذان السطران يفعلان الشيء نفسه تماماً:
printf("%d", numbers[2]); // يطبع 30
printf("%d", *(numbers + 2)); // يطبع 30 أيضاًتقوم لغة C تلقائياً بحساب عنوان الذاكرة الصحيح بناءً على حجم نوع البيانات. إضافة 2 إلى مؤشر مصفوفة أعداد صحيحة يؤدي إلى التحرك للأمام بمقدار 2 × sizeof(int) بايت.
جرّب بنفسك
#include <stdio.h>
int main() {
// TODO: اكتب كودك هنا
// قم بتعريف وتهيئة المصفوفة 'values' بـ 6 عناصر
// استخدم حلقة for لطباعة كل عنصر باستخدام تدوين المؤشر *(values + i)
// بعد الحلقة، اطبع العنصر الثالث باستخدام كل من تدوين المؤشر وتدوين المصفوفة
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1أساسيات المؤشرات
ما هو المؤشر؟الإعلان عن المؤشراتعامل العنوان (&)عامل إلغاء المرجعية (*)مؤشرات NULLمراجعة: أساسيات المؤشرات4مشروع: أداة نصوص بسيطة
نظرة عامة على المشروععد الأحرف2المؤشرات والمصفوفات
أسماء المصفوفات كمؤشراتعناصر المصفوفة - المؤشراتالعمليات الحسابية على المؤشراتمقارنة المؤشراتمراجعة: التنقل في المصفوفة باستخدام المؤشرات5المؤشرات والدوال
التمرير بالقيمةتمرير المؤشرات إلى الدوالتعديل المتغيرات عبر المؤشراتمثال كلاسيكي: التبديلتمرير المصفوفات إلى الدوالملخص: وسائط المؤشرات في الدوال8الهياكل والمؤشرات
المؤشرات إلى الهياكلعامل السهم (->)تمرير الهياكل بالقيمةتمرير مؤشرات الهياكلالتخصيص الديناميكي للهياكلمراجعة: تعديل الهياكل باستخدام المؤشرات11تحديات المراجعة النهائية
مراجعة: دمج السلاسل النصية الديناميكيمراجعة: مصفوفة من الـ Structsمراجعة: عداد تكرار الكلمات3مصفوفات الأحرف والسلاسل النصية
السلاسل النصية كمصفوفات charالمُنهي الصفري (Null Terminator)إدخال السلاسل النصية باستخدام scanfاستخدام strlen()استخدام strcpy()استخدام strcat()استخدام strcmp()مراجعة: دوال السلاسل النصية الأساسية