المؤشرات

بسم الله الرحمن الرحيم

—————–

أخيراً يا علاء ستضع درس كويس … ؟

بدلاً من المقالات التي مللنا منها … 😛

—————–

مقدمة …

دلفي لغة قوية (معروفة !) , وتحتوي على العديد من المصطلحات الجديدة والتي لم تكن موجودة في VB , والتي يعتبرها البعض “لغة برمجة قوية” !!! 😛

—————–

ما هي المؤشرات … ؟

المؤشرات , من اسمها تعني انها تشير إلى شيء ما . هذا الشيء هو عنوان في الذاكرة

صعبة ؟ … ابسطهالك :

نفرض أنك تسكن في شقة , هذه الشقة في المدينة . وهذه الشقة لها عنوان , وانت قمت بوضع العنوان على بطاقة , ووزعته على حبايبك

في هذا المثال : المدينة هي RAM , الشقة هي المكان المحجوز في الذاكرة , انت هو القيمة المخزنة في هذا المكان , عنوان الشقة هنا هو عنوان المكان المخزن فيه القيمة في الذاكرة , البطاقة هنا هي المؤشر الذي نتحدث عنه …

صعبة ؟ … ابسطهالك :

شرح الصورة السابقة :

المربع الأصفر الكبير = ذاكرة الجهاز RAM .

المربعات الحمراء الصغيرة = أماكن تخزين البيانات داخل الذاكرة .

الدائرة الحمراء = هي بيانات مخزنة داخل الذاكرة (وليكن القيمة الرقمية 12345) .

المربع الأخضر = عنوان مكان تخزين القيمة .

المربع الأزرق = المؤشر … ويحتوي على قيمة هي عنوان مخزن البيانات .

—————–

فوائد المؤشرات …

استخدام المؤشرات يزيد سرعة برنامجك , لأنها توفر لك وصولاً سريعاً ومباشراً إلى ذاكرة الجهاز .

كما انها توفر إمكانات مميزة , وتوفر عليك الكثير الكثير من الوقت (خصوصاً في دلفي) .

كما أنها من المهارات الأساسية للمبرمجين المحترفين , والتي يجب ان يكون المبرمج على دراية وإحاطة جيدة بها , لأنها تعتبر من مميزات وأساسيات لغة دلفي .

—————–

أنواع المؤشرات …

المؤشرات نوعان :

النوع الأول : Typed Pointers … وهي المؤشرات التي تستخدم مع أنواع (Types) معينة , أو نوع بيانات معين .

النوع الثاني : Untyped Pointers … وهي أكثر شمولاً , وتستخدم مع أي نوع من أنواع البيانات .

—————–

تعريف المؤشرات …

وهذا في قمة قمة السهولة , فقط ضع الرمز “^” قبل نوع البيانات .

مثلاً : لتعريف متغير من النوع الرقمي نكتب :
Var
I : Integer ;

لكن لتعريف مؤشر Typed نكتب :

Var
P : ^Integer ;

يااااااه , دي سهلة خالص !

والآن , سيمكنك استخدام المؤشر P للإشارة إلى أي مكان في الذاكرة . شرط أن يحتوي هذا المكان على قيمة من النوع Integer فقط (طبعاً , لأننا عرفنا مؤشر من النوع Typed) .

لكن توقف , لا تحاول استخدام المؤشر P , فنحن لم ننته من بعد

وهذا لأننا لم نقم بتعيين قيمة له ! فماذا تتوقع من مؤشر أن يعطيك , وأنت لم تقم بتعيين قيمته بعد ؟! بالطبع سيشير إلى قيمة خاطئة , أو عنوان خاطئ في الذاكرة .

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

لتعيين قيمة مؤشر , فهذا أمر في قمة قمة السهولة , فكل ما عليك هو كتابة رمز @ قبل اسم المتغير الذي تريد من المؤشر أن يشير إلى مكانه في الذاكرة .

فمثلاً , لنفرض أنك قمت بتعريف المتغير i السابق , والمؤشر P أيضاً

الكود التالي لربط المتغير بالمؤشر :

P := @I ;

ولعرض قيمة المؤشر , نكتب الكود التالي (في Console Application)

WriteLn(Integer(P)) ;

الآن يصبح الكود حتى الآن هو :

