قلنا
قبل كده ان أي حرف بتضغط عليه من الـ Keyboard بيتحول لـ character
بيتعملها encoding بـ system
معين (هنا شغالين بالـ ASCII ) يعني كل حرف
بيتخزن في 8-bit ، مثلاً لو هنخزن حاجة زي دي "ab3" هتتخزن ازاي ؟
هنحوّل كل حرف للـ ASCII المناظر ليه يعني هيبقى كده
| 0110 0001 | 0110 0010 | 0011 0011 | 0000 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 |
| 0100 | 0110 0001 ⇒ ‘a’ |
| 0101 | 0110 0010 ⇒ ‘b’ |
| 0110 | 0011 0011 ⇒ ‘3’ |
| 0111 | 0000 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);
ليست هناك تعليقات:
إرسال تعليق