الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

المؤشرات في ++c, لعبة المبرمجين !(المؤشرات إلى سلاسل نصية)

مغلق
بدأه Khaled.Alshaya في 4 يناير 2008 · 14 رد · 2,302 مشاهدة · في اختبر قداراتك
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ,

بدأت أحس أن الأعضاء الكرام بدأوا يحبون الأمور المحيرة في عالم ++C :D

لذلك قررت أن أضع لمحة جديدة في عالم المؤشرات, أتمنى منكم وضع إجاباتكم في الموضوع حتى نحصل على أكبر قدر من الفائدة,

1 - أولاً هل السطر التالي صحيح في ++C :

	char* x = "Khaled";

الآن إذا كانت إجابتك بنعم في السؤال السابق فما هو الفرق بين السطر السابق و السطر التالي :calc: :

	char x[] = "Khaled";

أنا أنتظر آرائكم في الموضوع :rose:

تحياتي ,,

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 4 يناير 2008 في 04:39

#2

السطر الثاني يحدث اخطاء

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#3

شكراً لك أخي GamingMasteR, المشكلة أني كتبت الكود بسرعة :D

تم التعديل.

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 4 يناير 2008 في 04:38

#4

الحالة الاولى تؤشر x الى عنوان , هذا العنوان به كلمة خالد ...

الحالة الثانية تحتوي x على كلمة خالد نفسها ... الصورة أبلغ :

pointersmw1.jpg

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#5

جربت الطريقتين تعمل.

لكن هل هناك مفاضله بينهما بمعنى هل الاولى برمجيا افضل ام الثانيه ام انها تعتمد على حاجه البرنامج!

tvquran_6.gif

#6

في الحالة الأولى x عبارة عن بايت واحد فقط يشير إلى حرف k فقط وليس إلى كلمة khaled كلها ولكن في نهاية كلمة khaled يكون هناك بايت متفق عليه يعرف منه الكومبايلر أن الكلمة قد انتهت

أما الحالة الثانية فـ x مكونة من 7 بايت تحتوي كلمة khaled ومن بعدها مسافة (space)

من أقوال الأئمة

الإمام علي بن أبي طالب -رضي الله عنه-: "الناس ثلاثة : فعالم رباني ، ومتعلم على سبيل النجاة ، وهمج رِعاع غوغاء أتباع كل ناعق ، يميلون مع كل ريح ، لم يستضيئوا بنور العلم ، ولم يلجئوا إلى ركن وثيق".

الإمام مالك -رحمه الله- : " لن يصلح آخر هذه الأمة إلا بما أصلح به أولها ".

الإمام الأوزاعي -رحمه الله- : " عليك بآثار من سلف وإن رفضك الناس وإياك وآراء الرجال وإن زخرفوه لك بالقول ".

الإمام الفضيل بن عياض -رحمه الله- : " عليك بطرق الهدى و لا يضرك قلة السالكين و إياك و طرق الضلالة ولا يغرك كثرة الهالكين ".

علامة الزمان الإمام الألباني -رحمه الله- : " إن الخلاص إلى أيدي هؤلاء الشباب يتمثل في أمرين لا ثالث لهما ؛ التصفية والتربية ".

وكل خير في اتباع من سلف وكل شر في ابتداع من خلف

#7

السلام عليكم ,,

الحقيقة أعرف أن هذا النوع من الأسئلة لا يوجد في الكتب :D لذلك لا ارى أي مشكلة في أن يضع الشخص ما لديه,

المهم أني كما أقول دائماً أن المؤشرات في ++C هي لعبة المبرمجين :wacko:

سأجيب عن السؤال :

لاحظ أننا قمنا بإنشاء مؤشر هذا المؤشر يحمل عنوان النص, و لكن لماذا لم نستعمل new لحجز المساحة أولاً ؟؟

الحقيقة أن هذا النوع من النصوص يسمى string literals, و هو بكل بساطة مجموعة من الحروف و لكن ما يميزها عن المصفوفات النصية أنها constant ,,

أولاً سيقوم المترجم بحجز مساحة لكلمة Khaled, ثم سيقوم بإسناد عنوان هذا النص إلى المؤشر x,

و الأخ العزيز GamingMasteR قد أشار إلى أن المساحة المحجوزة تكون في الـ Heap و لكن هذا ليس صحيحاً :blink: لأن النص نفسه Constant و ليس هناك داعي أصلاً لحجز ذاكرة ديناميكة له.

حاول التعديل في النص :wink: الحقيقة أنك لن تستطيع لأن النص ثابت و لا يمكن تغييره, ( أخ GamingMasteR هذا حسب المواصفات القياسية, رغم أن بعض المترجمات لا تلتزم بذلك B) ) ,

