Programming Freaks  | دورات ومقالات برمجيه

Please login or register.

Login with username, password and session length
Advanced search  

News:

Please Read our FAQ

Author Topic: الفصل الخامس | المصفوفات والمؤشرات في لغة السي  (Read 1668 times)

St0rM

  • [C programmer]
  • Administrator
  • Active Member
  • *****
  • Posts: 209
  • Why So serious ?
    • View Profile
    • WWW
    • Email
الفصل الخامس

المصفوفات والمؤشرات :
الي الان لديك معلومات كافية عن لغة ال c لكي تبدأ بكتابة برامج صغيره مفيده لك , ولكن هناك بعض الاشياء التي يجب ان تعرفها عن لغة ال c وهي الاشياء التي بدونها لن تصبح لغة ال c اللغه القويه التي نعرفها , ومن اهم تلك الاشياء هي المؤشرات
ولقد قمت بدمج المؤشرات والمصفوفات في فصل واحد ليس لسهولتهما ولم افصلهما لصعوبتهما ولكن قم بدمجهما مع بعض لان الحديث عن المصفوفات سوف وبشكل ما يعتمد علي المؤشرات , لن اقوم بعطائك كافة المعلومات عن المؤشرات او المصفوفات فقط سوف اعطيك البدايه كما تعودنا في هذه السلسله

لنبدأ بالمصفوفات :
كلمة مصفوفه هنا تعني عدد معين من الاقسام التي تحمل اسم واحد ونوع واحد ويتم الحصول علي قسم معين من المصفوفه من خلال رقم يسمي برقم الفهرسه INDEX NUMBER

ومن هنا نستنتج ان عناصر المصفوفه الواحده متشابهه ومتطابقه , حيث انه لا توجد مصفوفه تحمل بعض عناصرها انواع رقمية صحيحه وبعض العناصر الاخري عناصر رقميه غير صحيحه والبعض الاخر حروف , فأذا قمت باعلان عن مصفوفه انها مصفوفه رقمية من نوع int تحتوي علي عدد معين من الاقسام فان تلك المصفوفه سوف تظل كذلك الي ان ينتهي مدة حياتها
 كفانا من الكلام الانشائي لنبدأ بتحليل طريقة الاعلان عن المصفوفات

Code: [Select]
type name[number of elements];

الاعلان عنها كالاعلان عن متغير عدا انك تضع رقم الاقسام المطلوبه في المصفوفه بين [] ويجب ان يكون هذا الرقم رقم صحيح لا يحتوي علي ارقام عشريه , وايضا يجب ان يكون هذا الرقم معروف وقت الترجمه , وهذا طبقا لقواعد ال ANSI STANDARD انه يجب ان يتم معرفة عدد اقسام المصفوفه اي حجمها وقت الترجمه وليس وقت التشغيل لا تشغل بالك بهذا الجزء كثيرا سوف تتعرض له في يوم ما فتفضل بسؤالنا

حسننا لنبدأ ببرنامج صغير يقوم بتعريف مصفوفه رقميه تحتوي علي ارقام صحيحه وحجمها هو 10

Code: [Select]
#include <stdio.h>

int main(void)
{
        int array[10]; //array of 10 integers

        array[0] = 0;
        array[1] = 1;
        array[2] = 2;
        array[3] = 3;
        array[4] = 4;
        array[5] = 5;
        // enough :) i think you got the point but ...

        return 0;
}

تحليل المثال كله معروف لك , ولكن هناك شيء يستعدي التوضيح , اول قيمة في ال index تبدأ من 0
اي انه اخر عنصر في المصفوفه رقم الفهرسه الخاص به هو 9 , لاننا نبدأ من العد من الصفر  0 ال 9 هم عشر ارقام  :D عدهم علي صوابعك

ولكن هذا ليس اسلوب ابدأ في ملئ مصفوفه , تخيل انك تريد ملئ مصفوفه مكونه من 100 عنصر ! لن تقوم بعمل ذلك ابدا :D او ذي مقال سترايكر اعملها واكتب استقالتك بعديها
لنعد بالذاكره الي الخلف , اجل الدوارات

راقب هذا المثال وواجبك ان تقوم بشرحه

Code: [Select]
#include <stdio.h>

int main(void)
{
        int array[10];
        int counter;

        printf("Enter 10 numbers then press enter\n");
        for(counter = 0 ; counter < 10 ; counter++)
        {
                //counter starts at 0 and ends at 9

                scanf("%d",&array[counter]);
        }

        printf("you entred\n");

        for(counter = 0 ; counter < 10 ; counter ++)
        {
                printf("%d\n",array[counter]);
        }


        return 0;
}