Var
I : Integer ;
P : ^Integer ;
Begin
I := 100 ; // تعيين قيمة المتغير
WriteLn(I) ;
P := @I ;
WriteLn(Integer(P)) ;
ReadLn ; // هذه الكلمة تتيح لك فرصة قراءة المكتوب في نافذة التطبيق

—————–

تغيير قيمة المتغير من خلال المؤشر …

بعدما عرفنا المؤشر , وجعلناه يعرض عنوان متغير ما في الذاكرة . سنقوم بتغيير قيمة المتغير i من خلال المؤشر P

ولفعل ذلك , نضع الرمز “^” بعد اسم المؤشر , عند القيام بعملية تعيين القيمة .

فنضع الكود التالي بعد السطر الخاص بربط المتغير بالمؤشر :

P^ := 200 ;
WriteLn(I) ;

فيصبح الكود :

Var
I : Integer ;
P : ^Integer ;
Begin
I := 100 ; // تعيين قيمة المتغير
WriteLn(I) ;
P := @I ;
P^ := 200 ;
WriteLn(I) ;
ReadLn ; // هذه الكلمة تتيح لك فرصة قراءة المكتوب في نافذة التطبيق

لاحظ الآن ان البرنامج سيعرض القيمتين 100 ثم 200 .

جرب مثلاً استبدال i في السطر قبل الأخير في الكود السابق , وضع بدلاً منها P ثم رمز “^” ولاحظ النتيجة … 200 .

—————–

المؤشرات من النوع Untyped …

الجزئان السابقان تحدثا عن المؤشرات من نوع Typed , لكن الآن لنتحدث عن المؤشرات Untyped , والتي تشير إلى أي نوع بيانات (كما ذكرت في البداية)

هناك فرقان أساسيان من ناحية كتابة الكود , بين المؤشرات Typed و Untyped :

الفرق الأول :

لتعريف مؤشر Typed نكتب :

P : ^DataType ;

ونضع نوع البيانات المطلوب

لكن لتعريف مؤشر Untyped نكتب :

P : Pointer ;

الفرق الثاني :

لزيادة قيمة متغير من خلال مؤشر Typed نكتب :

Inc(P^) ;

لكن لزيادة قيمة متغير من خلال مؤشر Untyped نكتب :

Inc(PDataType(P)^) ;

حيث أن PDataType قد تكون PString , PChar , PInteger … إلخ , المهم ان تضع P قبل اسم نوع البيانات

ملحوظة هامة : حرف P في كلمة PDataType لايشير إلى المؤشر P , إنما يوضع لدلالة على ان نوع البيانات سيشار إليه بالمؤشر P . أي انه إذا كان اسم المؤشر هو MySuperPointer ومن النوع Integer فنكتب :

Inc(PInteger(MySuperPointer)^) ;

وبهذا , يصبح الكود الخاص بالمؤشرات Untyped هو :
Var
Int : Integer ;
Pon : Pointer ;
Begin
Int := 2007 ;
WriteLn(Int) ;
Pon := @Int ;
Inc(PInteger(Pon)^) ;
WriteLn('Now Int = ' , Int) ;

—————–

تحرير المؤشر …

كل ما تفعله هو وضع القيمة الخالية nil في المؤشر عن طريق الكود التالي :

P := nil ;

وهذا لتحريره , وجعله لايشير إلى أي متغير .

—————–

طبعا المؤشرات ليست بهذه البساطة , ولا بهذا المستوى

هناك العديد من الاستخدامات والأفكار والطرق وغيرها …

يمكنك الاستفادة من المصادر التالية :

http://www.delphibasics.co.uk/Article.asp?Name=Pointers

http://en.wikipedia.org/wiki/Pointers

أيضاً كتاب Inside Delphi 2006

—————–

ملاحظتان ختاميتان :

الأولى : الكود النهائي لهذا الشرح هو :

