في C ++ أنا لا يمكن فهم المؤشرات والفئات

أنا جديد من الكلية وقد تم العمل في C ++ لبعض الوقت الآن. أفهم جميع أساسيات C ++ واستخدمها ، ولكن أواجه صعوبة في استيعاب موضوعات أكثر تقدمًا مثل المؤشرات والفصول الدراسية. لقد قرأت بعض الكتب والدروس وأتفهم الأمثلة الموجودة فيها ، ولكن عندما أنظر إلى بعض الأمثلة المتقدمة من واقع الحياة ، لا أستطيع أن أعرفها. هذا يقتلني لأنني أشعر أنه يمنعني من جلب برمجة C ++ إلى المستوى التالي. هل لدى أي شخص آخر هذه المشكلة؟ إذا كان الأمر كذلك ، كيف اخترت ذلك؟ هل يعرف أي شخص أي كتب أو برامج تعليمية تصف بالفعل المؤشرات ومفاهيم الصف بشكل جيد؟ أو ربما بعض أمثلة التعليمات البرمجية ذات التعليقات الوصفية الجيدة باستخدام المؤشرات المتقدمة وتقنيات الصف؟ أي مساعدة سيكون موضع تقدير كبير.

0
وأضاف تحرير
الآراء: 1
FYI ، والمؤشرات والطبقات هي أساسيات C ++.
وأضاف المؤلف Wedge, مصدر
ملاحظة C ++ لغة غنية وواسعة للغاية. إذا لم تتمكن من فهم الأمثلة المتقدمة التي لا تعني بالضرورة أنك تفتقد شيئًا ما (فثمة أرنب C ++ "المتقدمة" تذهب إلى العمق جدًا). من المفيد أن تقدم معلومات أكثر تحديدًا.
وأضاف المؤلف Wedge, مصدر
اسمحوا لي أن أخمن - فأنت تكتب رمز الرياضيات الحسابي ، ويؤدي عدم فهمك للمؤشرات إلى طريقة معالجة البيانات متعددة الأبعاد. قريب؟
وأضاف المؤلف Arkadiy, مصدر
كانت الكثير من الإجابات جيدة حقًا. شكرا جزيلا لكل من أجاب. سأتبع بعض الردود ، ولكن يبدو أنني بحاجة فقط إلى الالتزام بها والحصول على المزيد من الخبرة.
وأضاف المؤلف timmyg, مصدر
حاولت أن أوضح في سؤالي ، ولكن ربما لم أفعل ، أنني أفهم المؤشرات والدروس من حيث دروس الكتب المدرسية وأمثلة. ولكن عندما أحتاج إلى قراءة وفهم رمز شخص آخر ، على سبيل المثال ، واجهة برمجة تطبيقات برمجية ، مع وجود مؤشرات وفصول دراسية ، فأنا أواجه صعوبة في الفهم.
وأضاف المؤلف timmyg, مصدر
كيف تعمل بالضبط مع C ++ للحظة بدون هذه المعرفة ...؟ يبدو C ++ ث/س الطبقات مثل C ، ومؤشرات C ث/س يبدو وكأنه .....
وأضاف المؤلف Aardvark, مصدر
أنت لا تعرف لعق C ++ إذا كنت لا تفهم مفهوم الطبقات. وإذا كنت لا تفهم المؤشرات ، فمن المحتمل أنك لا تعلم C إما ... فشل نظام التعليم
وأضاف المؤلف FlySwat, مصدر
بدافع الفضول ، ما هي اللغات التي تعلمتها أثناء دراستك في الكلية؟ بخلاف اللغات الوظيفية النقية لا أستطيع التفكير في أي لغة لا تحتوي على مؤشرات أو فصول.
وأضاف المؤلف David Locke, مصدر

27 إجابة

لفهم المؤشرات بشكل أفضل ، أعتقد أنه قد يكون من المفيد النظر في كيفية عمل لغة التجميع مع المؤشرات. مفهوم المؤشرات هو في الحقيقة أحد الأجزاء الأساسية في لغة التجميع و هندسة تعليمات المعالج x86. ربما سيكون نوع من السماح لك سقطت مثل المؤشرات هي جزء طبيعي من البرنامج.

بالنسبة للفصول الدراسية ، وبصرف النظر عن نموذج OO ، أعتقد أنه قد يكون من المثير النظر إلى الطبقات من منظور ثنائي منخفض المستوى. فهي ليست بهذا التعقيد في هذا الصدد على المستوى الأساسي.

You may read Inside the C++ Object Model if you want to get a better understanding of what is underneath C++ object model.

0
وأضاف

