*حجز الذاكرة للمؤشرات :
هـل تتـذكر حينمـا قمنـا بتشـبيه المؤشــر علـى أنــه مثـل الرسـالة وأن هـذه
الرسالة تحـوي أي عـدد من البيانات وأنك تستطيع تكبير حجـم هـذه الرسـالة
إلى أي مدى تريده .. عـموماً هذا ما ستتعلمه من هذه الفقرة
إذا قمت بكتابة برنامج وكتبت السطر التالي: int *x ;
فإن المترجم لن يقوم بحجز مكـان في الذاكرة للمتغير x تسـتطيع أنـت فيمـا
بعــد أنـت تقـوم بتعيـين عــنوان أي متغيـر آخـر لهـذا المؤشـر .. ولكـن مـاهي
الفائدة من ذلك ؛ فكما تعلم نحن نريد الإستفادة من المؤشرات ولـيس مجـرد
المعرفة ؛ إذاً عليك أن تحجز مكـان في الذاكرة لهذا المتغير x بحسب مـا تريـد
قم بدارسة المثالين التاليين:
1 // for pointer
2 #include <iostream.h>
3 void main( )
4 {
5 int *c
6 *c=50;
7 cout << *c;
8 }
أما المثال الثاني:
1 // for pointer
2 #include <iostream.h>
3 void main( )
4 {
5 int *c=new int;
6 *c=50;
7 cout << *c;
8 }
كما ترى فإن المثال الأول لن يعـمل مهـما حاولت بالرغـم من أنـه لا تعقيـد ولا
غبار عليه إلا أنـه في السطر الخامس مـن المثـال الأول فإنـك قمـت بـالإعلان
عـن متغير اسمه c يحمل عـنوان ؛ لم تقـوم بتعيـين مـا هــو هـذا العــنوان ولا
تدري أصلاً أين سيقوم المترجم بوضع الرقم 50 في أي مكــان فلـيس هــناك
حجز في الذاكرة باسـم c مـن أجـل ذلـك لـن يعــمل المثـال الأول أمـا المثـال
الثـاني فسيعــمل بـالطبع والفـرق بينـه وبـين المثـال الاول هــو فـي السـطر
الخامس حيث استخدمت كلمة جديدة وهـي new وهذه الكلمـة هــي التـي
تحجز موقع فـي الـذاكرة وهــو كمـا تلاحـظ مـن النــوع int لـذلك حينمـا يصـل
المترجم إلى السطر السادس فسيعلم أين يضع قيمـة c.
الآن وبعد أن انتهينا مـن المثـالين السـابقين فيجـب عليـك أن تعلـم التـالي؛ لا
يمكـنك تعيين قيمـة إلـى عــنوان فـالمتغير c هــو عــنوان ولـيس قيمــة لكـن
بإمكـانك تعيين عـنوان إلى عـنوان أو قيمة إلى قيمـة ... وحتـى تقـوم بتعيـين
قيمة إلى أي مؤشر يجـب عليـك أن تحجـز مكــان فـي الـذاكرة لهـذا المؤشـر
وهـو كما رأينا بالكلمة new وأن تكتب فيمـا بعـد كلمـة new نمـط هـذا الحجـز
هل هــو int أم غيره مـع ملاحظــة أنـه لـيس بإمكــانك الإعـلان عــن مؤشـر
نمطـه int وتحجز له في الذاكرة نمط float.
**الإشارات أو المرجعيات :
الآن سندخل في موضوع شبيه بالمؤشرات وسيمنحك الكثير حينما تبـدأ فـي
التعامل مع المؤشرات
ادرس هذا المثال:
1 // for reference
2 #include <iostream.h>
3 void main( )
4 {
5 int c;
6 c=50;
7 int &One=c;
8 cout << One;
9 }
كما ترى فقـد أعلنـا عــن مرجعيـة تدعــى One ويجـب عــند الإعـلان عــن أي
مرجعيـة أن نسـبقها بالمعامـل & ؛ لاحـظ مخرجـات البرنـامج والتـي سـتكون
نفس قيمة المتغير c
عليك أن تعرف أن المرجعيات لا يمكـن الإعـلان عــنها دون تهيئــة وهــي فـي
الأساس تستعـمل كأسماء مستعارة للهـدف ؛ انظر لهذا المثال وادرسـه:
1 // for reference
2 #include <iostream.h>
3 void main( )
4 {
5 int c;
6 c=50;
7 int &One=c;
8 cout << One << endl;
9 c=80;
10 cout << One << endl;
11 c=500;
12 cout << One<< endl;
13 }
كما تلاحظ فلقد قمنا بتعيين قيم جديدة للمتغير c وفي كل مرة يطبع البرنامج
المرجعيــة One إلا وأنــه حسـب السـطر السـابع فـإن المتغيـر c معـين إلـى
المرجعيـة One وبالتالي فأي عـملية على المتغير c تعـني أنها ستجري حتماً
على المرجعيـة One.
هذا هـو كل موضوع الإشارات ؛ أما عـن طريقة حجز الذاكرة لهـذه المرجعيـات
أو الإشارات فهـي نفس طريقة حجز الـذاكرة للمؤشـرات عــن طريـق الكلمـة
الدليليـة new.
وهذه طريقة حجز الذاكرة للإشارة. char &Refrence= *(new char); Refrence = 'x';
هـل تتـذكر حينمـا قمنـا بتشـبيه المؤشــر علـى أنــه مثـل الرسـالة وأن هـذه
الرسالة تحـوي أي عـدد من البيانات وأنك تستطيع تكبير حجـم هـذه الرسـالة
إلى أي مدى تريده .. عـموماً هذا ما ستتعلمه من هذه الفقرة
إذا قمت بكتابة برنامج وكتبت السطر التالي: int *x ;
فإن المترجم لن يقوم بحجز مكـان في الذاكرة للمتغير x تسـتطيع أنـت فيمـا
بعــد أنـت تقـوم بتعيـين عــنوان أي متغيـر آخـر لهـذا المؤشـر .. ولكـن مـاهي
الفائدة من ذلك ؛ فكما تعلم نحن نريد الإستفادة من المؤشرات ولـيس مجـرد
المعرفة ؛ إذاً عليك أن تحجز مكـان في الذاكرة لهذا المتغير x بحسب مـا تريـد
قم بدارسة المثالين التاليين:
1 // for pointer
2 #include <iostream.h>
3 void main( )
4 {
5 int *c
6 *c=50;
7 cout << *c;
8 }
أما المثال الثاني:
1 // for pointer
2 #include <iostream.h>
3 void main( )
4 {
5 int *c=new int;
6 *c=50;
7 cout << *c;
8 }
كما ترى فإن المثال الأول لن يعـمل مهـما حاولت بالرغـم من أنـه لا تعقيـد ولا
غبار عليه إلا أنـه في السطر الخامس مـن المثـال الأول فإنـك قمـت بـالإعلان
عـن متغير اسمه c يحمل عـنوان ؛ لم تقـوم بتعيـين مـا هــو هـذا العــنوان ولا
تدري أصلاً أين سيقوم المترجم بوضع الرقم 50 في أي مكــان فلـيس هــناك
حجز في الذاكرة باسـم c مـن أجـل ذلـك لـن يعــمل المثـال الأول أمـا المثـال
الثـاني فسيعــمل بـالطبع والفـرق بينـه وبـين المثـال الاول هــو فـي السـطر
الخامس حيث استخدمت كلمة جديدة وهـي new وهذه الكلمـة هــي التـي
تحجز موقع فـي الـذاكرة وهــو كمـا تلاحـظ مـن النــوع int لـذلك حينمـا يصـل
المترجم إلى السطر السادس فسيعلم أين يضع قيمـة c.
الآن وبعد أن انتهينا مـن المثـالين السـابقين فيجـب عليـك أن تعلـم التـالي؛ لا
يمكـنك تعيين قيمـة إلـى عــنوان فـالمتغير c هــو عــنوان ولـيس قيمــة لكـن
بإمكـانك تعيين عـنوان إلى عـنوان أو قيمة إلى قيمـة ... وحتـى تقـوم بتعيـين
قيمة إلى أي مؤشر يجـب عليـك أن تحجـز مكــان فـي الـذاكرة لهـذا المؤشـر
وهـو كما رأينا بالكلمة new وأن تكتب فيمـا بعـد كلمـة new نمـط هـذا الحجـز
هل هــو int أم غيره مـع ملاحظــة أنـه لـيس بإمكــانك الإعـلان عــن مؤشـر
نمطـه int وتحجز له في الذاكرة نمط float.
**الإشارات أو المرجعيات :
الآن سندخل في موضوع شبيه بالمؤشرات وسيمنحك الكثير حينما تبـدأ فـي
التعامل مع المؤشرات
ادرس هذا المثال:
1 // for reference
2 #include <iostream.h>
3 void main( )
4 {
5 int c;
6 c=50;
7 int &One=c;
8 cout << One;
9 }
كما ترى فقـد أعلنـا عــن مرجعيـة تدعــى One ويجـب عــند الإعـلان عــن أي
مرجعيـة أن نسـبقها بالمعامـل & ؛ لاحـظ مخرجـات البرنـامج والتـي سـتكون
نفس قيمة المتغير c
عليك أن تعرف أن المرجعيات لا يمكـن الإعـلان عــنها دون تهيئــة وهــي فـي
الأساس تستعـمل كأسماء مستعارة للهـدف ؛ انظر لهذا المثال وادرسـه:
1 // for reference
2 #include <iostream.h>
3 void main( )
4 {
5 int c;
6 c=50;
7 int &One=c;
8 cout << One << endl;
9 c=80;
10 cout << One << endl;
11 c=500;
12 cout << One<< endl;
13 }
كما تلاحظ فلقد قمنا بتعيين قيم جديدة للمتغير c وفي كل مرة يطبع البرنامج
المرجعيــة One إلا وأنــه حسـب السـطر السـابع فـإن المتغيـر c معـين إلـى
المرجعيـة One وبالتالي فأي عـملية على المتغير c تعـني أنها ستجري حتماً
على المرجعيـة One.
هذا هـو كل موضوع الإشارات ؛ أما عـن طريقة حجز الذاكرة لهـذه المرجعيـات
أو الإشارات فهـي نفس طريقة حجز الـذاكرة للمؤشـرات عــن طريـق الكلمـة
الدليليـة new.
وهذه طريقة حجز الذاكرة للإشارة. char &Refrence= *(new char); Refrence = 'x';
ليست هناك تعليقات:
إرسال تعليق