الاثنين، 4 فبراير 2013

Intro. to Programming - Lesson 4


قلنا قبل كده ان أي حرف بتضغط عليه من الـ Keyboard  بيتحول لـ character  بيتعملها encoding  بـ system 
 معين (هنا شغالين بالـ ASCII ) يعني كل حرف بيتخزن في 8-bit ، مثلاً لو هنخزن حاجة زي دي "ab3" هتتخزن ازاي ؟
هنحوّل كل حرف للـ ASCII  المناظر ليه يعني هيبقى كده
0110 00010110 00100011 00110000 0000


طيب اول 3 - byte  من الشمال عارفينهم ، هم تحويل ab3  للـ ASCII  انما ايه 0000 0000 دي ؟
"ab3" اسمها string بمعنى سلسلة من الحروف ، أي string لازم ينتهى بحاجة اسمها null-terminating character  و دي الـ ASCII بتاعها عبارة عن 0000 0000
طب ليه لازم تنتهي بالحرف ده ؟ الحرف ده بيحدد نهاية الـ String بما انها بتتكون من كذا حرف ، الجهاز هيعرف ازاي انها انتهت ؟ فهو بيعرف عن طريق الـ Null character دي
من هنا هنعرّف حاجة اسمها Array أو مصفوفة : هي عبارة عن مجموعة من العناصر اللي من نفس الـ data type
أبسط مثال على array هو الـ String  و لو طبقنا عليه التعريف فهو مجموعة من العناصر (الحروف) من نفس الـ data type  اللي هو char .

تعريف الـ Array :

زي أي variable مع بعض الاختلافات البسيطة :
type array_name[array_size];
1- Type  : هو نوع العناصر الموجودة جوا الـ Array يعني مثلاً لو هعمل string يبقى العناصر اللي جواها char
2-Array_size : عدد العناصر اللي جوا الـ Array أو حجم الـ Array
مثال :- لو عايز اعمل string و احط جواه "Hello" هعرّفه كده
char str[] = “Hello”;
هنا محطيتش الـ size بتاع الـ Array لأني حطيت العناصر اللي فيها فالـ compiler هيحسبها لوحده
طيب في نفس المثال، لو انا عايز اعمل print للحرف التالت اعمل ايه ؟
عشان توصل لعنصر معيّن في الـ Array بتستخدم [] وجواهم الترتيب بتاع العنصر ده
مثال : انا لسه عندي نفس الـ string
char str[] = “Hello”;
عايز اخد الحرف التاني اللي هو e  و احطه في variable لوحده ، أكيد هيبقى الـ variable ده من النوع char ، فهعمل كده
char chr = str[1];
لاحظ هنا اني عشان اوصل للعنصر التاني خليت الـ Index بتاع الـ Array 1 مش 2 ليه ؟ لأن الترتيب في الـ Array بيبدأ من zero ، فأول عنصر رقمه 0 و التاني 1  والتالت 2 و هكذا.




قلنا قبل كده لما نيجي نعرّف variable مثلاً unsigned short int  و اسمه x و عايزين نديله قيمة = 5 بنعرّفه كده
unsigned short int x = 5;
هنا x ممكن نستخدمها عشان تعبر عن حاجتين : 1- القيمة نفسها (اللي هي 5)
                                                                   2-العنوان اللي متخزن فيه  
اتكلمنا قبل كده عن ازاي نستخدمها للتعبير عن القيمة ، الوقتي هنتكلم عن تعبيرها عن العنوان
كل variable ليه عنوان معين في الـ memory و العنوان ده ملوش علاقة بالقيمة
عشان نتعامل مع العنوان ده بنستخدم حاجة اسمها Pointer  و هو عبارة عن طريقة عشان تفضل متابع العناوين في memory


مثال زي اللي قلناه في الأول "ab3" هيتخزن ازاي في الـ memory
أولاً هيخزن أول حرف في عنوان معين ، بعد كده هيزوّد واحد على العنوان ده و يخزن الحروف اللي بعده لغاية ما يوصل للـ null
و لما يجي يقرا ؟ هيبدأ من عنوان أول حرف ، و بعدين يفضل يزوّد لغاية ما يلاقي الـ null يقف ، يبقى هو ده الـ String بالنسبة له
address
word


01000110 0001 ⇒ ‘a’
01010110 0010 ⇒ ‘b’
01100011 0011 ⇒ ‘3’
01110000 0000 ⇒ null
1000
...…..

Memory