قد تجد هذه مقالة بواسطة Joel مفيدة. إذا كنت "تعمل في لغة C ++ لبعض الوقت" وتخرجت في CS ، فقد تكون قد ذهبت إلى JavaSchool (أجد أنك لم تعمل في C ++ على الإطلاق ؛ تعمل في C ولكن باستخدام مترجم C ++).

أيضا ، فقط لإعطاء الأجوبة من hijou و nsanders ، مؤشرات هي أساسية جدا ل C ++. إذا كنت لا تفهم المؤشرات ، فأنت لا تفهم أساسيات C ++ (الاعتراف بهذه الحقيقة هو بداية فهم C ++ ، بالمناسبة). وبالمثل ، إذا لم تفهم الفصول ، فإنك لا تفهم أساسيات C ++ (أو OO لهذه المسألة).

بالنسبة للمؤشرات ، أعتقد أن الرسم بالصناديق هو فكرة جيدة ، ولكن العمل في التجميع هو أيضًا فكرة جيدة. أي تعليمات تستخدم عنونة نسبية ستوصلك إلى فهم ما هي المؤشرات بسرعة ، على ما أعتقد.

أما بالنسبة للفصول الدراسية (والبرمجة الموجه للكائن بشكل عام) ، فإنني أوصي Stroustrups "لغة برمجة C ++" الأحدث. لا يقتصر الأمر على المادة المرجعية C ++ الأساسية فحسب ، بل يحتوي أيضًا على قدر كبير من المواد على الكثير من الأشياء الأخرى ، بدءًا من التسلسل الهرمي الطبقي الأساسي للكائنات والميراث وصولًا إلى مبادئ التصميم في الأنظمة الكبيرة. انها قراءة جيدة جدا (إن لم تكن سميكة ومختلطة في البقع).

0
وأضاف
لول ، قرأت للتو هذا المقال من قبل جويل وهذا ما جعلني آتي إلى هنا وابحث عن أسئلة حول المؤشرات.
وأضاف المؤلف Spidey, مصدر

تعلم لغة التجميع ثم تعلم C. ثم سوف تعرف ما هي المبادئ الأساسية للآلة (والمؤشرات السالفة).

تعتبر المؤشرات والفصول جوانب أساسية في C ++. إذا كنت لا تفهمها فهذا يعني أنك لا تفهم حقا C ++.

أنا شخصيا أوقفت على C ++ منذ عدة سنوات حتى شعرت أن لدي فهم قوي من C وما كان يحدث تحت غطاء محرك السيارة في لغة التجميع. على الرغم من أن هذا كان منذ وقت طويل الآن أعتقد أنه استفاد من مسيرتي المهنية لفهم كيفية عمل الكمبيوتر على مستوى منخفض.

يمكن أن يستغرق تعلم البرمجة سنوات عديدة ، لكن يجب عليك الالتزام بها لأنها مهنة مجزية للغاية.

0
وأضاف

من رد lassevek إلى سؤال مماثل حول SO :

المؤشرات هي مفهوم بالنسبة للكثيرين   يمكن أن يكون مربكا في البداية ، في   خاصة عندما يتعلق الأمر بالنسخ   قيم المؤشر حول ولا يزال   الرجوع إلى كتلة الذاكرة نفسها.

     

لقد وجدت أن أفضل التشبيه هو   اعتبار المؤشر كقطعة من   ورقة مع عنوان المنزل على ذلك ، و   كتلة الذاكرة تشير إلى أنها   البيت الفعلي. كل أنواع العمليات   وبالتالي يمكن تفسيرها بسهولة:

     
      
  • نسخ قيمة المؤشر ، ما عليك سوى كتابة العنوان على ورقة جديدة
  •   
  • القوائم المرتبطة وقطعة الورق في المنزل بعنوان العنوان التالي   منزل عليها
  •   
  • تحرير الذاكرة وهدم المنزل ومحو العنوان
  •   
  • تسرب الذاكرة ، تفقد قطعة الورق ولا يمكن العثور على المنزل
  •   
  • تحرير الذاكرة مع الاحتفاظ بمرجع (غير صالح الآن) ، هدم   المنزل ، محو واحدة من القطع   ورقة ولكن لديك قطعة أخرى من الورق   مع العنوان القديم عليه ، عندما كنت   اذهب الى العنوان ، لن تجد   المنزل ، ولكن قد تجد شيئا   تشبه أنقاض واحدة
  •   
  • تجاوز سعة المخزن المؤقت ، يمكنك نقل المزيد من الأشياء إلى المنزل أكثر مما تستطيع   ربما يصلح، واقتحام في   منزل جيران
  •   
0
وأضاف