السطران التاليان يقومان بنفس العمل :

char* x = "Khaled";
const char x[] = "Khaled";

بالنسبة للفرق بينها أخ arabi, في السطر الثاني هذا خاص بالـ ++C حيث سيخبرنا المترجم بوجود خطأ في وقت الترجمة إذا أردنا التعديل و هذا من الفروق بين C و ++C, أما السطر الأول فهو في C و ++C و لا يمكن للمترجم أن يتعرف على أي تعديل على النص لأنه يتم عن طريق مؤشر !!

و من الأفضل استخدام المصفوفات النصية بدلاً من الـ string literals بشكل عام,,

أخ باسم ,, العناوين "المؤشرات" في العادة حجمها 4 bytes مهما كان نوع الشيء الذي تؤشر عليه!! و لكن الحجم يختلف باختلاف المعالجات و مدى الذواكر التي يستطيع التعامل معها.

و نهاية كل نص (هذا هو المتفق عليه في C و ++C) هو null أو 0, و لا يجب الخلط بينه و بين '0' فالأول عبارة عن عدد أما الثاني فهو الحرف '0' ,,

تحياتي للجميع على مشاركتهم,,

#8

شكرا لك خالد كل يوم نتعلم منك معلومة جديدة جزاك الله خير.

tvquran_6.gif

#9

اخي خالد ..

المشكله ليست في المؤشرات ولا في المصفوفات ..

المشكله انك تضع الاسئله دائما في الساعه الثالثه صباحا حسب توقيتنا .. وعندما اجلس ثاني يوم لادخل المنتدى اجد ان السؤال موضوع والجواب عليه قد تم ..

فماذا افعل الان .؟؟

كفيت ووفيت اخي خالد .. واجبت وكتبت ما اردت ان اكتبته انا عندما قرأت السؤال ولكن عندما نظرت الى ردك على السؤال لم تترك لي المجال للرد ..

تحياتي اخي خالد واستمر في هذه الفكره الجميله لكي يستوعب الاعضاء البنيه التحتيه للغة اكثر ..

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#10

أهلاً بك أخ سنان ,,

اقتباس
المشكله انك تضع الاسئله دائما في الساعه الثالثه صباحا حسب توقيتنا .. وعندما اجلس ثاني يوم لادخل المنتدى اجد ان السؤال موضوع والجواب عليه قد تم ..

:D

معاك حق, بس ما أقدر أصبر أكثر من 12 ساعة :P

#11
اقتباس
و الأخ العزيز GamingMasteR قد أشار إلى أن المساحة المحجوزة تكون في الـ Heap و لكن هذا ليس صحيحاً blink.gif لأن النص نفسه Constant و ليس هناك داعي أصلاً لحجز ذاكرة ديناميكة له.

لم اشر الى انها في heap او غيره ... كلمة خالد في كلا الحالتين موجوده في قسم الثوابت لكن الحالة الاولى تحمل عنوان هذا الثابت في X والحالة الثانية تنسخ ما بهذا الثابت في X

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#12

السلام عليكم ,,

اقتباس
لم اشر الى انها في heap او غيره ... كلمة خالد في كلا الحالتين موجوده في قسم الثوابت لكن الحالة الاولى تحمل عنوان هذا الثابت في X والحالة الثانية تنسخ ما بهذا الثابت في X

اعذرني أخ GamingMasteR, الحقيقة أني عندما قرأت مشاركتك الآن وجدت أنك لم تتكلم عن الـHeap أصلاً ,,

أعتقد أن هذا بسبب قلة النوم :D

تحياتي لك أخي العزيز,

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 4 يناير 2008 في 14:47

#13
اقتباس
أعتقد أن هذا بسبب قلة النوم

يبدو ان السي هوست عقلك :lol:

استريح شوية يا راجل ;)

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#14
اقتباس
أعتقد أن هذا بسبب قلة النوم

هذا اكيد ليس بسبب السي وانما بسبب اسئلة الفجرية ..

اخي خالد فلنجعل فكرة الاسئلة المحيرة والالغاز في السي موضوع لا نجيب عليه الا بعد مده .. لكي يتم فيه تناقش ومعلومات مفيدة للجميع ..

لذلك عليك ان تلتزم بذلك فلا تجيب بالمستقبل على سؤال وضعته انت الا بعد يومين على الاقل ..

ما رأيك .؟؟

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#15

سلام ,,

اقتباس
ما رأيك .؟؟

ما في أي مشاكل :D

و الجايات أكثر من الرايحات

هذا الموضوع مغلق.

مواضيع مشابهة