الخميس، 26 مارس 2015

*الجزء الثاني

*الجزء الثاني
فوائد المؤشرات والمرجعيات :
بدايـة :
الآن سـنأتي فـي الجـزء الثـاني إلـى موضــوع التطبيـق العــملي للمؤشــرات
والمرجعيات ، في الجزء الأول تعـلمت ماهيـة المؤشرات والمرجعيات والفـرق
بينها وبين العــناوين والمتغيـرات ؛ يجـب أن تفهــم الجـزء السـابق فهــو مهــم
وضروري جـداً لفهـم بقية هذا الفصل وفصول أخـرى من هذا الكتـاب.
مميزات المؤشرات:
أحـد أهـم مميزات المؤشرات أنها تتعامـل مـع الـذاكرة heap ؛ وأنهـا متغيـرات
لكن بدلاً من أن تحــمل قـيم فإنهـا تحــمل عــناوين. فـي الـذاكرة وأنـك أيضـاً
تستطيع تحـديد شكلها وحجمها في الذاكرة وهـي أيضاً متغيرة وليست ثابتـة
؛ أي ان المستخـدم يستطيع تغيير حجمهـا متى ما أراد أثنـاء تنفيـذ البرنـامج ،
والمرجعيات في الأساس تمنحـك أغلب ميزات المؤشرات.
الميزة الأولـى :
تحـمل عـناوين وليس قيـم
(المؤشرات والمرجعيات والتوابع)
تستفيد التوابع من هذه الميزة فائدة عـظيمـة ، انتظر حتـى نصـل إلـى وحـدة
التوابع وسنتعرض لها بالتفصيل.
الميزة الثانيـة :
حجم المؤشرات غير ثابت
(المؤشرات والمصفوفات)
سندخل الآن في تطبيق جــديد ؛ هـل تتـذكر المصـفوفات .. تعلـم أن حجمهـا
ثابت دائماً ولا يمكن تغييره مهـما حاولـت فمـثلاً تعلـم أنـت أن السـطر التـالي
خاطيء تمـاماً. int Array [i] [j];
حيث i و j أعـداد يدخلها المستخدم في وقت سابق من البرنامج.
الآن ما رأيك أن نتعلم كيف ننشأ مصفوفة متغيـرة الحجـم وليسـت ثابتــة كمـا
في المثال السابق ... سنقوم أولاً بكتابة السطر القادم: int *Array = new int [i];
حيث i عدد يدخله المستخدم.
هل تعـلم مالذي سيفعله المترجم حينما يصل إلى السطر السابق.. سيقوم
بإنشاء متغير اسمـه Array ويحجز له في الذاكره ليس عدد صحيح واحـد كمـا
في الأحـوال العاديـة بل أعـداد صحيحـة بمثل ما هـو مدخل في العدد i فمثلاً
لو كـان 6=i فسيحجز المترجم ستة أعـداد في الذاكرة للمتغير Array حسـناً
الآن بإمكـانك إنشاء مصفوفة متغيرة الحجم ؛ ادرس المثال التالي:
1 #include <iostream.h>
2 void main( )
3 {
4 int i;
5 cin >> i;
6 int Array=new int [i];
7 for (int j=0;j<i; j++)
8 cin >> Array[j];
9 }
المثال السابق سيعـمل دون أية مشاكل ولن يعترض المترجم عليه كما ترى
في السطر السادس فسيعــمل المتـرجم علـى حجـز مصـفوفة كاملـة عـدد
عــناصرها i للمؤشــر Array ثـم يـدخل المستخــدم عــناصر المصفوفــة عبـر
دوارة for في السطرين السابع والثامن.
الآن نريد أن نقوم بإنشاء مصفوفة متغيرة الحجم لكن هذه المرة ببعـدين.
ما رأيك أن نقـوم بـإلإعلان عــن مؤشـر يشـير إلـى مؤشـر ، كمـا فـي السـطر
التالي: int **pArray;
دعـنا الآن نقوم بحجز الذاكرة لهذا المؤشـر حيـث سـنحجز لـه مصفوفــة عـدد
عـناصرها i سنكتب السطر التالي: int **pArray= new int *[i];
كما قلنا أن هذا المتغير pArray عبارة عـن مؤشـر يشـير إلـى مؤشـر بالتـالي
فعـندما نحجر له في الذاكرة فسنحجز له مؤشرات لأنه يشير إلى مؤشر وقد
حجزنا له مصفوفة كاملة من المؤشرات يبلغ عددها i الآن نريد أن نحجز لهذه
المؤشــرات مصـفوفة أخــرى لكـل مؤشــر فمـاذا سـنكتب ؛ سـنكتب الأسـطر
التاليـة: for (int k=0;k < i; k++) Array[k]= new int[j];
الآن حجزنا لكل مؤشر مصفوفة كاملـة كمـا فـي السـطر الثـاني .. كـل الـذي
عـملناه سابقاً هـو أننا انشأنا مصفوفـة ثنائيـة متغيرة الحجم.
1 #include <iostream.h>
2 void main ( )
3 {
4 int i,j;
5 cin >> i >> j;
6 int **Array=new int *[i] ;
7 for (int k=0 ; k< i ; k++)
8 Array[k] =new int[j];
9 for (k=0 ; k< i ; k++)
10 for (int kk=0; kk< j ; kk++)
11 cin >> Array [k] [kk];
12 }
سنقوم الآن بتناول موضوع المؤشر void والمؤشـرات الهائمــة أو الطائشــة
بالإضافـــة إلــى المؤشــرات الثابتـــة بالإضــافة إلــى كلمـــة بشــأن خـــطورة
المؤشرات. وكل هذا في الجزء الثالث من هذه الوحدة.

ليست هناك تعليقات:

إرسال تعليق