فالمؤشرات والدروس هي مواضيع مختلفة تمامًا ، لذلك لن أجمعها معًا من هذا القبيل. من الاثنين ، أود أن أقول أن المؤشرات أكثر أساسية.

التدريب الجيد لمعرفة ما هي المؤشرات هو ما يلي:

  1. أنشئ قائمة مرتبطة
  2. يمكنك تكرار ذلك من البداية إلى النهاية
  3. عكسيها بحيث يصبح الرأس الآن الظهر والظهر الآن هو الرأس

افعل ذلك كله على السبورة البيضاء أولاً. إذا تمكنت من القيام بذلك بسهولة ، فلن تواجهك مشاكل في فهم المؤشرات.

0
وأضاف

كنا فقط نناقش بعض جوانب C ++ و OO على الغداء ، شخص ما (مهندس كبير في الواقع) كان يقول أنه ما لم يكن لديك خلفية برمجة قوية حقا قبل تعلم C ++ ، فسوف يدمر لك حرفيا.

أنا أوصي تعلم لغة أخرى أولا، ثم التحول إلى C ++ عندما كنت في حاجة إليها. انها ليست مثل هناك أي شيء عظيم حول المؤشرات، فهي مجرد قطعة أثرية خلفها عندما كان من الصعب على المترجم تحويل العمليات في التجمع بكفاءة بدونها.

في هذه الأيام إذا لم يتمكن المترجم من تحسين عملية مصفوفة بشكل أفضل ، يمكنك استخدام المؤشرات ، فسيكون المحول البرمجي مكسورًا.

من فضلك لا تفهموني خطأ ، أنا لا أقول C ++ فظيع أو أي شيء ولا تريد أن تبدأ مناقشة المناصرة ، لقد استخدمتها واستخدامها من حين لآخر الآن ، أنا أوصي عليك أن تبدأ مع شيء آخر .

في الواقع ، ليس مثل تعلم قيادة السيارة اليدوية ، ثم سهولة تطبيق ذلك تلقائيًا ، فهي أشبه بتعلم القيادة على واحدة من تلك الرافعات العملاقة ، على افتراض أن ذلك سيطبق عندما تبدأ في قيادة السيارة - تجد نفسك تقود سيارتك في منتصف الشارع بسرعة 5 ميل في الساعة مع إضاءة الطوارئ.

[عدل] مراجعة هذه الفقرة الأخيرة - أعتقد أنه ربما كان أشيع تمثيلي على الإطلاق!

0
وأضاف
أي اللغات التي تقترحها لتعلم أولاً؟ هل سيكون python اختيار جيد؟ أحاول في الوقت الحالي أن أتعلم PHP بالإضافة إلى لغة ++ c ، حيث إنهما متشابهان.
وأضاف المؤلف timmyg, مصدر
أوه ، وإذا كنت تريد حقا معرفة مفاهيم البرمجة النزيف الحافة ، انظر إلى سكالا. بصراحة قد يكون هذا هو الأفضل بسبب كل المفاهيم التي تعرضها لك على الفور. ومن المعروف أيضا أن Hascal و Lisp لتدريس مفاهيم البرمجة الجيدة.
وأضاف المؤلف Bill K, مصدر
إن C# و Java جيدان لأنهما متفرغان في الوقت المحدد وبصراحة إنها عادة جيدة للدخول إليها. إذا كنت تريد أن تخدعك ، فإن بايثون جيدة. إذا كنت تقوم بعمل موقع على شبكة الإنترنت ، روبي على القضبان - الفترة.
وأضاف المؤلف Bill K, مصدر

اعتدت أن يكون لديك مشكلة في فهم المؤشرات في طريقة باسكال مرة أخرى: مرة واحدة بدأت في القيام بمؤشرات المجمع كان حقا السبيل الوحيد للوصول إلى الذاكرة وضرب لي فقط. قد يبدو وكأنه لقطة بعيدة ، ولكن تجربة التجميع (وهي فكرة جيدة دائمًا لمحاولة فهم ما هي أجهزة الكمبيوتر في الحقيقة) ستعلمك على الأرجح. فصول دراسية - حسناً لا أفهم مشكلتك - هل كانت برامجك التعليمية منظمة تمامًا؟ إن الفصل الدراسي هو مجرد طريقة منطقية للنظر إلى نماذج الحياة الواقعية - فأنت تحاول حل مشكلة يمكن تلخيصها في عدد من الأشياء/الطبقات.

0
وأضاف

للمؤشرات:

لقد عثرت على هذه المشاركة نقاشًا مدروسًا للغاية حول المؤشرات. ربما هذا من شأنه أن يساعد. هل أنت فاميلار مع المراجع مثل في C #؟ هذا شيء في الواقع يشير إلى شيء آخر؟ قد يكون هذا بداية جيدة لفهم المؤشرات.

