منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب
الدرس الرابع والأربعون - الـ Pointers - نسخة قابلة للطباعة

+- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb)
+-- قسم : الأقسام التعليمية - المنتدى القديم (http://vb4arb.com/vb/forumdisplay.php?fid=90)
+--- قسم : قسم دورات المنتدى (http://vb4arb.com/vb/forumdisplay.php?fid=113)
+---- قسم : دورة .net 2008 . لنبدأ سوياً (http://vb4arb.com/vb/forumdisplay.php?fid=138)
+---- الموضوع : الدرس الرابع والأربعون - الـ Pointers (/showthread.php?tid=5638)



الدرس الرابع والأربعون - الـ Pointers - RaggiTech - 14-10-12

كاتب الموضوع : أحمد جمال

بسم الله الرحمن الرحيم .
السلام عليكم ورحمة الله وبركاته .


إذا كنت مبرمج C++ ، فأنت بالتأكيد تدرك معنى pointer ، أما لو لم تكن كذلك ، أما لو لم تكن كذلك فعليك ان تعرف انه بالاضافة إلى ال value type وال refernce type ، هناك ايضاً ال pointer type والتي تختص بالاشارة إلى اماكن معينة في الذاكرة .

بداية أول ما ستعرفه انك لن تتعامل معها في الكود الطبيعي ، بل ستضطر لاستخدام unsafe code لعمل ذلك حيث أن السي شارب لن تسمح لك افتراضياً بالتعامل مع ال pointers ، لذا قم اولاً بالسماح لنفسك باستخدامها بالشكل التالي :



والآن من خلال الكود الخاص بك يمكنك كتابة كود يتعامل مع ال pointers بالشكل التالي مثلاً :

كود :
class Program
{
static void Main(string[] args)
{
unsafe
{
// Work with pointer types here!
}
// Can't work with pointers here!
}
}


الآن سنتعرف على الأدوات الأساسية التي ستعيننا على التعامل مع ال pointers قبل ان نغوص في الأمثلة :

* تستخدم لتعريف pointer .
& لمعرفة عنوان المتغير في الذاكرة .
-> تستخدم للوصول إلى حقل ما داخل الفئة التي يشير إليها ال pointer .
++ ، -- ، + ، - ، == ، != وغيره من المعاملات قابلة للعمل مع ال pointers .


مع استمرارنا في هذا الدرس سوف تكتشف ان التعامل مع ال unsafe code لن يكون بنفس سهولة العمل في safe code من خلال سي شارب العادية ، ولكن لماذا استخدم ال unsafe code ؟

- أغراض تعليمية .
- استخدامك لبعض ال dll's او ال COM Components التي تعمل اصلاً من خلال
pointers .
- محاولة تحسين اداء وسرعة مهمة معينة من خلال الوصول المباشر للذاكرة ، في مشروع التخرج الخاص بنا وأثناء قراءة pixels صورة ما لعمل بعض عمليات Image Processing كان بامكاننا استخدام دوال GetPixel و SetPixel الخاص بالصور للقراءة والكتابة ، ولكنها كانت لتكون عملية طويلة جداً للمرور على ال pixels بهذه الطريقة ، الحل البديل كان باستخدام unsafe code والتعامل مع ال pointers مباشرة للمرور على ال pixels الخاصة بالصورة ، جرب مثلاً كود لطرح صورتين بالطريقة Getpixel و setpixel ، وبعد هذه الدرس جربها مرة أخرى باستخدامpointers ، وأخبرني بالفارق ...


الآن سنعود مرة أخرى لنشرح من البداية ...


الدرس الرابع والأربعون - الـ Pointers - RaggiTech - 14-10-12

يمكنك الآن تعريف pointer بالشكل التالي :

كود :
public Node* Left;
ليس هذا فقط ، بل بامكانك تعريف structure او class من النوع unsafe بالشكل التالي :

كود :
public unsafe struct Node
{
public int Value;
public Node* Left;
public Node* Right;
}
أو دالة ايضاً :

كود :
unsafe static void SquareIntPointer(int* myIntPointer)
{
// Square the value just for a test.
*myIntPointer *= *myIntPointer;
}
ولما كنا قد استخدمنا * لتعريف المتغير في البارميتر ، إذن سنرسل البارميتر باستخدام & بالشكل التالي :

كود :
SquareIntPointer(&myInt2);
ايضاً للوصول إلى المتغير Left في ال Node سنستخدم -> بالشكل التالي مثلاً :

كود :
n->Left=5;
والآن قبل النهاية سأحيلك للرابط التالي لمعالجة الصور مثلاً :
http://www.codeproject.com/KB/GDI-plus/ImageTraverser.aspx

والله الموفق ...
والسلام عليكم ورحمة الله وبركاته .