برمجة سي ++/الدرس الحادي عشر
مفاهيم عامة عن الذاكرة, طبيعة المصفوفات في الذاكرة, مقدمة عن المؤشرات.
[عدل].
.
.
مقدمة عن المؤشرات
[عدل]المؤشرات أو pointers هي نوع من المتغيرات يستخدم للإشارة إلى موقع ما في الذاكرة عن طريق حفظ موقعه. إذا فالمؤشرات تحمل قيمة يعتمد حجمها على تصميم الحاسوب وحجم الذاكرة التي يدعمها ، فتكون في العادة 2 أو 4 بايت. وتستخدم المؤشرات للإشارة إلى قيم متغيرات أخرى في العادة أو للتحرك الحرية في ذاكرة البرنامج، ومن الجدير بالذكر أن النظام لا يمنعك من الإعلان عن مؤشر يشير إلى موقع خارج برنامجك، ولكن بمجرد محاولة استخدامه للقراءة أو الكتابة، فإن النظام يرجع خطأ يؤدي إلى إنهاء البرنامج، وهو ما يعرف بأخطاء Segmentation error. ولهذا السبب يكره البعض استخدامها وذلك لسهولة الوقوع في الخطأ أثناء استخدامها، ولكن عدم استخدامها قد يمنعك من القيام بالكثير من الأشياء المثيرة أثناء البرمجة بلغة C++.
وكون المؤشرات تشير إلى موقع في الذاكرة ، فذلك يعني أن جميع المؤشرات بغض النظر عن نوعها (ولكن بالطبع على ذات التصميم من الحواسيب) لها ذات الحجم، فلماذا إذا هناك أنواع مختلفة من المؤشرات؟
إن تغير نوع المؤشر يساعد في التحرك في الذاكرة بخطوات تتناسب مع نوع المتغير الذي تشير إليه هذه المؤشرات، بكلمات أخرى ، إذا كنت تشير بمؤشر مخصص للإشارة إلى char، فإن كل خطوة تحركها باستخدام عملية الزيادة ++ مثلا تغير من موقع إشارة المؤشر ببايت واحد فقط، وذلك لأن الحروف من نوع char تحتل بايتا واحدا كل مرة، في حين أنك لو استخدمت مؤشرا مخصص للإشارة إلى عدد صحيح int بحجم 4 بايت، فإن كل خطوة زيادة للمؤشر بعملية ++ ستحركه أربعة بايت.
الإعلان عن المؤشرات
[عدل]للإعلان عن المؤشرات ، كل ما عليك القيام به هو تحديد نوع المتغير الذي سيشير إليه المؤشر واسم ذلك المؤشر فمثلا:
char *aPointer; int x=5, *xptr;
هو جزء من برنامج، السطر الأول فيه يعلن عن مؤشر مخصص للإشارة عن متغير من نوع حروف char ، أما السطر الثاني ففيه إعلان عن متغير من نوع عدد صحيح int وبعدها مؤشر مخصص للإشارة على متغير من نوع int.
لاحظ من المثال أنه لتحديد ان الإعلان عن مؤشر من نوع ما ، ما عليك سوى الإعلان عنه كأي متغير من النوع الذي سيتم الإشارة إليه ثم إضافة النجمة * قبل اسم المؤشر. لاحظ ان المؤشران المعلن عنهما أعلاه لم يتم تحديد قيمهما للإشارة إلى أي متغير، ولكن هذا لا يعني أنهما لا يحملان قيمة، فهما يحملان قيمة مجهولة بالنسبة لنا، وعلى الأغلب ، فإن استخدامهما مباشرة بعد الإعلان عنهما بهذه الصورة سيؤدي إلى Segmentation fault، أي خطأ في الإشارة إلى موقع الذاكرة لأنهما وعلى الأغلب سيكونان حاملان لقيم تشير وبشكل عشوائي لمواقع ما في الذاكرة على الأغلب خارج نطاق برنامجنا.
«الدرس السابق | العودة للصفحة الرئيسية | الدرس التالي» |