أيضا ، انظر إلى وظيفة كينت فردريك أدناه على طريقة أخرى لتقديم نفسك إلى المؤشرات.

0
وأضاف

للفصول الدراسية:

كانت لحظة الاختراق بالنسبة لي عندما علمت عن واجهات. كانت فكرة تجريد التفاصيل عن كيفية كتابتك لحل مشكلة ، وإعطاء قائمة من الأساليب التي تتفاعل مع الفصل الدراسي فكرة ثاقبة للغاية.

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

قصة قصيرة طويلة ، تتيح لك الصفوف إنهاء الوظائف وتسمية الجهاز بطريقة أنظف (معظم الأوقات ، هناك دائمًا استثناءات)

0
وأضاف
تسخير اختبار هو التعليمات البرمجية التي تمارس مجموعة أخرى من التعليمات البرمجية. كان أستاذي في الأساس برنامجًا رئيسيًا يسمى الوظائف في فئتنا. كان يقوم بإجراء الاختبار ووضع علامة على الصف وحذف الملف وإدراج ملف الطلاب التالي في حله وتكرار العملية بأكملها.
وأضاف المؤلف Jason Z, مصدر
ما هو "اختبار تسخير"؟
وأضاف المؤلف DarenW, مصدر

تظاهر المؤشر هو عنوان صفيف.

x = 500;//memory address for hello;
MEMORY[x] = "hello"; 
print  MEMORY[x]; 

إنه تبسيط بياني ، ولكن بالنسبة للجزء الأكبر طالما أنك لا تريد أن تعرف ما هو هذا الرقم أو تم إعداده باليد ، فيجب أن تكون بخير.

مرة أخرى عندما فهمت C كان لدي عدد قليل من وحدات الماكرو كان لدي الكثير مما يسمح لك باستخدام مؤشرات مثلما كانت مؤشر صفيف في الذاكرة. لكنني فقدت منذ زمن طويل هذا الرمز وطالما تم نسيانه.

أذكر أنه بدأ مع

#define MEMORY 0; 
#define MEMORYADDRESS( a ) *a;

وهذا في حد ذاته لا يكاد يكون مفيدا. نأمل أن يتمكن شخص آخر من التوسع في هذا المنطق.

0
وأضاف
نعم ، أنا لا أفهم ذلك ، أعتقد أن هذه طريقة رائعة لفهم المؤشرات. صفائف هي أسهل فهم من المؤشرات ، المنظمة البحرية الدولية ، لذلك أعتقد أنها نقطة انطلاق رائعة ..
وأضاف المؤلف Doug T., مصدر
أعتقد أن هذا أمر مثير للغاية. هيك في الكثير من النظم المضمنة لم يكن لدي مؤشر على الأشياء المخصصة بالنسبة لي ، كان لدي مؤشر مجموعة :).
وأضاف المؤلف Doug T., مصدر
لأولئك منكم downbashing لي لهذا المنصب ، وهو يعمل. اعتدت عليه ، لقد ساعدت الآخرين معه. حقيقة أن نظام التشغيل يستخرج كل شيء بالنسبة لك هو غير مهم لهذه الممارسة.
وأضاف المؤلف Kent Fredric, مصدر

To understand pointers, I can't recommend the K&R book highly enough.

0
وأضاف

هل قرأت لغة برمجة C ++ من Bjarne Stroustrup؟ لقد ابتكر C ++.

إن C ++ FAQ Lite جيد أيضًا.

0
وأضاف

النقطة التي حصلت فيها على مؤشرات كانت ترميز TurboPascal على FatMac (حوالي عام 1984 أو نحو ذلك) - والتي كانت لغة Mac الأصلية في ذلك الوقت.

كان لدى Mac نموذج ذاكرة فردية حيث تم تخصيص عنوان الذاكرة في مؤشر على الكومة ، ولكن لم يتم ضمان موقع ذلك في حد ذاته ، وعوضاً عن ذلك عادت إجراءات التعامل مع الذاكرة مؤشرًا إلى المؤشر - يُشار إليه كمؤشر . وبالتالي للوصول إلى أي جزء من الذاكرة المخصصة ، كان من الضروري حذف المقبض مرتين. استغرق الأمر بعض الوقت ، لكن الممارسة الثابتة أدت في نهاية المطاف إلى استحضار الدرس.

