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

مشاكلي مع عفريت البرمجة !, أقصد المؤشرات

بدأه khaled_prg في 11 سبتمبر 2010 · 7 رد · 750 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله تعالى و بركاته

كل عام و أنتم بخير و مبروك عليكم عيد الفطر المبارك :)

أنا مبتدئ في المؤشرات (في لغتي السي و السي++) و دائما ما اجد صعوبة في فهمها و بالأحرى التعامل معها !, من أجل ذلك قررت أن أطرح عليكم مشاكلي فيها لكي تساعدونني في فهمها فمن دونها .. أحس بأن البرمجة فقدت الكثير من مميزاتها ...! :wink:

بحسب معلوماتي (المتواضعة) فإن مؤشر الحروف أو char * عبارة عن سلسلة حرفية ...!, ولكن :

1-عندما نريد إسناد سلسلة حرفية إلى مؤشر حرفي فإننا لا نحجز مكان للمؤشر في الذاكرة و إنما نُسند مباشرة, هكذا:

 char *p="arabteam2000";

ألا يختلف هذا مع قواعد اللغة !؟

2-ما هي القيمة القصوى لطول السلسلة الحرفية التي بإمكاننا إسنادها لمؤشر الحروف !؟

3-لماذا يكون بإمكاننا إسناد سلسلة حرفية إلى مؤشر حرفي بينما لا يمكننا فعل ذلك مع المؤشرات العددية (مثل int* و *float) !؟

4-عند تنفيذ الكود الاتي :

#include<iostream>
using namespace std;

int main()
{
        char *p="arabteam2000";
        cout<<p<<endl;
        system("pause");
        return 0 ;
}

ستظهر لنا الجملة arabteam2000 !!

ألم يكن من المفترض أن يظهر العنوان !؟

تم تعديل هذه المشاركة بواسطة khaled_prg في 11 سبتمبر 2010 في 17:43

#2

وعليكم السلام ورحمة الله وبركاته .

أنا واثق بأن هذه اأسئلة تم الحديث عنها سابقاً .

اقتباس
1-عندما نريد إسناد سلسلة حرفية إلى مؤشر حرفي فإننا لا نحجز مكان للمؤشر في الذاكرة و إنما نُسند مباشرة, هكذا:

char *p="arabteam2000";

ألا يختلف هذا مع قواعد اللغة !؟

المساحة محجوزة داخل أقسام البرنامج نفسه (statically) ، عند استخدام دوال الحجز فانت تحجر من الذاكرة لكن هنا انت تحجز من الملف نفسه .

اقتباس
2-ما هي القيمة القصوى لطول السلسلة الحرفية التي بإمكاننا إسنادها لمؤشر الحروف !؟

لا أعرف ، ويمكن بتختلف من مترجم الى اخر .

اقتباس
3-لماذا يكون بإمكاننا إسناد سلسلة حرفية إلى مؤشر حرفي بينما لا يمكننا فعل ذلك مع المؤشرات العددية (مثل int* و *float) !؟

أنت قلتها بنفسك : سلسلة حرفية الى مؤشر حرفي ، فيمكنك اسناد سلسلة عددية الى مؤشر عددي وكل حسب نوعه ، ومع ذلك يمكنك فعل ما تريد عن طريق الـtype casting .

اقتباس
4-عند تنفيذ الكود الاتي :

ستظهر لنا الجملة arabteam2000 !!

ألم يكن من المفترض أن يظهر العنوان !؟

cout << (unsined int)p << endl;
1

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#3

+1

أشكرك يا أستاذنا الخبير G على هذه المساعدة و أرجو منك المزيد :)

اقتباس
أنا واثق بأن هذه اأسئلة تم الحديث عنها سابقاً

معلش يا أستاذ G و لكن أين اجد الإجابات !؟

بحثت كثيرا و لكن لا جدوى !!! :blush:

