منتدى طلاب جامعة الحديدة

أخي الزائر إن لم تكن عضواً في المنتدى فنحن ندعوك لكي تنظم إلينا وشكراً تحيات مدير المنتدى طارق البغوي
منتدى طلاب جامعة الحديدة


    ++c المؤشرات

    شاطر

    ماجد العريفي
    إعلامي
    إعلامي

    ذكر
    عدد الرسائل : 681
    العمر : 29
    البلد : اليمن
    القسم والمستوى : خريج قسم معلم حاسوب
    المزاج : سكر
    العضوية : 15
    أختر علم دولتك :
      :
    السٌّمعَة : 10
    نقاط : 198
    تاريخ التسجيل : 11/11/2007

    بطاقة الشخصية
    تخصصي: حاسوب
    المحافظة:

    ++c المؤشرات

    مُساهمة من طرف ماجد العريفي في الأربعاء فبراير 20, 2008 9:57 am

    السلام عليكم اولا هذا الموضوع منقول للفائدة ...

    ستكون هذه سلسلة دروس باذن الله للتعرف بشكل أفضل على الؤشرات ... وازالة الغموض الكامن حولها .. باذن الله ...

    بداية هذه مقدمة عن المؤشرات ... المؤشرات يمكن أن توصف بثلاث كلمات ...
    مميزة و مرنة وخطيرة في ان واحد...

    مقدمة:

    فهي مميزة لأن أغلب ان لم يكن كل لغات البرمجة (ماعدا السي والسي بلس بلس ) لاتعطيك الحرية بفعل ماتريد كيفما تريد كما هو في السي بلس ... فمبرمج السي بلس بلس له الحرية المطلقة في التعامل مع المؤشرات أو عدم التعامل على مستوى المؤشرات ... وطبعا التعامل يختص بالتعامل مع الذاكرة ... ليس الا.
    فنجد ان الفيجوال بيزك لا تعطي المبرمج حرية أبدا كمبرمج السي بلس بلس ... نظرا لخطورة التعامل مع المؤشرات وادارة الذاكرة يدويا ... وأيضا لغة الجافا التي اشتقت من السي بلس بلس لاتعطي المبرمج الحرية المطلوبة ....
    وللغة الجافا ململم نفايات أو Garbage Collection ويمكن الاختصار له ب GC مهتم بالغاء تخصيص كميات الذاكرة المحجوزة يدويا بشكل الي ... ومن الملاحظ أن أكثر أدوات لغة الجافا مبيعا تلك المهتمة باكتشاف الاخطاء وخصوصا (بطء عمل التطبيقات ) بسبب ال GC .... فال GC سيتسبب بعمليات تنظيف دورية للذاكرة مما يتسبب ببطء البرنامج .

    أما بالنسبة للمرونة فهي ماتوصف به أقوى لغة برمجة على الاطلاق وهي السي بلس بلس فمن أهم ميزاتها ميزات لتعامل الحر جدا مع الذاكرة ... فهي تعطي بعدا جديدا كليا لهندسة البرنامج ككل ... (وسنتطرق في دروس قادمة عن أمثلة لحالات مرنة جدا كان من الصعوبة بمكان وربما استحالة أن تتم دون المؤشرات) ....
    فبتكامل المؤشرات مع الوراثة مع الفئات مع الوراثة وتعدد الاشكال نصل لمراحل متقدمة جدا ي هندسة البرنامج ككل وسنتطرق لذلك لاحقا ...

    أما ثالثا الخطورة .. خطورة التعامل المباشر مع الذاكرة له سيئاته طبعا بالنسبة لعدم المتمرسين والحذرين ...
    نعلم أنه يجب الغاء تخصيص أي ذاكرة يتم حجزها يدويا بالغاء يدوي أيضا ... والا سيتم توقف البرنامج أو انتهاك ذاكرة النظام انتهاكا سيئا يضر بالنظام ككل ...
    وغالبا ماينسى المبرمج تحرير الذاكرة التي انشئها ... واذا لم ينسى فقد يحرر الذاكرة في وقت غير مناسب يمكن أ يسبب في شلل البرنامج ككل....
    مما يؤدي الى أصعب أنواع الاخطاء على الاطلاق الا وهي أخطاء ال استثناءات وانتهاكات الذاكرة .(وسنتناول بتفصيل أكثر في الدروس عن هذه النقطة) ....
    يوجد نوع اخر من الاخطاء المنطقية التي لاتتسبب في وقوف البرنامج انما حدوث نتائج غير مرغوبة وهي أيضا معفدة وصعبة الاكتشاف....
    ولهذا قامت مايكروسوفت أخيرا بانتاج طقم الدوت نت لأسباب كثيرة منها مشكلة التعامل مع الذاكرة بهذه الطريقة المباشرة خصوصا لمبرمجي السي بلس بلس ...
    حيث أدخلت مايكروسوفت GC خاص بمنصة الدوت نت لكن يتم تفعيله في السي بلس بلس دوت نت بشكل إختياري ... فلم يتم الغاء الحجز اليدوي في نسخة السي بلس بلس الخاصة بمنصة الدوت نت والتي تدعى ب++ Manged c أو (شيفرة سي بلس بلس المدارة) .... فكل ماحدث ان زادت مرونة السي بلس بلس في نواح جديدة ولكن للأسف تم الغاء يعض ميزات المرونة الاخرى لكي تتدنى من كل من لغتي ال #C و ال
    Visual Basic.Net ... قد ندخل في موضوع ال ++Manged C لاحقا.
    فأقول أن مشكال الادارة اليدوية للذاكرة أو التعامل على المستوى الادنى مع المؤشرات قد وجدت صدى جيدا في ماكروسوفت ورأت أن تنتهج منهج صانعي لغة الجافا وتدير الذاكرة بشكل الي بسبب أن محاسن الادارة اليدوية أقل من المساويء ... طبعا للمبتدئين ... فأدخلت ال GC ليتم الاختيار بين التحرير اليدوي للذاكرة أو التحرير الالي أو كليهما معا وهذا طبع بالنسبة للمؤشرات....

    والمؤشرات هي ليست الا متغيرات تحمل قيم عناوين في الذاكرة وليست قيما حقيقية كالارقام والحروف وماشابه ذلك ....
    مثلا :
    int * q ;
    مؤشر ونحجز له ذاكرة قبل ان نتعامل معه على النحو التالي ...
    q = new int ;
    ف ال q حاليا تحمل قيمة لعنةان في الذاكرة .....

    اما اذا كتبنا
    int w ;
    فيكون قد حجز لنا الحاسوب بشكل الي مكانا قي الذاكرة لمتغير واحد صحيح وال
    w تحمل قيمة لعدد صحيح وليس مؤشرا ...
    وسنفهم الفرق بشكل مفصل في الجلسات القادمة ....

    ماجد العريفي
    إعلامي
    إعلامي

    ذكر
    عدد الرسائل : 681
    العمر : 29
    البلد : اليمن
    القسم والمستوى : خريج قسم معلم حاسوب
    المزاج : سكر
    العضوية : 15
    أختر علم دولتك :
      :
    السٌّمعَة : 10
    نقاط : 198
    تاريخ التسجيل : 11/11/2007

    بطاقة الشخصية
    تخصصي: حاسوب
    المحافظة:

    رد: ++c المؤشرات

    مُساهمة من طرف ماجد العريفي في الأربعاء فبراير 20, 2008 10:00 am

    الجلسة الأولى :

    سنحاول في هذه الجلسة أن نفهم الفرق بين
    1)
    المتغيرات التي تحمل قيما كالأعداد والحروف وبين المتغيرات التي تحمل عناوين في الذاكرة
    2) ثم اذا كان لدينا متغير يحمل قيمة كيف يمكننا أن نعرف عنوانه في الذاكرة
    واذا كان لدينا متغير يحمل عنوان كيف يمكننا أن نحصل على القيمة التي في ذلك العنوان

    اي العملية العكسية لكل منهما ... اذا فهمنا هاتين النقطتين سنكون قد خطونا خطوة كبيرة في الفهم الصحيح للمؤشرات ...
    وأهمس في اذانكم قبل ان نبدأ .. أنه بعد تعلم المؤشرات بشكل جيد يجب علينا أن نحاول استعمالها كل ماأمكن ذلك في برامجنا لكي نعتاد عليها ... ثم يجب أيضا أن تتم مراجعة وقراءة المؤشرات برمتها كل 6 شهور على الاقل لكي ترسخ في الذهن بشكل مناسب ...

    الان فالنذهب الى النقطة الاولى ...

    الفرق بين المتغيرات التي تحمل قيما وتلك التي تحمل عناوين .. في الصيغة الكتابية تكون على النحو التالي ...

    المتغيرات العادية ...
    ; int y
    المؤشرات ...
    ; int * x

    الفرق كما هو واضح فقط في علامة * التي تعني أن هذا المتغير x سيحمل عنوانا وليس قيمة ...
    الى هنا سنذهب الى النقطة الثانية ونتعرف على باقي الفروق لاحقا ...

    اذا كان لدينا متغير يحمل قيمة كيف يمكننا أن نعرف عنوانه في الذاكرة ؟؟

    مثال 1 :
    ; int y =10
    من الملاحظ أن قيمة y هنا هي 10 ... ولكن ماهو عنوان هذا المتغير في الذاكرة ؟
    لمعرفة ذلك وطباعة قيمة العنوان على الشاشة ...
    ; cout << " y value is : "<<y
    ; cout << "address is :" << &
    y
    لاحظ لل & هنا تعني أوجد عنوان الشيء الذي يلي الحرف & يعني هنا أوجد عنوان y ..
    سيقوم الجهاز بطاعة قيمة العنوان المحجوز لل y ... وستكون النتيجة قيمة ستعشرية .. وقد تكون على الشكل التالي ....
    y value is :10
    address is : 0x8f51fff3 ...

    لكن لن تكون القيمة السابقة ثابته لكل جهاز فحتما ستختلف من جهاز لأخر لأن البرنامج يقوم بحجز القيم في أماكن تتعلق بالنظام ككل ...

    أما بالنسبة للمتعيرات التي تحمل عناوين " المؤشرات " .....
    واذا كان لدينا متغير يحمل عنوان كيف يمكننا أن نحصل على القيمة التي في ذلك العنوان ؟؟
    الامر كالتالي ....
    مثال 2 :
    ; int * x
    لن نمهد ل x بقيمة حاليا وانما لاحقا سنعرف كيف نمهد للمتغيرات ...
    ; x = 50*
    ; cout << " x value is : "<< *x
    ; cout << " x address is : "<< x

    x value is 10
    x address is 0x8f51fff3 ......

    لاحظ هنا أولا أننا أعطينا x قيمة 50 لكن x عنوان وليس قيمة لذا فاننا وضعنا العامل * قبل المتغير x لنرمز لى اننا نريد قيمة المتغير الذي يلي العامل * ... وهنا يعني نريد قيمة x لنعين لها المقدار 50 ....
    لاحظ في النتائج على الشاشة أن خرج القيمة سيكون50 وهي القيمة لل x* والعنوان هو x فقط ...

    وهذا عكس مايحدث للمتغيرات المعرفة بأنها عادية وتحمل قيما ...
    عندها ملخص النتائج ...
    العامل & يستخدم لاستخراج عنوان من متغير في الاصل يحمل قيمة
    والعامل * يستخدم لأستخراج القيمة من متغير هو في الاصل يحمل عنوانا ....


    أخيرا هناك مفاجأة !! المثال 2 لن يعمل ... وسيعطيك المصرف بأن هنا انتهاك للذاكرة ...
    مالسبب في ذلك ؟ كما يبدو للعيان المثال مباشر تماما ولاتعقيدات حوله ...
    لكن فلنعلم انه عند انشاء متغير عادي يحمل قيمة يقوم الكمبيوتر بشكل الي بحجز مكان في الذاكرة لهذا المتغير الجديد ....لهذا السبب المثال الأول سيعمل بشكل جيد لأنه عندما عيينا القيمة 10 للمتغير y كان المتغير y له
    مكان صالح في الذاكرة ...

    أما المثال الثاني فعندما عينا القيمة 50 لتوضع في المتغير x * كقيمة ... لم نكن قد أنشئنا مكانا في الذاكرة للمتغير x بعد ... لأن الامر
    ; int * x لايفعل شيئا ولايحجز مكانا صالحا في الذاكرة للمتغير x .. وانما فقط يخبر المصرف أن هناك متغير اسمه x يمكن أن يحمل عنوانا ... أما عملية الحجز فيتركها المصرف لك كليا ولك الحرية في ذلك ... لكن تذكر
    لاتعين قيمة لمتغير مؤشر قبل أن تحجز له مكانا في الذاكرة ... ... وحجز الذاكرة سيكون يدويا كما ذكرت ونستخدم لذلك أمرا أساسيا جديدا وهو new وسصبح لونه بالازرق في مصرف لغة السي ليشير الى أنه كلمة اساسية ...
    والصيغة كالتالي....
    ; int * x
    ; x = new int
    وهكذا اذا أكملنا المثال 2 ستعرض النتائج كما هو موضح في الخرج ...
    لأننا الان حجزنا مكانا صالحا في الذاكرة للمتغير x .....

    وأخيرا يجب أن نعرف أننا يجب أن نعين متغير عنوان الى عنوان ومتغير قيمة الى قيمة ....
    ولايمكن ان نعين قيمة الى عنوان أو عنوان الى قيمة ... يعني بلغة الامثلة ...
    مثال 3:
    ; int * x
    ; x = new int
    ; int y
    ; x = y // ERROR x is address and y is Value
    x= y // Good y is Value and *x is value *
    x = & y // Good x is address and &y is address


    والان وبعد أن عرفنا هذه المعلومات ... يأتي السؤال المهم ولماذا نريد أن نعرف عنوان متغير في الذاكرة .... ؟
    لن أجيب الان وانما في الجلسة القادمة ولكن يجب لكي تفتح ذهنك أن تعرف أن
    المؤشرات هي المصفوفات ... كيف ؟ سنعرق في الجلسة القادمة...

    ماجد العريفي
    إعلامي
    إعلامي

    ذكر
    عدد الرسائل : 681
    العمر : 29
    البلد : اليمن
    القسم والمستوى : خريج قسم معلم حاسوب
    المزاج : سكر
    العضوية : 15
    أختر علم دولتك :
      :
    السٌّمعَة : 10
    نقاط : 198
    تاريخ التسجيل : 11/11/2007

    بطاقة الشخصية
    تخصصي: حاسوب
    المحافظة:

    رد: ++c المؤشرات

    مُساهمة من طرف ماجد العريفي في الأربعاء فبراير 20, 2008 10:01 am

    الجلسة الثانية :

    عرفنا في الجلسة السابقة كيف يمكننا انشاء مؤشرات وكيف نحجز لها مكان في الذاكرة وكيف نعين قيما لتخزن في داخل تلك العناوين ,,,,
    الان يجب أن نعلم أنه يمكننا حجز أكثر من مكان في الذاكرة ,,,, فمثلا في المثال ,,,

    مثال 1:
    ; in t * x
    ; x = new int


    حجزنا موقعا واحد فقط في الذاكرة لهذا المتغير x ...
    في المتغيرات العادية يمكننا أن نحجز متغير زاحد أو أكثر باستخدام المصفوفات ,,,
    مثال 2:
    ; int z[10] // Array
    المتغير z يمكنه تخزين 20 قيمة من النوع الصحيح ,,,,
    كيف يمكن أن نفعل ذلك في المؤشرات ....
    مثال 3:
    ; int * x
    ; x = new int [10] // Our Pointer

    هنا حجزنا 10 خانات للمتغير x وعملية الحجز هذه تحجز الاماكن في الذاكرة بحيث تكون متتالية في قيم العناوين بفرق 4 بايت بين كل عنوان والاخر " 4 بايت هو حجم ال int " ....... والمفاجيء أن طريقة استعمال المصفوفات والمؤشرات متشابهه تماما وأقصد متشابهه بالنسبة لطريقة تعين المتغيرات لكل منهما كالتالي ,,,,

    يالنسبة للمثال 2 الذي يستخدم المصفوفات سنمرر القيمة 10 للثلاثة عناصر الأولى ,,,
    مثال 4:
    ;z[0] = 10
    ;z[1] = 10
    ;z[2] = 10
    وبالنسبة للمثال 3 الذي يستخدم المؤشرات ....
    مثال 5:
    ; x[0] =10
    ; x[1] =10
    ; x[2] =10

    المفاجيء أن لهما نفس طريقة الاستعمال !! والمفاجيء أكثر أن المصفوفات هي المؤشرات تماما ... لكن بفرقين بسيطين سنذكرهما بعد قليل ,,,,

    قبل أن نعرف الفرقين يجب أن نعرف أننا يمكن أن نكتب المثالين السابقين بطريقة أخرى وهي منطقية تماما لمن فهم الجلسة الاولى ....

    مثال 6:
    10 = (z+0)*
    10 = (z+1)*
    10 = (z+2)*

    وبالنسبة للمؤشرات ...
    مثال 7:
    10 = (x+0)*
    10 = (x+1)*
    10 = (x+2)*

    مالعلاقة بين المثالين السابقين وبين الذين قبلهما ؟؟
    التدوين[ z[2والتدوين (z+2)* متشابهين تماما كما هو ملاحظ ... لكن كيف حدث ذلك ؟
    قلنا سابقا أن العامل * الغرض منه هو استخراج القيمة التي في العنوان ...
    يعني x* تعني القيمة التي في العنوان x ...." وهي تساوي (x+0)* "
    وقد قلنا سابقا أن العناوين المحجوزة بالمؤشرات أو المصفوفات تحجز على التوالي بفرق عدد بايتات من نوع المصفوفة أو المؤشر ....
    حسنا , هاقد استخرجنا القيمة الموجودة في العنوان الاول x ... لكن كيف نستخرج باقي القيم التي في باقي خانات المؤشر ال 10 التي حجزناها في المثال 3 ؟؟
    الطريقة سهلة ,, وهي بأن نقول استخرج القيمة التي في العنوان التالي للعنوان x ..كالتالي ...
    (x+1)* حيث أن العنوان الذي يلي العنوان x هو x+1 باستخدام العامل * نستخرج القيمة التي في هذا العنوان " لكن لاحظ يجب استخدام الاقواس " ....
    القيمة التي في العنوان الذي يليه (x+2)* وهكذا ....
    يمكنك أن تستخدم هذا النوع من الصيغ أو الصيغة الاساسية للمصفوفات ...
    لكنك في بعض الاماكن الضيقة ستفضل تدوين ال * .....
    الان من أوجه الشه أيضا بين المؤشرات والمصفوفات طريقة استعمالهما للتمرير الى الدالات ...
    لنفرض ان لدينا الدالة التالية .....
    مثال 8 :int Function( int W[] ) // Our Function
    }
    ; [cout << W [0
    ; [cout << W [4
    ; [cout << W [6
    {
    والتي نمرر لها مصفوفة فتقوم بطباعة العنصر الاول والرابع والسادس من المصفوفة ....
    اذا كانت مصفوفتنا عادية كما في المثال 2 سنمررها كالتالي ...
    مثال 9 :
    ; ( Function ( z
    ف المتغير z هنا هو عنوان أول عنصر في المصفوفة z ...
    واذا كنا نستخدم مصفوفات التي تعمل بالمؤشرات كما في المثال 3 ....
    مثال 10 :
    ; ( Function ( xلاحظ لافرق بين النوعين اطلاقا .... فأريد أن أقول أن المؤشرات والمصفوفات متشايهتان قي أمور كثيرة لكن يمكن أن نميز الفرق بينهما بالثلاثة فروق التالية...
    1)عنوان مصفوفة المؤشرات ديناميكي ....أما عنوان المصفوفة العادية ستاتيكي"ثابت"
    2) حجم مصفوفة المؤشرات ديناميكي ولايشترط معرفته قبل وقت التشغيل ... أما حجم المصفوفات العادية فهو ثابت ويجب معرفته قبل وقت التشغيل ...
    3) يمكن الغاء الذاكرة الخاصة بمصفوفات المؤشرات في أي وقت من البرنامج ,, واذا نسيت الغاءها فلن يلغيها لك البرنامج الا بعد انتهاءه وتوقفه عن العمل ...
    أما الذاكرة الخاصة بالمصفوفات العادية فلا يمكنك الغاءها متى تشاء فالغائها يتم بشكل الي بعد الخروج من مدى الرؤية الخاص بها " SCOPE"....
    للثلاثة أسباب الفائتة اخترعت المؤشرات لتزيد من مرونة البرمجة بشكل فعال جدا ....
    والخروج من ضيق المصفوفات الى سعة المصفوفات ... ويمكنكمنالان أن تلغي جميع استخداماتك للمصفوفات العادية وتستعمل بدلا منها تدوين المؤشرات ....
    .............................
    الان سنشرح الفرق الأول ...
    عنوان مصفوفة المؤشرات ديناميكي ....أما عنوان المصفوفة العادية ستاتيكي"ثابت" ..
    لنأخذ المثال التالي الذي سيوضح تماما المقصود ...
    مثال 11 :
    ;int *x
    ;[ x= new int [10
    ;[ int z [20


    الان يمكننا كتابة أن ..
    ; x = z
    ولايمكننا كتاية أن
    ; z = x
    لأن عنوان ال z سيكون ثابتا طوال فترة تشغيل البرنامج .. وسعطى لل z فقط وقت انشاء المتغير " أي وقت التعريف "
    أما ال متغير x فعنوانه يعطى وقت التعريف لكن يمكن تغييره في أي لحظة ...
    كما في المثال أعلاه قمنا بتعيين عنوان جديد لل x كما في
    ; x = zفلن يعترض المصرف لأنه يمكنك تغيير العنوان كما تشاء لأنك تتعامل مع مؤشر ...
    وأخيرا قبل أن ننهي هذه الجلسة مالسبب الذي يدعوك لتغيير عنوان المصفوفة ؟؟
    لنفرض مثلا أنك تريد أن تنسخ مصفوفة كاملة الى مصفوفة فارغة أخرى ... يمكنك فعل ذلك بحلقة for بحيث تمر على جميع العناصر في المصفوفة وتعينها الى مقابلاتها في المصفوفة الفارغة ...
    لكن التدوين ..
    ; x= z
    يغنيك عن كل هذا ... فالذي حدث هنا أن المصفوفة x أصبحت محتويات عناصرها هي نفسها التي في المصفوفة z ..... وبكل سهولة ...
    فالذي حدث هنا أن عنوان المصفوفة x أصبح هو نفسه عنوان المصفوفة z ...
    لذا فان عنوان أول عنصر لل x سيكون هو نفسه في ال z والثاني هو الثاني هناك والثالث كذلك .. لكل عناصر المصفوفة ...
    وهذه الطريقة سريعة جدا في نسخ المصفوفات لكن لها استعمالاتها الخاصة ولها عيوبها سنذكرها في الجلسة القادمة ...
    وسنشرح الفرقين الباقيين بين المؤشرات والمصفوفات ... لكي نغوص بعدها في الجلسات التي تليها أكثر في عالم المؤشرات

    ماجد العريفي
    إعلامي
    إعلامي

    ذكر
    عدد الرسائل : 681
    العمر : 29
    البلد : اليمن
    القسم والمستوى : خريج قسم معلم حاسوب
    المزاج : سكر
    العضوية : 15
    أختر علم دولتك :
      :
    السٌّمعَة : 10
    نقاط : 198
    تاريخ التسجيل : 11/11/2007

    بطاقة الشخصية
    تخصصي: حاسوب
    المحافظة:

    رد: ++c المؤشرات

    مُساهمة من طرف ماجد العريفي في الأربعاء فبراير 20, 2008 10:03 am

    الجلسة الثالثة:

    توقفنا في الجلسة السابقة عند طريقة تعيين عنوان مؤشر الى مصفوفة لنسخ المصفوفة الى مصفوفة المؤشر ....
    وذكرنا أن لها استخدامات في مناطق خاصة ...
    ذكرنا أن الحسنة في ذلك هي السرعة المذهلة ...
    ولكن العيب كما في المثال التالي ...

    مثال 1:
    [ int * q = new int [12
    [ int w[12

    w [0 ] = 1
    w [1] = 1066
    w [2] = 6
    w [3] = 76
    w [4] = 323

    q = w

    ( void Set_Data ( int * z
    }

    z [ 0 ] = 10
    z [ 1] = 10
    z [ 2] = 10

    }
    الدالة واضحة ...
    الان سنستدعي الدالة أعلاه بعد عدة أسطر من الشيفرة ...
    ونعلم أن قيم q أصبحت هي قيم w ....
    وقررنا في هذه اللحظة أن نستدعي الدالة Set_Data لنعين قيم جديدة لأول 3 عناصر في q .....
    ( Set_Data ( q

    المفاجيء هنا اننا غيرنا قيم المصفوفة المؤشرة q ... لكن الأمر السيء هو أن المصفوفة w ستتغير أيضا ... مع ان العلاقة بين q و w كانت في السابق ...
    الى أن تعين قيمة عنوان لاخر يعني أن لهما نفس الخانة في الذاكر ة مما يعني أن أي تغيير في أي من المتغيرين سيسبب في تغيير الاخر ....
    وليس ذلك هو المرغوب دائما .. لذا سنستعيض في بعض الأحيان بالنسخ العادي .. نسخ كل عنصر الى مقابله في المصفوفة الأخرى ...
    " طبعا باستخدام حلقة For " لتسهل العملية ...

    عموما تمرير المتغيرات بالعنوان له فوائد كبيرة عند تمرير الكائنات الكبيرة والضخمة الى احدى الدوال ... حيث ستستهلك عملية النسخ العادية الكثير من الوقت ....
    لذا يلجأ المبرمجون عادة الى التمرير بالعنوان في نسخ الكائنات " Classes " ...
    .........................

    الفرق الثاني اننا قلنا :
    حجم مصفوفة المؤشرات ديناميكي ولايشترط معرفته قبل وقت التشغيل ... أما حجم المصفوفات العادية فهو ثابت ويجب معرفته قبل وقت التشغيل ...

    وهي المشكلة الأزلية التي لايمكن حلها مطلقا الا بالمؤشرات ...
    وتواجه معظم مبرمجي السي ++ المبتدئين ....
    حيث اذا أردنا من المستخدم ادخال عدد من الأرقام .. وسنقوم بترتيبها لاحقا ... ولكننا لانعلم عدد الأرقام الذي سيدخلها المستخدم .... ويجب طبعا أن نعلم عدد الأرقام المراد تخزينها .. فعندها سنطلب من المستخدم قبل ان يبدأ في عملية ادخال الارقام أن يدخل عدد هذه الارقام ... لنتمكن من أن نحجز لها مكانا لاستقبالها في الذاكرة ...
    " يوجد حل عملي أكثر بحيث لانطلب من المستخدم ان يدخل عدد الأرقام .. بل يبدأ مباشرة بادخال الأرقام سنتطرق له لاحقا ..." ,

    في هذه اللحظة بعد ادخال عدد الأرقام سنحجز بها عدد من الخانات في الذاكرة كالتالي ..
    نفرض أن المستخدم سيدخل عدد الأرقام في المتغير x ...

    مثال 2 :

    int x
    cin >> x
    [ int * q = new int [x
    ...

    هكذا تم حل المشكلة فالمصفوفة المؤشرة q حجمها سيناسب عدد الأرقام التي ستدخل فيها ...
    الان يأتي سؤال مهم ... لماذا لانستخدم المصفوفات العادية في ذلك ...
    أي تكون ..

    مثال 3:

    int x
    cin >> x
    [ int q [x
    ...


    المثال 3 لن يعمل ... وسيقوم المصرف باصدار خطأ بأن حجم المصفوفة q غير معروف ... لأن المصفوفات العادية يجب معرفة حجمها وقت تنفيذ البرنامج وليس وقت استخدام البرنامج ....
    أم المؤشرات فلا مشكلة لديها في ذلك ...
    ويعود السبب في ذلك الى ان المصفوفات العادية يتم تخزينها بالنسبة للبرنامج في ذاكرة المكدس الخاصة بالبرنامج ...
    أما مصفوفات المؤشرات فانها تخزن في الذاكرة التكويمية .. ماعلينا ...
    فقط عرفنا مايجب فعله ومالايجب ,,,,

    ............

    الان الفرق الثالث :
    يمكن الغاء الذاكرة الخاصة بمصفوفات المؤشرات في أي وقت من البرنامج ,, واذا نسيت الغاءها فلن يلغيها لك البرنامج الا بعد انتهاءه وتوقفه عن العمل ...أما الذاكرة الخاصة بالمصفوفات العادية فلا يمكنك الغاءها متى تشاء فالغائها يتم بشكل الي بعد الخروج من مدى الرؤية الخاص بها " SCOPE"....
    ..
    بداية مالسبب الذي يدعوك لالغاء ذاكرة قمت بتخصيصها لبيانات معينة ؟؟
    السبب دائما مايرجع الى استهلاك موارد الذاكرة مما لاطائل له .. يعني يمكن في لحظة معينة أن لانحتاج الى 1000000 متغير محجوز في مصفوفة من نوع int أي اننا سنحجز 4 ميجابايت من الذاكرة .... فبعد ان لانحتاج لهذه المتغيرات بتاتا يجب أن نحاول أن نقوم بالغاءها لنزيد من فعالية البرنامج ولافاح مجال الذاكرة للمتغيرات الجديدة ...
    في هذا السيناريو لو كنا نستخدم المصفوفات العادية لأنتظرنا القدر ليأتي وينهي الدالة التي تم حجز المصفوفة داخلها ليقوم بتدمير المصفوفة .. "بعد الانتهاء من تنفيذ الدالة "
    ... قرر مصممو السي++ ايجاد حل لهذه الحماقة فقامو باختراع المؤشرا تلتعطي حرية وقت حذف النتغيرات ...
    خذ المثال ..

    مثال 4:

    [ int * q = new int [1000000000
    ...
    .
    .
    .
    .
    الان بعد ان لانكون بحاجة الى المصفوفة المؤشره أعلاه سنقوم بحذفها كالتالي :

    delete [] q

    لاحظ الى الصيغة المستخدمة .. ولتعلم أن delete هو أمر اساسي جديد سيتغير لونه للأزرق وهو مضاد للأمر الاساسي new الذي نحجز به الذاكرة ....
    بعد السطر أعلاه " سطر ال delete " سيتم تحرير الذاكرة فورا من الذاكرة ولن يعود هناك وجود في الذاكرة للمتغيرات التي كانت موجودة في المصفوفة المؤشرة بتاتا ...
    لاحظ في صيغة ال delete أن المعقفات [] موجودة قبل المتغير q ... وهذا يعني أننا نريد حذف كل المصفوفة ...
    وطبعا بعد حذف المصفوفة وقمنا بتعيين قيمة جديدة لأحد العناصر كالتالي ..

    q [ 2 ] =11سيحدث خطأ انتهاك للذاكرة .. لأننا أعدنا المصفوفة لفترة ماقبل التاريخ .. فيجب مرة أخرى قبل استخدام المصفوفة أن نقوم بحجز خانات لهذه المصفوفة...
    [ q = new int [1233333333

    هذا شرح مختصر جدا للفرق بين المصفوفات والمؤشرات ...
    سندخل في الأيام التالية لبعض المواضيع الأكثر حماسا ... وسيتعلق الأمر بالمتغير void والكائنات ... ومصفوفات التي تخزن قيما لمؤشرات ...ونأخذ نظرة سريعة على اللوائح المربطة " Link List " ثم سنتناول العلاقة بين الكائنات والوراثة وتعدد الأشكال والمؤشرات ... ونعرف كيف يمكننا أن ننشيء مؤشرا لمؤشر .. بحيث نقوم بتخزين عنوان العنوان ..... وكان الله في العون ...
    وسنحاول بقدر المكان أن نجعل هذه الجلسات ناضجة لتكون مرجعا لابأس به لمن كان لديه لبس في موضوع المؤشرات ,,,,


    تحياتي Rolling Eyes Like a Star @ heaven

    ندى الأيام
    مراقبة عامة
    مراقبة عامة

    انثى
    عدد الرسائل : 616
    العمر : 28
    البلد : اليمن
    القسم والمستوى : طالبة
    المزاج : عال
    العضوية : 20
    أختر علم دولتك :
      :
    السٌّمعَة : 1
    نقاط : 32
    تاريخ التسجيل : 12/12/2007

    بطاقة الشخصية
    تخصصي: حاسوب
    المحافظة: المحويت

    رد: ++c المؤشرات

    مُساهمة من طرف ندى الأيام في السبت فبراير 23, 2008 4:06 am

    موضوع حلو جدا ومفيد

    بس هل سندرس السي في الترم الثاني ايضا؟؟؟

    طارق البغوي
    المدير العام للمنتدى
    المدير العام للمنتدى

    ذكر
    عدد الرسائل : 2833
    العمر : 29
    البلد : الجهورية اليمنية
    القسم والمستوى : خريج قسم الرياضيات 2010م
    المزاج : متقلب ( مزاج شاعر )
    أختر علم دولتك :
      :
    السٌّمعَة : 14
    نقاط : 985
    تاريخ التسجيل : 28/09/2007

    بطاقة الشخصية
    تخصصي: رياضيات
    المحافظة: الحديدة

    رد: ++c المؤشرات

    مُساهمة من طرف طارق البغوي في السبت فبراير 23, 2008 5:45 am

    إنشاء الله تدرسوها

    بس الله يعينكم عليها........


    _________________

    أذا ما ذكرت أسمها بت أغفوا


    أعانقها في هدوء الحياء


    وصمت المحبة


    أرشف من هجرها


    نبع روحي


    لتنبت بين ضفائرها قصة


    تقول ألتقينا ...


    والكن ...


    على نصف حلم بكينا


    فتغتصب الشوق


    وردة الخريف
    نائب المدير
    نائب المدير

    انثى
    عدد الرسائل : 1374
    العمر : 29
    البلد : اليمن
    القسم والمستوى : معلم حاسوب
    المزاج : ممتاز
    العضوية : 75
      :
    السٌّمعَة : 9
    نقاط : 586
    تاريخ التسجيل : 21/01/2008

    بطاقة الشخصية
    تخصصي: حاسوب
    المحافظة: الحديدة

    رد: ++c المؤشرات

    مُساهمة من طرف وردة الخريف في السبت فبراير 23, 2008 6:05 am

    بصراحة حسيت بصداع
    الله يعيننا0000000000
    ان شاء الله ماندرسها00 سمعت ان بيكون عندنا الترم الثاني شبكات وقواعد بيانات وهياكل بيانات

    ماجد العريفي
    إعلامي
    إعلامي

    ذكر
    عدد الرسائل : 681
    العمر : 29
    البلد : اليمن
    القسم والمستوى : خريج قسم معلم حاسوب
    المزاج : سكر
    العضوية : 15
    أختر علم دولتك :
      :
    السٌّمعَة : 10
    نقاط : 198
    تاريخ التسجيل : 11/11/2007

    بطاقة الشخصية
    تخصصي: حاسوب
    المحافظة:

    رد: ++c المؤشرات

    مُساهمة من طرف ماجد العريفي في السبت فبراير 23, 2008 6:16 am

    مشكورين علي الردود ولكن انا ما طرحت هذا الموضوع لاننا سوف ندرسة ولكن للفائدة
    تحياتي

    وردة الخريف
    نائب المدير
    نائب المدير

    انثى
    عدد الرسائل : 1374
    العمر : 29
    البلد : اليمن
    القسم والمستوى : معلم حاسوب
    المزاج : ممتاز
    العضوية : 75
      :
    السٌّمعَة : 9
    نقاط : 586
    تاريخ التسجيل : 21/01/2008

    بطاقة الشخصية
    تخصصي: حاسوب
    المحافظة: الحديدة

    رد: ++c المؤشرات

    مُساهمة من طرف وردة الخريف في الأحد فبراير 24, 2008 7:01 am

    كلامك صحيح
    المفروض ان كل واحد مننا يحاول يثقف نفسه ويتطور في مجال دراسته
    بس نحن صرنا نفكر في امتحانات المادة اكثر من المادة نفسها

    ماجد العريفي
    إعلامي
    إعلامي

    ذكر
    عدد الرسائل : 681
    العمر : 29
    البلد : اليمن
    القسم والمستوى : خريج قسم معلم حاسوب
    المزاج : سكر
    العضوية : 15
    أختر علم دولتك :
      :
    السٌّمعَة : 10
    نقاط : 198
    تاريخ التسجيل : 11/11/2007

    بطاقة الشخصية
    تخصصي: حاسوب
    المحافظة:

    رد: ++c المؤشرات

    مُساهمة من طرف ماجد العريفي في الأحد فبراير 24, 2008 9:00 am

    شكرا لكي علي تفهمكي الوضع الحاصل لجميع الطلاب بشكل عام الا من رحم ربي
    تحياتيLike a Star @ heaven

    غني عن التعريف2
    عضو فعال
    عضو فعال

    ذكر
    عدد الرسائل : 106
    العمر : 28
    البلد : اليمن
    القسم والمستوى : كلية التربية قسم معلم حاسوب مستوى رابع
    المزاج : عشق الخيال
    العضوية : 104
    أختر علم دولتك :
      :
    السٌّمعَة : 0
    نقاط : 25
    تاريخ التسجيل : 04/03/2008

    بطاقة الشخصية
    تخصصي: حاسوب
    المحافظة: الحديدة

    رد: ++c المؤشرات

    مُساهمة من طرف غني عن التعريف2 في الثلاثاء مارس 04, 2008 10:38 am

    مشكور اخي هذا المطلوب والذي كنت ابحث عنة
    موضوع مميز
    تسلم Cool

    ندى الأيام
    مراقبة عامة
    مراقبة عامة

    انثى
    عدد الرسائل : 616
    العمر : 28
    البلد : اليمن
    القسم والمستوى : طالبة
    المزاج : عال
    العضوية : 20
    أختر علم دولتك :
      :
    السٌّمعَة : 1
    نقاط : 32
    تاريخ التسجيل : 12/12/2007

    بطاقة الشخصية
    تخصصي: حاسوب
    المحافظة: المحويت

    رد: ++c المؤشرات

    مُساهمة من طرف ندى الأيام في الأحد مارس 09, 2008 11:03 pm

    هههه موضوع فعلا مميز00

    غني عن التعريف2
    عضو فعال
    عضو فعال

    ذكر
    عدد الرسائل : 106
    العمر : 28
    البلد : اليمن
    القسم والمستوى : كلية التربية قسم معلم حاسوب مستوى رابع
    المزاج : عشق الخيال
    العضوية : 104
    أختر علم دولتك :
      :
    السٌّمعَة : 0
    نقاط : 25
    تاريخ التسجيل : 04/03/2008

    بطاقة الشخصية
    تخصصي: حاسوب
    المحافظة: الحديدة

    رد: ++c المؤشرات

    مُساهمة من طرف غني عن التعريف2 في الإثنين مارس 10, 2008 9:36 am

    هههه انا نسيت كمان ان صاحب الموضوع كمان مميز
    تحياتي Cool

    wafaahmed
    عضو جديد
    عضو جديد

    انثى
    عدد الرسائل : 1
    العمر : 25
    البلد : السعودية
    القسم والمستوى : نظم معلومات ادارية المستوى الخامس
    المزاج : عادي
    أختر علم دولتك :
      : بلادي وان جارة علي عزيزة
    السٌّمعَة : 0
    نقاط : 1
    تاريخ التسجيل : 09/11/2013

    رد: ++c المؤشرات

    مُساهمة من طرف wafaahmed في السبت نوفمبر 09, 2013 4:17 am

    انا مش من جامعتكم بس لان الماده تعبتني اضطيت اتطفل عندكم Sad سامحوني

      الوقت/التاريخ الآن هو الأحد ديسمبر 04, 2016 11:26 pm