يسهل التعامل مع مؤشر Pascal على مؤشر C ++ ، حيث لا يساعد بناء الجملة المبتدئ. إذا كنت حقا تمسك بمؤشرات الفهم في C ، فقد يكون أفضل خيار لك هو الحصول على نسخة aa pascal compiler ومحاولة كتابة بعض رمز المؤشر الأساسي في ذلك (Pascal قريب بما يكفي إلى C سوف تحصل على الأساسيات في بضع ساعات ). ستكون القوائم المرتبطة وما شابه اختيارًا جيدًا. عندما تشعر بالراحة مع تلك العودة إلى C ++ ومع المفاهيم المتقنة ستجد أن المنحدر لن يكون حادًا جدًا.

0
وأضاف

يبدو بالفعل أن المؤشرات يتم تناولها (لا يقصد التورية) في إجابات أخرى.

تعتبر الفصول الدراسية أساسية بالنسبة إلى OO. كانت لدي مشكلة كبيرة في تحويل رأسي إلى OO - مثل عشر سنوات من المحاولات الفاشلة. الكتاب الذي ساعدني أخيراً كان "تطبيق UML وأنماط" Craig Larman. أعلم أن الأمر يبدو كما لو أنه يتعلق بشيء مختلف ، لكنه في الحقيقة يقوم بعمل رائع لتخفيفك إلى عالم الطبقات والأشياء.

0
وأضاف

This link has a video describing how pointers work, with claymation. Informative, and easy to digest.

This page has some good information on the basic of classes.

0
وأضاف
أي شيء مع claymation يحصل على +1 في كتابي.
وأضاف المؤلف Aardvark, مصدر

أفضل كتاب قرأته في هذه المواضيع هو التفكير في C ++ من قبل بروس إيكيل. يمكنك تنزيله مجانًا هنا .

0
وأضاف
بفضل الكتاب الذي تم تنزيله يأتي مع الكثير من الأمثلة
وأضاف المؤلف timmyg, مصدر

الطبقات سهلة الفهم نسبياً. يمكن أن يأخذك OOP سنوات عديدة. شخصيا ، لم أكن أدرك تماما OOP صحيح حتى العام الماضي-العش. من السيء للغاية أن سمول تالك ليست منتشرة في الكليات كما ينبغي أن تكون. انها حقا يدفع المنزل إلى النقطة التي OOP هو حول الكائنات تداول الرسائل ، بدلا من الطبقات المتغيرات المستقلة بذاتها مع وظائف.

إذا كنت حقا جديدة في الفصول الدراسية ، فإن هذا المفهوم قد يستغرق بعض الوقت لفهمه. عندما واجهتهم للمرة الأولى في الصف العاشر ، لم أحصل عليه حتى اكتشفت شخصًا يعرف ما يفعلونه من خلال التعليمة البرمجية وشرح ما يجري. هذا ما أقترح أن تجربه.

0
وأضاف

بمعنى من المعاني ، يمكنك اعتبار "المؤشرات" واحدًا من أكثر نوعين أساسيين في البرنامج - والأخرى هي "القيم" (أو "البيانات") - الموجودة في كتلة ضخمة من مواقع الذاكرة ذات العناوين الفريدة. فكر في الأمر. لا توجد الأشياء والهياكل وغيرها في الذاكرة ، ولا تفعل سوى القيم والمؤشرات. في الواقع ، المؤشر هو قيمة أيضًا .... قيمة عنوان الذاكرة ، والتي بدورها تحتوي على قيمة أخرى .... وهكذا.

So, in C/C++, when you declare an "int" (intA), you are defining a 32bit chunk of memory that contains a value - a number. If you then declare an "int pointer" (intB), you are defining a 32bit chunk of memory that contains the address of an int. I can assign the latter to point to the former by stating "intB = &intA", and now the 32bits of memory defined as intB, contains an address corresponding to intA's location in memory.

عند "dereference" مؤشر intB ، فإنك تنظر إلى العنوان المخزن داخل ذاكرة intB ، العثور على ذلك الموقع ، ثم تبحث في القيمة المخزنة هناك (رقم).

Commonly, I have encountered confusion when people lose track of exactly what it is they're dealing with as they use the "&", "*" and "->" operators - is it an address, a value or what? You just need to keep focused on the fact that memory addresses are simply locations, and that values are the binary information stored there.

0
وأضاف

لا تعد المؤشرات والصفوف موضوعات متقدمة حقًا في C ++. إنها أساسية جدًا.

بالنسبة لي ، وصلبت المؤشرات عندما بدأت في رسم مربعات بالسهام. ارسم مربعًا لـ int. و IN * هو الآن مربع منفصل مع وجود سهم يشير إلى مربع الباحث.

وبالتالي:

int foo = 3;          //integer
int* bar = &foo;      //assigns the address of foo to my pointer bar