في المثال اللي فات ، قيمة الـ Pointer هتكون عنوان اول character في الـ String  اللي هو 0100 هيقراها الاول ولما يخلص يزيد واحد بقى 0101 يقرا تاني character  و هكذا لغاية ما يوصل للـ Null character

تعريف الـ pointer :-

الـ Pointer زي أي variable ليه نفس طريقة التعريف
type *name = value;
لكن خلي بالك من كذا حاجة

1- type : مش نوع الـ Pointer ، احنا قلنا ان أي Pointer بيكون فيه Address  ، يعني كله نفس النوع ، الـ Type هنا مقصود بيها الـ type بتاع الـ data اللي متخزنة في الـ address اللي متخزن في الـ pointer .

طب ليه محتاج اعرف الـ type بتاع الـ data  ؟ قلنا برضه قبل كده ان كل الداتا الموجودة في الـ RAM عبارة عن موجودة اصفار ووحايد ورا بعض ، طب انا اعرف منين البداية والنهاية بتاعة الـ Variable ده ؟ اعرف هتعامل معاه ازاي ؟ كل ده بيتحدد عن طريق type ، يعني مثلاً لو  الـ Type هو char  فالـ Pointer هيعرف ان الـ Data المتخزنة في الـ  address اللي بيشاور عليه عبارة عن char ، فهيقرا 8 bits  هم دول الداتا اللي عايزهم
2- *  بتتحط قبل اسم الـ Pointer عشان توضح انه Pointer
3-value ده عبارة عن address ، غالباً بيكون Address لـ Variable تاني موجود قبل كده (ممكن يكون Pointer برضه )


مثال: انا الوقتي عملت variable اسمه x  من نوع Int  وحطيت فيه قيمة 5
int x = 5;
عايز اعرف العنوان بتاعه في الـ RAM ، فهعمل Pointer يشاور عليه و اعمل print للعنوان بتاعه طب ازاي ؟
هعرّف Pointer  الـ Type بتاعه نفس الـ Type بتاع x
int *ptr = &x;
& هنا معناها address of بمعنى ان قيمة الـ pointer هتساوي address of x ، يعني الـ Pointer هيكون فيه عنوان الـ x


طيب عايزين نعمل printf للـ address ده ؟ هنكتب جملة printf عادية جدا الفرق بس في placeholder ، الـ pointer ليه placeholder خاص بيه هو %p يعني جملة الـ printf هتبقى كده
printf(“%p”,ptr);
لاحظ تاني ان الـ variable هنا هو ptr بس مش *ptr  
لو حطينا *قبل ptr ده معناه ، هات القيمة اللي موجودة جوه الـAddress اللي متخزن جوا الـ Pointer
يعني في المثال ده *ptr  هتكون قيمته 5 و في الحالة دي هيبقى int عادي و الـ Placeholder هيبقى %d أو %i
printf(“%d”,ptr);  //prints the value stored at the address stored in the pointer (5)


ملاحظة تانية :-
int *ptr = &x;
هي نفسها
int *ptr;
ptr = &x;
و مش نفس
*ptr = 6;



ملاحظة تالتة:-
لو عندك الكود ده
int x = 5;
int *ptr = &x;
*ptr = 8;
في الأول انت عندك variable اسمه x  قيمته =  5 ، و بعدين عملت Pointer  اسمه ptr بيحتوي عنوان الـ x ، لو عملت *ptr = 8 ده معناه انك بتقولي غيّر القيمة اللي موجودة عند العنوان المتخزن في الـ pointer  و خليها = 8 (يعني قيمة الx هتتغير و هتبقى = 8)

Using pointers for storing strings

اتكلمنا عن تخزين الـ String كـ array من الـ characters ، الوقتي هنتكلم عن حالة خاصة في الـ Pointers ، ازاي تستخدمها عشان تخزن string


أولاً هتخلي الـ type بتاع الـ Data اللي متخزنة في الـ address اللي في الـ Pointer عبارة عن char ، بمعنى الـ Pointer هيحتوى على عنوان أول حرف في الـ string  و بعد كده هيفضل يقرا لغاية ما يلاقي null زي ما قلنا قبل كده
char *ptr = “This is a string”;
نفترض اننا عايزين نطبع الـ string ده و الـ Address بتاعه (address بتاع اول حرف فيه ) هنستدعي نفس الvariable  في المرتين لكن الفرق هيكون في الPlaceholder الأول هيكون %s عشان يعرض الـ string ، التاني هيكون %p عشان يعرض الـ Address بالشكل ده
printf(“The string is %s and the address is %p”,ptr,ptr);


ليست هناك تعليقات:

إرسال تعليق