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

لماذا يحدث هذا مع المؤشرات

بدأه _- محمد نور -_ في 21 مايو 2009 · 2 رد · 410 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

الكود

[color= #0000ff;]char [color= #000000;]*pstr[color= #000000;][[color= #000000;]] [color= #000000;]= [color= #000000;]{ [color= #A31515;]"as",[color= #A31515;]"ad",[color= #A31515;]"af",[color= #A31515;]"ag"[color= #000000;]}; 

[color= #0000ff;]char so[color= #000000;][[color= #000000;]] [color= #000000;]= [color= #000000;]{[color= #A31515;]'m',[color= #A31515;]'o',[color= #A31515;]'k',[color= #A31515;]'a'[color= #000000;]};

[color= #0000ff;]char[color= #000000;]* pso [color= #000000;]= [color= #000000;]&so[color= #000000;][[color= #ff0000;]0[color= #000000;]];

لماذا فى المصفوفة الأولى لابد أن يكون المتغير من نوع مؤشر على char

و حينما لا يكون كذلك يخرج لى خطأ too many init.

بينما فى المصفوفة الثانية لابد أن يكون نوع المتغير char و ليس char*

و فى حالة جعله كذلك يخرج لى هذا الخطأ بعدد عناصر المصفوفة

اقتباس
'initializing' : cannot convert from 'char' to 'char *

و فى حالة إذا أردت ان أحصل على مؤشر على المصفوفة الثانية لابد من الحصول عليه من السطر الثالث

و لا أستطيع أن أكتب

char* pso = &so

و ذلك يخرج لى خطأ لا أفهمه

اقتباس
'initializing' : cannot convert from 'char *(*__w64 )[4]' to 'char *

أنا أعلم أن هذه الأسئلة من الممكن أن يظنها البعض ساذجة و لكنى بدأت البرمجة من الدوت نت و ليس من سى

لذلك فأنا أسير عكس كل الناس :D

من أعلى إلى أسفل و ليس من أسفل إلى أعلى :huh:

و لا أقصد أن لغة السى بلس بلس متدنية المستوى و لكن الدوت نت فيه wrapping يجعل المبرمج ليس له علاقة على الإطلاق بأقل الأشياء بساطة فى أى لغة أخرى :S

لا إله إلا الله محمد رسول الله

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

#2

السلام عليكم ...

أهلاً أخ نور ....

حسناً أرى المشكلة لديك :)

لنتفق على شيء أولاً, هناك شيء يسمى C-String ... الـ C-String عبارة عن مصفوفة من الحروف, الشيء المميز في هذه المصفوفة أننا لا نحتاج لمعرفة الحجم.. بدلاً عن ذلك نقوم بوضع علامة في آخر عنصر في المصفوفة.. العلامة هي الرقم 0 ... رجاءً لا تخلط بين '0' و 0 :)

عندما تضع مجموعة من الحروف بين علامتي تنصيص فإنك تقول للمترجم ضع 0 بعد آخر حرف لأن هذه ليست "مصفوفة من الحروف" و إنما "نص"...

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

في ++C تستطيع استخدام الكائن string أو wstring إذا كنت تريد unicode .... و لا داعي أصلاً للدخول في متاهات C-String :lol: دعها لمبرمجي C ...

حسناً, هذه العبارة :

char *pstr[] = { "as","ad","af","ag"};

تعنى قم بإنشاء مصفوفة *char ... طبعاً هو مؤشر, و لكنه حالة خاصة لأنك إذا قمت بإسناد نص إلى مؤشر من هذا النوع بالذات فإن المترجم سيقوم بعملية حجز الذاكرة و جعل المؤشر يشير إلى هذا النص... بكل بساطة أنت قمت بإنشاء مصفوفة نصوص "ثابتة", لا يمكنك تغيير النصوص الموجودة في المصفوفة...

أما هذا :

char so[] = {'m','o','k','a'};

فليس نصاً على الإطلاق, إنما عبارة عن مصفوفة من الحروف, و المترجم لا يعاملها معاملة خاصة أبداً فقط مصفوفة كغيرها من المصفوفات, لاحظ في الأعلى أن النص يأتي بين علامتي تنصيص.

بالطبع يمكنك كتابة التالي :

char so[] = "moka";

و لاحظ أن هذا نص صحيح أنه في مصفوفة و لكن حجمها ليس 4 لأن الصفر تم إلحاقه بها...

بالنسبة لهذا :

char* pso = &so

لاحظ أن so هو عنوان المصفوفة, أنت كأنك تقول أريد عنوان العنوان :)

اسم المصفوفة بدون عملية الـ indexing هو عنوانها, و لكن عندما نقوم بعلمية الـ Indexing فإننا نجلب القيمة على العنوان المطلوب...

يمكنك كتابة السطر السابق كالتالي :

char* pso = so;

بينما :

char* pso = &so[0];

تعني أريد عنوان أول عنصر :)

أتمنى أن تجد الفائدة في الموضوع التالي :lol:

اضحك مع ++c/c !, تجربة مثيرة مع مفهوم المؤشرات لمن يريد أن يفهم!

لم أجرب الأكواد و قمت بكتابتها على السريع لأني لا أعمل على جهازي عند كتابة الرد, إن شاء الله لن يكون هناك أخطاء :)

تحياتي ...

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 21 مايو 2009 في 04:41

#3

يعنى أفهم من هذا أن أسم المصفوفة يعاملها المترجم على أنه مؤشر على أول خانة فيها

و أننى لو حاولت وضع & لكى أحصل على العنوان فهذا يعتبر خطأ

جزاك الله خيرا يا خالد

لا إله إلا الله محمد رسول الله

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

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