مع مربع المؤشر الخاص بي (شريط) لدي خيار إما النظر إلى العنوان داخل المربع. (وهو عنوان ذاكرة foo). أو أستطيع التلاعب بأي شيء لدي عنوان. ويعني هذا التلاعب أنني أتبع هذا السهم إلى العدد الصحيح (foo).

*bar = 5; //asterix means "dereference" (follow the arrow), foo is now 5
bar = 0;  //I just changed the address that bar points to

الطبقات هي موضوع آخر تماما. هناك بعض الكتب عن تصميم وجوه المنحى ، ولكن أنا لا أعرف جيدة منها للمبتدئين من أعلى رأسي. قد يكون لديك حظ مع مقدمة كتاب جافا.

0
وأضاف
إنها مواضيع متقدمة بالنسبة لي ، هاها ، أفهم الأمثلة الخاصة بك هنا ، ولكن عندما أحاول أن أفهم رمز شخص آخر لا أستطيع معرفة ذلك ... ربما أنا فقط بحاجة إلى المزيد من الخبرة ... شكرا على الرد.
وأضاف المؤلف timmyg, مصدر
أنا ثاني هذا. بالنسبة للمبتدئين ، قم دائمًا بترجمة "المؤشر" إلى "العنوان" و "الانحراف" إلى "السفر إلى العنوان" ، تمامًا مثل قيادة السيارة. تصبح المؤشرات إلى مؤشرات إعادة توجيه صناديق البريد - عناوين ، عندما تذهب إلى هناك ، تجد عنوانًا آخر بدلاً من موقع التخزين.
وأضاف المؤلف Aaron, مصدر
قد يكون كثيرًا من هذا الرمز ليس مكتوبًا جيدًا. لقد قضيت يومًا كبيرًا من الوقت في محاولة معرفة كيفية عمل بعض الرموز الثقيلة. استسلمت وطلبت متفوقة. نظر إليها لمدة 2 ثانية وقال "هوه. هذا سيسبب تحطمًا. إصلاحه بشكل أفضل." الخبرة: القدرة على النظر إلى العينة ، ورؤيتها تفعل شيئًا غريبًا ، والتفكير "هناك شيء خاطئ في هذا" بدلاً من "هناك شيء خاطئ معي".
وأضاف المؤلف deworde, مصدر

فهم المؤشرات في C/C ++

قبل أن يتمكن المرء من فهم كيفية عمل المؤشرات ، من الضروري فهم كيفية تخزين المتغيرات والوصول إليها في البرامج. يحتوي كل متغير على جزأين - (1) عنوان الذاكرة حيث يتم تخزين البيانات و (2) قيمة البيانات المخزنة.

غالبًا ما يُشار إلى عنوان الذاكرة على أنه لقيمة متغير ، ويشار إلى قيمة البيانات المخزنة على أنها rvalue (l و r تعني اليسار واليمين).

النظر في البيان:

int x = 10;

داخليًا ، يقوم البرنامج بربط عنوان الذاكرة مع المتغير x. في هذه الحالة ، لنفترض أن البرنامج يعيّن x ليقيم على العنوان 1001 (وليس عنوانًا واقعيًا ، ولكن يتم اختياره للبساطة). لذلك ، فإن lvalue (عنوان الذاكرة) لـ x هو 1001 ، و rvalue (قيمة البيانات) لـ x هي 10.

The rvalue is accessed by simply using the variable “x”. In order to access the lvalue, the “address of” operator (‘&’) is needed. The expression ‘&x’ is read as "the address of x".

Expression          Value
----------------------------------
x                   10
&x                  1001

The value stored in x can be changed at any time (e.g. x = 20), but the address of x (&x) can never be changed.

المؤشر ببساطة هو متغير يمكن استخدامه لتعديل متغير آخر. يفعل ذلك عن طريق وجود عنوان ذاكرة ل rvalue. أي ، يشير إلى موقع آخر في الذاكرة.

يتم إنشاء مؤشر إلى "×" كما يلي:

int* xptr = &x;

The “int*” tells the compiler that we are creating a pointer to an integer value. The “= &x” part tells the compiler that we are assigning the address of x to the rvalue of xptr. Thus, we are telling the compiler that xptr “points to” x.

إذا افترضنا أنه تم تعيين xptr لعنوان ذاكرة 1002 ، فقد تبدو ذاكرة البرنامج كما يلي:

Variable    lvalue    rvalue
--------------------------------------------
x           1001      10   
xptr        1002      1001

الجزء التالي من اللغز هو "عامل التشغيل غير المباشر" ("*") ، والذي يتم استخدامه على النحو التالي:

int y = *xptr;