المؤشرات
لنتكلم عن المؤشرات قبل ان نتكلم عن السلاسل النصيه , حيث ان لهم علاقه وثيقه ببعض
المؤشرات , هو متغير ولكنه من نوع خاص , لانه لا يحمل نوع من البيانات , ولكن لانه يحمل عنوان نوع من البيانات
كلنا نعرف ان الذاكره العشوائيه RAM مكونه من عدد من العناوين ولكل متغير عنوان في الذاكره
ولكي تحصل علي عنوان هذا المتغير تقوم بوضع علامة & قبل اسم المتغير , ولكي تقوم بحفظ هذا العنوان فانت تحتاج ال متغير يؤشر الي عنوان ويكون من نفس نوع البيانات التي يحتويها هذا العنوان فمثلا مؤشر رقمي يشير الي عنوان في الذاكره يحتوي علي بيانات رقميه وهكذا "هذا الجزء صعب نسبيا علي المبتدئين ان لم تفهمه حاول مره اخري واخري الي ان تفهمه وضع اسالتك هنا وسوف نجاوبك"

لنري مثال حي
Code: [Select]
type_of_pointer *pointer_name;

لكي تقوم بتعريف متغير نقوم بتعريف نوع المؤشر وهو نوع البيانات الذي يؤشر له , ومن ثم نقوم بوضع علامة النجمه قبل اسم المتغير ثم اسم المتغير

Code: [Select]
#include <stdio.h>

int main(void)
{
        int x = 1;
        int *pointer_to_x;

        pointer_to_x = &x;

        return 0;
}

في هذا المثال قمنا بتعريف متغير ثم قمنا باسناد عنوان المتغير الي المؤشر  والان حان وقت في معرفة الفرق بين المؤشر ومايحتويه المؤشر ومايحتوي مايحتويه المؤشر

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

*pointer
اذا استخدمانها هذا في مكان اخر غير التعريف فاننا نعني اننا نريد مايحتوي مايحتويه المؤشر , اي البيانات الموجوده بداخل العنوان الذي يحتويه المؤشر
مثال حي
Code: [Select]
#include <stdio.h>

int main(void)
{
        int x = 10;
        int *pointer_to_x;

        pointer_to_x = &x;

        printf("Address of x = %ld\n" , pointer_to_x);

        printf("And it contains %d\n", *pointer_to_x);
        return 0;
}

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

Code: [Select]
#include <stdio.h>

void fill_array(int array[] , int max)
{
        int counter;

        for(counter = 0 ; counter < max ; counter ++)
        {
                array[counter] = counter;
        }

        return;
}

void change_value(int *pointer , int value)
{
        *pointer = value;
}

int main(void)
{
        int array[10];
        int x = 10;
        int counter;

        fill_array(array , 10);
        change_value(&x , 20);


        for(counter = 0 ; counter < 10 ; counter ++)
                printf("%d ,",array[counter]);

        printf("\n");

        printf("and the value of x is %d\n",x);

        return 0;
}

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

ثم قمنا بملء عناصر المصفوفه
الداله الثانيه هي المهمه جدا
اذا قمنا بتعريف دالة تأخذ متغير رقمي عادي وليس مؤشر وحاولنا تغير قيمة ذلك المتغير فانها سوف تبقي كما هي في خارج هذه الداله , وذلك لان الداله حصلت علي قيمة هذا المتغير وليس عنوانه passing by value
ولكن في دالتنا قمنا بارسال عنوان المتغير الي الداله ومن ثم قمنا بتغير قيمة المتغير من خلال هذا العنوان
passing by reference

تبقي لنا شيء واحد وهو السلاسل النصيه
السلسله النصيه

هي مصفوفه متتابعة من الاحرف تنتهي بقيمة خاصة لكي تنهي السلسله
فمثلا السلسله النصيه
"Programming Fr34ks"; سوف تمرر علي هيئة مصفوفه متتابعة من الاحرف المكونه لهذه السلسله + القيمه '\0' في اخر السلسله وتسمي ب String termination value وهذا لكي تعرف الداله اخر السلسله مثال اخير حي علي ذلك
Code: [Select]
#include <stdio.h>

void print_string(char string[])
{
        int x;

        for(x = 0 ; string[x] != '\0'; x++)
                printf("%c",string[x]);
}

int main(void)
{
        char string[] = "Programming Fr34ks\n";

        print_string(string);
        return 0;

}
يمكن تعريف مصفوفه بهذا الشكل وسوف يقوم المترجم بمعرفة عدد العناصر المطلوبه بالتحديد ويقوم هو بالباقي

Code: [Select]
int x[] = {1,2,3,4,5};
ويتبقي في النهاية شيئ واحد فقط انه بالنسبه للداول فان المصفوفات تمرر علي هيئة مؤشرات , لا داعي لان تفهم معني هذا الان سوف تفهمه لاحقا

انتهي الدرس والي اللقاء قريبا جدا في نهاية السلسه في الفصل السادس
« Last Edit: September 05, 2009, 07:37:30 AM by St0rM »
Logged