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