يخبر عامل التشغيل indirection البرنامج بتفسير rvalue من xptr كعنوان ذاكرة بدلاً من قيمة بيانات. بمعنى ، يبحث البرنامج عن قيمة البيانات (10) المخزنة على العنوان المقدم من xptr (1001).

ضع كل شيء معا:

Expression      Value
--------------------------------------------
x                   10
&x                  1001
xptr                1001
&xptr               1002
*xptr               10

الآن وقد تم شرح المفاهيم ، إليك بعض التعليمات البرمجية لإظهار قوة المؤشرات:

int x = 10;
int *xptr = &x;

printf("x = %d\n", x);
printf("&x = %d\n", &x);        
printf("xptr = %d\n", xptr);
printf("*xptr = %d\n", *xptr);

*xptr = 20;

printf("x = %d\n", x);
printf("*xptr = %d\n", *xptr);

للإخراج الذي ستراه (ملاحظة: سيكون عنوان الذاكرة مختلفًا في كل مرة):

x = 10
&x = 3537176
xptr = 3537176
*xptr = 10
x = 20
*xptr = 20

Notice how assigning a value to ‘*xptr’ changed the value of ‘x’. This is because ‘*xptr’ and ‘x’ refer to the same location in memory, as evidenced by ‘&x’ and ‘xptr’ having the same value.

0
وأضاف
شكرا لاستجابة مفيدة للغاية
وأضاف المؤلف timmyg, مصدر
حصلت lvalues ​​و rvalues ​​لا علاقة مع عناوين الذاكرة.
وأضاف المؤلف Puppy, مصدر

The book that cracked pointers for me was Illustrating Ansi C by Donald Alcock. Its full of hand-drawn-style box and arrow diagrams that illustrate pointers, pointer arithmetic, arrays, string functions etc...

من الواضح أنه كتاب "C" ولكن للأساسيات الأساسية من الصعب التغلب عليها

0
وأضاف

أحد الأشياء التي ساعدتني في فهم هذه المفاهيم هي تعلم UML - لغة النمذجة الموحدة. لقد ساعدتني رؤية مفاهيم التصميم الموجه للكائنات في تنسيق رسومي في معرفة ما تعنيه. في بعض الأحيان ، قد يكون فهم هذه المفاهيم بحتة من خلال النظر في تعليمات برمجية المصدر أمرًا يصعب فهمه.

رؤية النماذج المنحى وجوه مثل الميراث في شكل رسوم بيانية هو وسيلة قوية للغاية لفهم هذا المفهوم.

يعتبر UML Distilled من مارتن فاولر مقدمة جيدة وجيزة.

0
وأضاف

لا يوجد بديل عن الممارسة.

من السهل قراءة كتاب أو الاستماع إلى محاضرة وتشعر أنك تتابع ما يجري.

ما أود أن أوصي به هو أخذ بعض أمثلة التعليمات البرمجية (أفترض أنه لديك على القرص في مكان ما) ، تجميعها وتشغيلها ، ثم محاولة تغييرها للقيام بشيء مختلف.

  • أضف فئة فرعية أخرى إلى تسلسل هرمي
  • أضف طريقة لفئة حالية
  • تغيير خوارزمية تكررت إلى الأمام من خلال مجموعة للذهاب إلى الوراء بدلاً من ذلك.

لا أعتقد أن هناك أي كتاب "رصاصة فضية" سيفعل ذلك.

بالنسبة لي ، ما كان يقودني إلى ما كانت تقصده المؤشرات هو العمل في التجميع ، ورؤية أن المؤشر كان في الواقع مجرد عنوان ، وأن وجود مؤشر لا يعني أن ما يشير إليه كان كائنًا ذا مغزى.

0
وأضاف

للمؤشرات والدروس ، هنا تشبيهي. سأستخدم مجموعة من البطاقات. يحتوي سطح البطاقات على القيمة الاسمية ونوع (9 من القلوب ، 4 من البستوني ، إلخ). لذا في لغة C ++ لدينا مثل لغة برمجة "Deck of Cards" سنقول ما يلي:

HeartCard card = 4;//4 of hearts!

الآن ، أنت تعرف أين تكون 4 من القلوب بسبب golly ، كنت تحتجز سطح السفينة ، وجها لوجه في يدك ، وهو في الأعلى! لذا بالنسبة لبقية البطاقات ، سنقول أن 4 من القلوب في بداية اللعبة. لذا ، إذا سألتك عن البطاقة في BEGINNING ، فستقول ، "The 4 of hearts of course!". حسنا ، أنت فقط "أشرت" إلى حيث البطاقة. في لغة برمجة "Deck of Cards" ، يمكنك أيضًا قول ما يلي:

HeartCard card = 4;//4 of hearts!
print &card//the address is BEGINNING!

