بتـــــاريخ : 2/22/2011 8:26:52 PM
الفــــــــئة
  • الحـــــــــــاسب
  • التعليقات المشاهدات التقييمات
    0 877 0


    جزء من النص مفقود عن (المؤشرات Pointers) المؤشر الثابت و المؤشر إلى ثابت و الهجين المؤشر الثابت إلى ثابت

    الناقل : elmasry | العمر :42 | الكاتب الأصلى : ♥ حُوريّة ♥ | المصدر : www.arabteam2000-forum.com

    كلمات مفتاحية  :
    المؤشرات Pointers المؤشر الهجين

    السلام عليكم.

    صباح الخير, انا صاحية نشيطة هذا الصباح لكن نمت وانا جالسة افكر بموضوع "المؤشرات مالها و ما عليها" المثبّت بالمنتدى. و بالطبع عنوان موضوعي "جزء من النص مفقود" قاصدة بالنص هنا هو موضوع "المؤشرات مالها وما عليها". لأني قرأته المغرب البارحة واطلعت على بعض المواضيع الملحقة بالمؤشرات و المثبتة بالمنتدى. لكن لم اجدها تتطرق إلى هذا الموضوع اللي انا حابة اباشر فيه واقدم نبذة عنه. و هو المؤشر الثابت Constant Pointer و المؤشر إلى ثابت Pointer to a constant. أما لو كان هناك موضوع عائم بصفحات المنتدى تطرق إلى هذه الأشياء مسبقاً فبحول الله رح يكون هذا الموضوع معزّز وداعم له و (التكرار يعلّم الشطّار). اوكي, رايحة استغل الساعة هذه واقدم لكم الموضوع,.
    بالطبع موضوعي ليس ابتدائياً و موضوع "المؤشرات مالها وما عليها" و الملحقات المتعلقة بالموضوع للأخت بنت اليمن مواضيع جديرة بالتقدير وجزيلة معلوماتياً, لذلك انا انصح بقرائتها و فهمها قبل الخوض بموضعي هذا عن طريق الرابط التالي:
    مواضيع المنتدى المثبّتة أو الانتقال إلى اي مرجع آخر متعلق بالمؤشرات. أما بالنسبة للاشخاص اللي عندهم خلفية مسبقة لو بتقدير مقبول عن المؤشرات فـ ياريت يكملوا معي.

    تمهيد:
    أولاً يحظرني في هذا الوقت بالذات اربع مسلّمات (بديهيات) للمؤشرات في لغة C++ وهي كالتالي:

    1. عند استخدام المؤشرات فليس هناك إلاّ جوهرتين فقط, هما المؤشر pointer و الكائن object الذي يشير إليه.
    2. إذا احتوى المؤشر pointer على قيمة فهي إما عنوان لكائن Object Address في الذاكرة أو لا شيء NULL وهي قيمة صفر, مثل:

    MyClass *ptr = 0;//Null Pointer

    فهذا يسمى مؤشر إلى "لا شيء" NULL Pointer.
    3. حجم و مساحة مؤشر لكائن ضخم مثل (الجبل) هو نفس حجم و مساحة مؤشر لكائن زغير مثل (العصفور). هذا يعني بكل بساطة مساحة (الحجم الفعلي في الذاكرة) المؤشرات دائماً متساوية لأنها لا تحمل إلا عناوين ثابتة في الذاكرة لها نفس الحجم نسبةً إلى نظام عنونة الذاكرة من جهاز إلى جهاز آخر أو من بيئة إلى أخرى. لاحظوا الشيفرة التالية لترسيخ هذي المعلومة:
    int *ptrInt = new int(10);//Pointer to int data type
    double *ptrDouble = new double(30.523);//pointer to double data type.

    //Print the size of both ptrInt and ptrDouble:
    cout << "ptrInt size is: " << sizeof(ptrInt) << " byte(s)" << endl;
    cout << "ptrDouble size is: " << sizeof(ptrDouble) << " byte(s)" << endl;

    لاحظوا ناتج البرنامج:
    CONSOLE
    ptrInt size is: 4 byte(s)
    ptrDouble size is: 4 byte(s)

    بالطبع اربعة Byte حجم مؤشر لنوع int وَ حجم مؤشر لنوع double نسبة إلى نظام عنونة الذاكرة في جهازي 32-bit. سامحوني بالنسبة للمثال استخدمت الأمر new مباشرة لكائن int و double لمحاكاة الطريقة النموذجية من إنشاء المؤشرات في امور متقدمة, بالإضافة إلى اهمالي لأوامر تحرير الذاكرة وذلك لعدم إزحام الشيفرة وتشتيت اذهان القراء كثيراً.
    4. المسلّمة الرابعة, هي أن المؤشر لا يشير إلا لكائنات من نفس النوع (مثلاً, مؤشر لعدد صحيح لا يشير إلا لكائن عدد صحيح...الخ) , الشيفرة التالية خطأ:
    int *ptrInt = new double(23.0);//Fatal error…Because there is no way to convert from double to int

    حتى الشيفرة التالية خطأ بالرغم من إمكانية التحويل الضمني implied promotion من int إلى double
    double *ptrDouble = new int(24);//Fatal error...for the same reason too.

    صُلب الموضوع:
    سنتعرف هنا على ثلاث انواع تقريباً من المؤشرات و التي لها بريق لامع في برامج متقدمة. النوع الأول و هو مؤشر ثابت constant pointer يختلف تماماً بل ضد النوع الثاني مؤشر لــثابت pointer to a constant و ثم النوع الثالث و الذي هو عبارة عن هجين hybrid(متجانس) من النوعين السابقين. نبدأ صلب الموضوع باسم الله:

    مؤشر ثابت constant pointer:
    الهيكل النحوي لهذا النوع كالتالي:
    LEFT TO RIGHT
    type * const ptrName = &obj;

    عند التعامل مع هذا النوع فإنه يجب علينا إعتبار النقاط التالية:
    - يجب تعيين الكائن لهذا المؤشر كعنوان استهلالي عند إنشائه. هذا يعني أن هذا المؤشر لن يشير إلا لهذا الكائن فقط لا غير طوال دورة حياة البرنامج Program life-cycle.
    - يجب أن يكون الكائن المُشار إليه بهذا النوع من المؤشرات متغيراً (أي ليس ثابت منشيء بواسطة الكلمة const).
    الخلاصة: يمكننا تغير قيمة الكائن المُشار إليه بهذا النوع من المؤشرات مع عدم إمكانيتنا من جعله يشير إلى كائن آخر.
    تلميح: لتذكر اسم هذا النوع من المؤشر اقرأوه من اليمين لليسار من النموذج السابق (انظر عند اسم المؤشر ثم انتقل إلى جهة اليمين لأرى كلمة constant ثم إشارة النجمة الخاصة بالمؤشر pointer فنتهجاها بــ Constant Pointer. التالي عبارة عن سطور لشيفرة تصف استخدامات هذا النوع بشكل مبسط:
    int obj1, obj2 = 0;
    int * const ptr = &obj1;
    *ptr = 10;//Ok, change the value to which it point to.
    cout << obj1 << ' ' << (*ptr) << endl;
    //ptr = &obj2; Error, It can't point to anothor object
    *ptr = 30;//Ok, change the value again...

    الإستعمال الجوهري لهذا النوع: هو استخدامه لتمرير كائن object إلى إجراء function بحيث نحافظ على ثبات المؤشر داخل الاجراء ليشير فقط إلى ذلك الكائن مع إمكانية تغيير قيمة ذلك الكائن. تتبعوا المثال التالي:
    //Authord by Raghad to illustrate constant pointer.
    #include <iostream>
    using std::cout;
    using std::endl;

    void func(int * const);
    int main()
    {
            int obj;
            obj = 4000;
            func(&obj);//Passing the address of obj to func()…acts as initialization
     
            cout << obj << endl;// It's 40
            return 0;
    }
    void func(int * const ptr)
    {
            int someVar = 40;
            // ptr = &someVar; Error, we can't change the address(obj).
            *ptr = someVar; //Ok, just change the value of (obj) itself.

    }

    مؤشر لــثابت Pointer to a constant:
    الهيكل النحوي لهذا النوع كالتالي:
    LEFT TO RIGHT
     
    const type * ptrName;

    هذا النوع تقريباً ضد او معاكس النوع السابق constant pointer. رايحة اسرد خصائصه على شكل نقاط كالتالي:
    - لا يجب تعيين كائن object كعنوان استهلالي لهذا المؤشر, و هذا يعني أن المؤشر يمكن استخدامه للإشارة إلى كائنات أخرى طوال فترة حياة البرنامج Program Life-Cycle.
    - لا يمكن تغير قيمة او محتوى الكائن الذي نُشير إليه بواسطة هذا النوع من المؤشرات, و بالتالي فهو مناسب للإشارة إلى متغير عادي او إلى ثابت (ناشيء بواسطة الامر const).
    الخلاصة: يمكن بواسطة هذا النوع الإشارة إلى اكثر من كائن طوال فترة تنفيذ البرنامج و يمكن أن تكون هذه الكائنات متغيرات او ثوابت. أما الذي لا يمكننا عمله بواسطة هذا النوع هو تغير قيمة ذلك الكائن الذي يشير إليه.
    تلميح: لتذكر اسم هذا النوع نقرأ ايضاً من اليمين إلى اليسار من النموذج للهيكل النحوي بالأعلى ابتداء من اسم المؤشر نجد علامة النجمة و تُقرأ pointer مؤشر إلى(to) ثابت const.
    السطور التالية توضح بعض الاستعمالات و القيود restrictions لهذا النوع:
    int obj1, obj2;
    const int NORMAL_CONST = 23;
    obj1 = obj2 = 0;
    const int *ptr;//Pointer to a constant.
    //Usage:
    ptr = &NORMAL_CONST;//It can point to constant
    cout << (*ptr) << endl;
    ptr = &obj1;//Ok, It’s allowed to change pointing to another object.
    // *ptr = 30; Error, we can't use it to change the values directly.
    ptr = &obj2;//Ok

    الإستعمال الجوهري لهذا النوع: هو استخدامه لتمرير كائن object متغير أو ثابت إلى إجراء function بحيث نزيد من مرونة المؤشر بالسماح له بالإشارة إلى كائنات objects عديدة داخل الإجراء مع الحفاظ على ثبات القيم لهذه الكائنات وعدم المساس بها أثناء التنقل من كائن إلى آخر.

    مؤشر ثابت إلى ثابت Constant Pointer to a Constant:
    الهيكل النحوي لهذا النوع كالتالي:
    LEFT TO RIGHT
     
    const type * const ptrName = &obj;

    هذا النوع هو النوع الهجين(المتجانس) من النوعين السابقة. فهناك بعض العوامل المشتركة بينه وبين النوع الاول constant pointer و الآخر pointer to a constant و هي كالتالي:
    يشترك مع المؤشر الثابت constant pointer في التالي:
    - يجب تعيين الكائن لهذا المؤشر كعنوان استهلالي عند إنشائه. هذا يعني أن هذا المؤشر لن يشير إلاّ لهذا الكائن فقط لا غير طوال دورة حياة البرنامج Program life-cycle.
    يشترك مع المؤشر لــثابت pointer to a constant في التالي:
    - يمكنه الإشارة إلى كل من كائن object متغير non-constnat و إلى ثابت constnat ايضاً.
    - بالإضافة إلى ذلك فإننا لا يمكننا تغير قيم الكائنات التي يشير إليها إطلاقاً.
    تلميح: تتبعوا القراءة بنفس الطرق الأولى من اليمين إلى اليسار ابتداء من اسم المؤشر من الهيكل النحوي بالأعلى. Constant والنجمة pointer إلى(to) constant.
    نلعب مع هذا النوع من خلال السطور التالية: اوووبز؟؟؟ باين عليه ما يبغى يلعب معانا (ثقيل دم) غير مرن ما يبغى يشير إلى كائن آخر و لا يبغى يغير قيمة هذا الكائن. أوكي رايحة اسميه المؤشر الوفيّ The Loyal Pointer :
    int uglyObj = 20;
    const int * const ptr = &uglyObj;//ptr points to uglyObj for ever just because it is the first love(initialized).
    cout << (*ptr) << endl;
    // *ptr = 30;Error, no way to change its mind(the value to which it points).
    int beautifulObj = 30;//New beautiful object.
    //ptr = &beautifulObj;Error, no way to capture its heart (to point to something else)

    الاستعمالات الجوهرية: ايضاً مثل السابقات و لكن للإشارة إلى كائن ضخم للقراءة فقط.
    تنويه: بالطبع الكلام حول المؤشرات و تمرير البيانات إلى الإجراءات ما يخلص في لغة C++ و هذا إن دل! دل على قوة هذه اللغة وامتداد تراكيبها النحوية و التقنية. و بالنهاية راجية من الله عز و جل اكون وصلّت فكرة هذي النوعين أو بالأحرى الثلاث انواع من المؤشرات.

    تمنياتي لكم بالتوفيق

    كلمات مفتاحية  :
    المؤشرات Pointers المؤشر الهجين

    تعليقات الزوار ()