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


    لغة C/C++ : المؤشرات Pointers والسجلات Structures

    الناقل : elmasry | العمر :42 | الكاتب الأصلى : Guest_cold0zero | المصدر : www.arabteam2000-forum.com

    كلمات مفتاحية  :

    لغة C/C++ : المؤشرات Pointers والسجلات Structures

    فى هذه المقالة نتناول موضوع من اهم موضوعات لغةC وهو المؤشراتPointers والسجلاتStructures وذلك من خلال التعرف على النقاط التالية: - معنى المؤشرات ومزايا استعمالاتها - استعمال المؤشرات مع أنواع البيانات المختلفة - السجلات وكيفية استعمالها - مصفوفة السجلاتArray of Structures المؤشر هو طريقة للاعلان عن المتغيرات من أى نوع حيث تمكن المبرمج من التعامل مع عنوان المكان المحجوز فى الذاكرة مباشرة وليس القيمة.
    ويتم الاعلان عن مؤشر الى أى متغير بوضع العلامة * قبل اسم المتغير كما فى الصور التالية:

    int *a 

    float *b

    char *c


    وفى هذه الصور يتم الاعلان عن متغيرات من بعض أنواع البيانات, ولكن يسبق المتغير العلامة * مما يجعل المتغير يشير الى عنوان المكان المحجوز فى الذاكرة وليس القيمة,

    مزايا استعمال المؤشرات

    1- زيادة سرعة تنفيذ خطوات البرنامج حيث نتعامل مع عنوان المكان المحجوز مباشرة

    2- اعادة أكثر من قيمة من الدواليReturn more than one value

    3- سهولة التعامل مع أنواع البيانات المختلفة مثل المصفوفات

    ولتوضيح ذلك تابع نص البرنامج التالى:

    #include "stdio.h" 

    int main(int argc, char* argv[])

    {

    1: char *gr="Welcome With You.."

    2: printf("n %snn",gr)

    return 0

    }


    فى هذا النص فى الس-طر رق--م 1تم الاعلان عن المؤشر*gr من نوعchar ,وبهذا يشير المتغيرgr الى متغي-ر حرفى يستطيع أن يحتفظ بعبارة حرفية كما تم حيث حفظت عبارة فى هذا المتغير

    فى السطر رقم 2 تم طباعة محتويات المتغير gr على أنه متغير حرفى يحتفظ بعبارة حرفية

    جرب انشاء برنامج لهذا النص ونفذه ولاحظ النتيجة

    مصفوفة المؤشراتArray Of Pointers

    يمكن استعمال المؤشرات لانشاء مصفوفة حرفيات كما فى النص التالى:

    #include "stdio.h" 

    int main(int argc, char* argv[])

    {

    int i

    1: char *names[5]={"Nabile","Azab","Samy","Hamdy"}

    for (i=0 i<4 i++)

    2:printf("nn%sn",*(names+i))

    return 0

    }


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

    فى السطر رقم 2 طباعة العبارات المخزنة فى المصفوفة داخل التكرارfor .. جرب انشاء برنامج لهذا النص ونفذه ولاحظ النتيجة وتابع نص البرنامج فيه.

    السجلاتStructures

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

    والسطور التالية توضح كيفية بناء سجل:

    struct student 

    {

    int No

    char name[30]

    char tel[12]

    char Adre[30]

    }

    فى هذه السطور تم تعريف سجل(structure) بالاسمstudent وذلك باستعمال الكلمة المحجوزةstruct ,ثم تم تعريف عناصره داخل القوسين{} , هذا السجل يحتوى على حقل من نوع صحيحint بالاسمNo وحقل حرفى بالاسمName وهكذا.

    ولتوضيح كيفية الاعلان عن السجل واستعماله تابع المثال التالى:

    #include "stdio.h" 

    int main(int argc, char* argv[])

    {

    1: struct student

    {

    int no

    char name[20]

    char tel[12]

    }

    2:struct student st1

    printf("n No,Name,Tel=")

    3:scanf("%d,%s,%s",&st1.no,st1.name,st1.tel)

    printf("nn No,Name,Tel=%d,%s,%snn",st1.no,st1.name,st1.tel)

    return 0

    }

    فى هذا النص تم الاعلان عن سجل(structure) بالاسم student وتعريف عناصره كما سبق وذلك فى السطر 1

    فى السطر رقم 2 تم الاعلان عن متغير بالاسمst1 من نوع السجلstudent

    فى السطر رقم 3 تم استقبال قيم السجل المشار اليه بالمتغيرst1 من المستخدم باستعمال الدالة.scanf() ولكن الملاحظ نسبة اسم العنصر إلى اسم السجل بالصورةst1.No وهذا ما يجب ملاحظته حيث لايمكن التعامل مع عنصر داخل سجل دون نسبته إلى السجل ,وهذا سوف يتضح جيدا فى التعامل مع الفصائل(classes) فى المقالات التالية(C++) جرب انشاء برنامج لهذا النص ونفذه ولاحظ النتيجة وتابع نص البرنامج فيه.

    مصفوفة السجلاتArray of Structures

    المصفوفة عبارة عن عدد من العناصر من نفس النوع وبالتالى يمكن تكوين مصفوفة من السجلات ,ولتوضيح ذلك تابع النص التالى:

    #include "stdio.h" 

    int main(int argc, char* argv[])

    {

    int i

    1: struct student

    {

    int no

    char name[20]

    char tel[12]

    }

    2: struct student st[5]

    3: for (i=0 i<5 i++)

    {

    printf("n STU No:%d:No,Name,Tel:",i)

    scanf("%d,%s,%s",&st[i].no,st[i].name,st[i].tel)

    }

    4:for (i=0 i<5 i++)

    printf("n STU No:%d:%d,%s,%s",i,st[i].no,st[i].name,st[i].tel)

    return 0

    }


    فى هذا النص فى السطر رقم 1 تم الاعلان عن سجلstructure وتعريف عناصره كما سبق.

    فى السطر رقم 2 تم الاعلان عن مصفوفة بالاسمst عدد عناصرها 5 من نوع السجلstudent الذى تم تعريفه وتعريف عناصره وذلك بنفس طريقة الاعلان عن أى مصفوفة.

    فى السطر رقم 3 تم استعمال جملةfor لتكرار دالتىprintf(),scanf() لاستقبال عناصر المصفوفة.

    فى السطر رقم 4 يتم طباعة عناصر مصفوفة السجلات التى تم استقبالها.

    جرب انشاء برنامج لهذا النص ونفذه ولاحظ النتيجة.

    المؤشر السجلات Pointers to Structure

    مثلما يتم الإعلان عن مؤشر الى أى نوع من البيانات يمكن اعلان مؤشر الى السجل ويأخذ الشكل التالى:

    struct student *st1 


    فى هذا السطر تلاحظ الاعلان عن متغير st1 من نوع السجل كما سبق, ولكن الجديد وجود العلامة * قبل المتغير, وبالتالى أصبح مؤشرا يشير الى سجل,وعند استعمال المؤشر تختلف طريقة التعامل مع العناصر حيث تستبدل الصورة st.no بالصورة st->no كما فى السطر التالى:

    scanf("%d,%s,%s",&st1->no,st1->name,st1->tel)

    كلمات مفتاحية  :

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