الآن ، قم بتشغيل مجموعة أوراق اللعب الخاصة بك. الجانب الخلفي هو الآن BEGINNING وأنت لا تعرف ما هي البطاقة. لكن ، لنفترض أنك تستطيع أن تجعل ما تريده لأنك مليء بالسحر. دعونا نفعل ذلك في خطنا "سطح البطاقات"!

HeartCard *pointerToCard = MakeMyCard( "10 of hearts" );
print pointerToCard//the value of this is BEGINNING!
print *pointerToCard//this will be 10 of hearts!

حسنًا ، كانت MakeMyCard ("10 من القلوب") تقوم بسحرك ومعرفتك أنك تريد أن تشير إلى BEGINNING ، مما يجعل البطاقة 10 من القلوب! قمت بإغلاق بطاقتك و ، فويلا! الآن ، قد يرميك. إذا كان الأمر كذلك ، فتحقق من ذلك:

HeartCard *pointerToCard = MakeMyCard( "10 of hearts" );
HeartCard card = 4;//4 of hearts!
print *pointerToCard;//prints 10 of hearts
print pointerToCard;//prints BEGINNING
print card;//prints 4 of hearts
print &card;//prints END - the 4 of hearts used to be on top but we flipped over the deck!

بالنسبة للصفوف ، كنا نستخدم الطبقات في المثال عن طريق تحديد نوع Card Card. نحن نعرف ما هي بطاقة HeartCard ... إنها بطاقة ذات قيمة ونوع من القلب! لذا ، قمنا بتصنيف ذلك كجهاز HeartCard. كل لغة لها طريقة مشابهة لتعريف أو "تصنيف" ما تريد ، لكنهم جميعا يشتركون في نفس المفهوم! آمل أن يكون هذا ساعد ...

0
وأضاف
كان هذا تشبيه رديء إلى حد ما.
وأضاف المؤلف FlySwat, مصدر

Pointers are not some sort of magical stuff, you're using them all the time!
When you say:

int a;

and the compiler generates storage for 'a', you're practically saying that you're declaring
an int and you want to name its memory location 'a'.

When you say:

int *a;

أنت تعلن عن متغير يمكنه الاحتفاظ بموقع ذاكرة لـ int. بكل بساطة. أيضا ، لا تخف حول علم الحساب ، فقط دائما ضع في اعتبارك "خريطة الذاكرة" عندما تتعامل مع المؤشرات وتفكر في المصطلحات من المشي من خلال عناوين الذاكرة.

تعتبر الفئات في C ++ طريقة واحدة فقط لتعريف أنواع البيانات المجردة. أود أن أقترح قراءة كتاب OOP جيد لفهم المفهوم ، إذن ، إذا كنت مهتمًا ، تعلم كيفية إنشاء برامج التحويل بلغة C ++ رمزًا لمحاكاة OOP. ولكن هذه المعرفة سوف تأتي في الوقت المناسب ، إذا كنت تمسك مع C ++ طويلة بما فيه الكفاية :)

0
وأضاف

Your problem seems to be the C core in C++, not C++ itself. Get yourself the Kernighan & Ritchie (The C Programming Language). Inhale it. It's very good stuff, one of the best programming language books ever written.

0
وأضاف

في حالة الفصول الدراسية ، كان لدي ثلاث تقنيات ساعدتني حقاً في جعل القفزة في البرمجة الحقيقية للكائنات.

الأول هو أنني كنت أعمل في مشروع ألعاب استخدم الاستخدام المكثف للفصول والأشياء ، مع استخدام كثيف للتعميم (نوع من أو علاقة ، مثال: طالب هو نوع من الأشخاص) وتكوينه (له علاقة ، طالب سابق لديه قرض طالب). استغرق كسر هذا القانون الكثير من العمل ، ولكن في الواقع جعل الأمور في نصابها.

The second thing that helped was in my System Analysis class, where I had to make http://www.agilemodeling.com/artifacts/classDiagram.htm">UML class diagrams. These I just really found helped me understand the structure of classes in a program.

أخيرًا ، أساعد في تعليم الطلاب في كليتي في البرمجة. كل ما يمكنني قوله حقا عن هذا هو أنك تتعلم الكثير عن طريق التدريس ورؤية نهج الآخرين تجاه مشكلة. في كثير من الأحيان ، يجرب أحد الطلاب أشياء لم أكن لأفكر بها من قبل ، ولكن عادة ما يكون لدي الكثير من المعنى ، ولديهم مشاكل في تنفيذ فكرتهم.

أفضل نصيحة لي هي أن الأمر يتطلب الكثير من التدريب ، وكلما زاد برنامجك ، ستفهمه بشكل أفضل.

0
وأضاف