اقتباس
المساحة محجوزة داخل أقسام البرنامج نفسه (statically) ، عند استخدام دوال الحجز فانت تحجر من الذاكرة لكن هنا انت تحجز من الملف نفسه .

بصراحة يا G, ما فهمت :blush:, كلامك دسم بعض الشيء (لأنك من مشايخ الأسمبلي :wink: ) و أنا مبتدأ (مستواي ضعيف جدا :blush: ) فيا ريت لو تشرح القضية بأسلوب يفهمه المبتدئون أمثالي :)

اقتباس
لا أعرف ، ويمكن بتختلف من مترجم الى اخر

أنا استعمل المترجم Dev, كيف أعرف القيمة القصوى التي يعتمدها !؟

معلش !,بس لا تقولون لي "راجع وثائق المترجم !", لأنني لا أعرف الأنجليزية :blush:

اقتباس
أنت قلتها بنفسك : سلسلة حرفية الى مؤشر حرفي ، فيمكنك اسناد سلسلة عددية الى مؤشر عددي وكل حسب نوعه ، ومع ذلك يمكنك فعل ما تريد عن طريق الـtype casting .

ممكن مثال لو سمحت !؟

اقتباس
cout << (unsined int)p << endl;

ظهر لي عدد !, هل هذا هو العنوان !؟

لماذا قمت بتحويل المؤشر p إلى int !؟

سلامي.

#4

التعامل مع السلاسل النصيه الخاصه ببئة التشغيل

سؤال حول ال String literals في السي

اقتباس
أنا استعمل المترجم Dev, كيف أعرف القيمة القصوى التي يعتمدها !؟

معلش !,بس لا تقولون لي "راجع وثائق المترجم !", لأنني لا أعرف الأنجليزية

حقيقة لا أعرف ، لم ابحث في هذا الأمر من قبل ، لكن انظر هذا الرابط يخص VC++ 10.0

http://msdn.microsoft.com/en-us/library/sx08afx2.aspx

اقتباس
ممكن مثال لو سمحت !؟
اقتباس
ظهر لي عدد !, هل هذا هو العنوان !؟

لماذا قمت بتحويل المؤشر p إلى int !؟

المثال هو كما قمنا به في رقم 4 ، هذه العملية تسمى type casting .

اذا مررنا مؤشر لسلسلة حرفية الى cout فانه سيعتبرها نص ويقوم بطباعة النص الذي يشير اليه المؤشر ، لكن ان قمنا بتمرير المؤشر كعدد فستتم طباعة قيمة العدد وهو عنوان المصفوفة .

وبالمثل يمكنك ان تقول :

int *p = (int *)"ddddd";

طبعا الجملة ليس لها فائدة ، هي فقط للتوضيح .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#6

نفسى اساعد بس مستنى ابقى افضل شوية لأنى لسة معرفش ال pointers :D

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#7
apex كتب:

@G

لا ينصح بالtypecasting بين الpointer ماعدا من والى الvoid*

http://www.arabteam2...1

لا يمكن أبداً تعميم هذا الافتراض ... هناك كثير من الحالات التي لا مفر من عمل typecasting فيها .

كمان هو عايز يتعلّم smile.gif

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#8
اقتباس
ظهر لي عدد !, هل هذا هو العنوان !؟

لماذا قمت بتحويل المؤشر p إلى int !؟

فقط لان طبيعة عمل cout تفترض ان char* هو لطباعة string وليس العنوان . printf تتفادى هذا الخطاء بتحديد الانواع type specifier .

اقتباس
-عندما نريد إسناد سلسلة حرفية إلى مؤشر حرفي فإننا لا نحجز مكان للمؤشر في الذاكرة و إنما نُسند مباشرة,

يقصد ان البيانات الخاصة بالstring تكون فى الملف التنفيذى للبرنامج الذى يحمل عند تشغيلة (اى تزيد من مساحة البرنامج التنفيذى على القرص الصلب ويحمل تلقائيا للذاكرة عند تشغيل البرنامج) .

name : mohamedyosry

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