var
I : integer ;  // تعريف متغير رقمي
P : ^integer ; // تعريف المؤشر
Int : integer ;
Pon : Pointer ; // Untyped تعريف مؤشر من النوع
begin
WriteLn('1- Typed Pointers') ;
I := 100 ; // تعيين قيمة المتغير
WriteLn('I = ' ,I) ; // عرض قيمة المتغير
P := @I ; // ربط المتغير بالمؤشر
P^ := 200 ; // تغيير قيمة المتغير من خلال المؤشر
WriteLn('Now I = ' ,P^) ; // عرض قيمة المتغير بعد التعديل
//-------------------------------------
WriteLn('') ;
WriteLn('Untyped Pointers') ;
Int := 2007 ;
WriteLn('Int = ' , Int) ;
Pon := @Int ;
Inc(PInteger(Pon)^) ; // Pon زيادة قيمة المتغير الذي يشير إليه المؤشر
WriteLn('Now Int = ' , Int) ;
ReadLn ; // ترك فرصة لقراءة ما قمنا بطباعته على النافذة
end.

الثانية : ان الشرح مترجم من كتاب Inside Delphi 2006 , لكن ليس حرفياً , وإنما اخترت أجزاء معينة , وعرضتها بأسلوبي وأضفت عدة أشياء أخرى

13 responses to “المؤشرات

  1. تعالى بقى يا علاء عندنا فى ++C و شوف شغل المؤشرات على حق 😉
    شرحك ممتاز , بارك الله فيك

  2. Omar Eladel … خطأ … فهل تعرف الدلفي لتحكُم ؟؟
    المقالة فوق مبسطة (مشكور علاء)

    شخصيا لا أرى فرق كبير بين باسكال الغرضية و c++
    و الباسكال أسهل كتابة و فهما
    ———————–
    علاء
    جرب العمل مع السلاسل النصية و ستظهر الفائدة الكبيرة (للقراء) و خاصة عندما تريد انشاء ملف خاص ذو هيكيلية خاصة بك.

    امرو اخرى مثل التعامل مع الذاكرة

    هذا الرابط مفيد أيضا
    http://rvelthuis.de/articles/articles-pointers.html

  3. جميل , هل تعرف كتاب C++ How to Program انت شرحت المؤشرات اسهل منه
    شرحك ممتاز , المبرمج الخبير يوظف المؤشرات بشكل ذكي ( لينتج الفن )
    يمكنك النظر الى اكواد برامج او امثلة مفتوحة المصدر اللتي تحتوي على فكرة او فكرتين حول المؤشرات لتكتسب مهارة في استخدامها ( هذه أفضل طريقة استخدمها الى الان )

  4. جيد اخي علاء
    كثير من الناس يعتقدون ان المؤشرات تقتصر على لغة ++c
    ومن واقع تجريبتي ان المؤشرات في الباسكال تنافس c
    وفقنا الله واياكم

  5. أخي مروان :
    جزاك الله ألف خير , وشاكر لك مرورك الكريم

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

    أخي علي :
    الدلفي والباسكال قريبين جدا من لغات C .
    سواء في القوة , أو التقنيات (كالمؤشرات وغيرها…)
    وهذه تعتبر من نقاط قوة دلفي , وأسباب انتقالي لها

    وشاكر لك مرورك

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

  7. اهلا بالمدون الصغير 😛 …

    لا خناقة ولاحاجة يا جماعة , هو فاكر ان البلس بلس احسن من دلفي 😛

    بعدين معظم الاخوة اللي هنا دلفاوية … يعني خلي بالك 😛

  8. بارك الله فيك يا أخي الكريم ,,

    هل لي بسؤال لو سمحت !؟

    هل يمكن بالمؤشر معرفة القيمة المخزنه !؟

    بمعنى : انا لدي قيمة مخزنة في متغير بالذاكرة ,,

    بالطبع أستطيع أن أحدد عنوان القيمة عن طريق المؤشر ,,

    طيب لو أنا حددت عنوان القيمة هل يمكن أن أعرفها !؟

    وبالتوفيق

  9. انت عرف المؤشرات طرق استخدامها

    بالنسبة ليا موضوع الموشرات جديد كنت عايز اعرف الفرق بينها وبين المتغيرات

    وامتي استخدمها ومينفعش استخدم بديل غيرها

    • المؤشرات تشير إلى عنوان في الذاكرة , والمتغيرات إلى القيمة المخزنة في العنوان .
      مثلاً محمد يسكن في 1234 شارع 5 , العنوان (المؤشر) هو 1234 شارع 5 , وقيمته (المتغير) هو محمد .

      تفيد عندما يكون لديك عنوان المتغير وتريد تحديد قيمة جديده له , بدلاً من إعطائها المترجم ليبحث عن العنوان بنفسه ثم يعين له قيمة 🙂

اترك رد

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s