أسماء المصفوفات كمؤشرات
جزء من قسم Logic & Flow في رحلة C على Coddy — الدرس 7 من 63.
المصفوفات والمؤشرات في لغة C لها علاقة خاصة تعد أساسية لفهم كيفية تعامل لغة C مع البيانات في الذاكرة. عندما تقوم بالتصريح عن مصفوفة، يعمل اسم المصفوفة نفسه كـ مؤشر ثابت للعنصر الأول في المصفوفة.
هذا يعني أنه عندما يكون لديك مصفوفة مثل int numbers[5];، فإن الاسم numbers هو في الأساس مؤشر يشير دائماً إلى numbers[0]. يمكنك التفكير في اسم المصفوفة كمؤشر مدمج لا تحتاج إلى التصريح عنه بشكل منفصل.
int numbers[5] = {10, 20, 30, 40, 50};
// 'numbers' يشير إلى العنصر الأول
// numbers == &numbers[0] // هذه متكافئة!هذا التكافؤ أمر بالغ الأهمية: numbers و &numbers[0] كلاهما يعطيك نفس عنوان الذاكرة تماماً. اسم المصفوفة هو مجرد طريقة أكثر ملاءمة للإشارة إلى عنوان العنصر الأول دون الحاجة إلى استخدام عامل العنوان (address-of operator).
إن فهم هذه العلاقة يفتح الباب لاستخدام تقنيات المؤشرات (pointer techniques) مع المصفوفات، مما قد يجعل الكود الخاص بك أكثر مرونة وكفاءة. الفرق الجوهري هو أنه على عكس المؤشرات العادية، فإن أسماء المصفوفات هي مؤشرات ثابتة - لا يمكنك تغيير ما تشير إليه.
التحدي
سهلاكتب برنامج بلغة C يوضح التكافؤ بين أسماء المصفوفات والمؤشرات إلى عناصرها الأولى. يجب أن يقوم برنامجك بما يلي:
- التصريح عن مصفوفة أعداد صحيحة تسمى
numbersتحتوي على 4 عناصر وتهيئتها بالقيم {10, 20, 30, 40} - التصريح عن مؤشر لعدد صحيح يسمى
ptr - تعيين اسم المصفوفة
numbersللمؤشرptr - طباعة العنوان المخزن في
numbersباستخدامprintfمع محدد التنسيق%p - طباعة عنوان العنصر الأول
&numbers[0]باستخدامprintfمع محدد التنسيق%p - طباعة العنوان المخزن في
ptrباستخدامprintfمع محدد التنسيق%p - طباعة قيمة العنصر الأول باستخدام اسم المصفوفة:
*numbers - طباعة قيمة العنصر الأول باستخدام المؤشر:
*ptr
يجب أن يعرض مخرجك النتائج بالتنسيق التالي:
Array name address: [address]
First element address: [address]
Pointer address: [address]
Value via array name: 10
Value via pointer: 10يوضح هذا التحدي أن اسم المصفوفة يعمل كمؤشر ثابت للعنصر الأول، وأن numbers و &numbers[0] و ptr جميعها تحتوي على نفس عنوان الذاكرة عندما يتم تعيين اسم المصفوفة لـ ptr.
ورقة مرجعية
تعمل أسماء المصفوفات في لغة C كـ مؤشرات ثابتة (constant pointers) للعنصر الأول في المصفوفة.
عندما تقوم بالتصريح عن مصفوفة، يشير اسم المصفوفة إلى العنصر الأول:
int numbers[5] = {10, 20, 30, 40, 50};
// يشير 'numbers' إلى العنصر الأول
// numbers == &numbers[0] // هذه متكافئة!يمكنك تعيين اسم مصفوفة لمؤشر:
int *ptr;
ptr = numbers; // يشير ptr الآن إلى العنصر الأولالوصول إلى القيم باستخدام تدوين المؤشر (pointer notation):
*numbers // قيمة العنصر الأول عبر اسم المصفوفة
*ptr // قيمة العنصر الأول عبر المؤشرالفرق الرئيسي: أسماء المصفوفات هي مؤشرات ثابتة - لا يمكنك تغيير ما تشير إليه، على عكس المؤشرات العادية.
جرّب بنفسك
#include <stdio.h>
int main() {
// مهام: اكتب الكود الخاص بك هنا
// 1. قم بتعريف وتهيئة المصفوفة 'numbers' بالقيم {10, 20, 30, 40}
// 2. قم بتعريف مؤشر لنوع صحيح (integer) باسم 'ptr'
// 3. قم بتعيين اسم المصفوفة للمؤشر
// 4. اطبع جميع العناوين والقيم المطلوبة
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1أساسيات المؤشرات
ما هو المؤشر؟الإعلان عن المؤشراتعامل العنوان (&)عامل إلغاء المرجعية (*)مؤشرات NULLمراجعة: أساسيات المؤشرات4مشروع: أداة نصوص بسيطة
نظرة عامة على المشروععد الأحرف2المؤشرات والمصفوفات
أسماء المصفوفات كمؤشراتعناصر المصفوفة - المؤشراتالعمليات الحسابية على المؤشراتمقارنة المؤشراتمراجعة: التنقل في المصفوفة باستخدام المؤشرات5المؤشرات والدوال
التمرير بالقيمةتمرير المؤشرات إلى الدوالتعديل المتغيرات عبر المؤشراتمثال كلاسيكي: التبديلتمرير المصفوفات إلى الدوالملخص: وسائط المؤشرات في الدوال8الهياكل والمؤشرات
المؤشرات إلى الهياكلعامل السهم (->)تمرير الهياكل بالقيمةتمرير مؤشرات الهياكلالتخصيص الديناميكي للهياكلمراجعة: تعديل الهياكل باستخدام المؤشرات11تحديات المراجعة النهائية
مراجعة: دمج السلاسل النصية الديناميكيمراجعة: مصفوفة من الـ Structsمراجعة: عداد تكرار الكلمات3مصفوفات الأحرف والسلاسل النصية
السلاسل النصية كمصفوفات charالمُنهي الصفري (Null Terminator)إدخال السلاسل النصية باستخدام scanfاستخدام strlen()استخدام strcpy()استخدام strcat()استخدام strcmp()مراجعة: دوال السلاسل النصية الأساسية