أسماء المصفوفات كمؤشرات
جزء من قسم المنطق وتدفق التنفيذ في رحلة C على Coddy. الدرس 7 من 63.
تتمتع المصفوفات والمؤشرات في C بعلاقة خاصة تُعد أساسية لفهم كيفية تعامل C مع البيانات في الذاكرة. عند Declare مصفوفة، يعمل اسم array نفسه كـ مؤشر pointer ثابت إلى العنصر first في array.
هذا يعني أنه عندما يكون لديك مصفوفة مثل int numbers[5];، فإن الاسم numbers هو في الأساس مؤشّر يشير دائمًا إلى numbers[0]. يمكنك التفكير في اسم المصفوفة على أنه مؤشّر مضمّن لا تحتاج إلى تعريفه بشكل منفصل.
int numbers[5] = {10, 20, 30, 40, 50};
// 'numbers' points to the first element
// numbers == &numbers[0] // هذه متكافئة!هذا التكافؤ بالغ الأهمية: يمنحك كلٌّ من numbers و&numbers[0] عنوان الذاكرة نفسه تمامًا. اسم المصفوفة هو مجرد طريقة أكثر ملاءمة للإشارة إلى عنوان العنصر first دون الحاجة إلى استخدام عامل الحصول على العنوان.
إن فهم هذه العلاقة يفتح الباب أمام استخدام تقنيات pointer مع array، مما قد يجعل شفرتك أكثر مرونة وكفاءة. والفرق الرئيسي هو أنه، بخلاف pointer العادية، فإن أسماء array هي pointer ثابتة - ولا يمكنك تغيير ما تشير إليه.
التحدي
سهلاكتب برنامجًا بلغة 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.
جرّب بنفسك
#include <stdio.h>
int main() {
// TODO: اكتب الكود الخاص بك هنا
// 1. أعلن ومهّئ المصفوفة 'numbers' بـ {10, 20, 30, 40}
// 2. أعلن عن مؤشر إلى عدد صحيح باسم 'ptr'
// 3. عيّن اسم المصفوفة إلى المؤشر
// 4. اطبع جميع العناوين والقيم المطلوبة
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق التنفيذ
1أساسيات المؤشرات
ما هو المؤشر؟الإعلان عن المؤشراتعامل العنوان (&)عامل إلغاء المرجعية (*)مؤشرات NULLمراجعة: أساسيات المؤشرات4مشروع: أداة نصوص بسيطة
نظرة عامة على المشروععد الأحرف2المؤشرات والمصفوفات
أسماء المصفوفات كمؤشراتعناصر المصفوفة - المؤشراتالعمليات الحسابية على المؤشراتمقارنة المؤشراتمراجعة: التنقل في المصفوفة باستخدام المؤشرات5المؤشرات والدوال
التمرير بالقيمةتمرير المؤشرات إلى الدوالتعديل المتغيرات عبر المؤشراتمثال كلاسيكي: التبديلتمرير المصفوفات إلى الدوالملخص: وسائط المؤشرات في الدوال8الهياكل والمؤشرات
المؤشرات إلى الهياكلعامل السهم (->)تمرير الهياكل بالقيمةتمرير مؤشرات الهياكلالتخصيص الديناميكي للهياكلمراجعة: تعديل الهياكل باستخدام المؤشرات11تحديات المراجعة النهائية
مراجعة: دمج السلاسل النصية الديناميكيمراجعة: مصفوفة من الـ Structsمراجعة: عداد تكرار الكلمات3مصفوفات الأحرف والسلاسل النصية
السلاسل النصية كمصفوفات charالمُنهي الصفري (Null Terminator)إدخال السلاسل النصية باستخدام scanfاستخدام strlen()استخدام strcpy()استخدام strcat()استخدام strcmp()مراجعة: دوال السلاسل النصية الأساسيةتدرّب بنفسك: مترجم C عبر الإنترنت