सी ++ में मैं पॉइंटर्स और कक्षाओं को समझ नहीं सकता

मैं कॉलेज से बाहर ताजा हूं और कुछ समय से सी ++ में काम कर रहा हूं। मैं सी ++ की सभी मूल बातें समझता हूं और उनका उपयोग करता हूं, लेकिन मुझे पॉइंटर्स और कक्षाओं जैसे अधिक उन्नत विषयों को समझने में कठिनाई हो रही है। मैंने कुछ किताबें और ट्यूटोरियल पढ़े हैं और मैं उन में उदाहरणों को समझता हूं, लेकिन फिर जब मैं कुछ उन्नत वास्तविक जीवन उदाहरणों को देखता हूं तो मैं उन्हें समझ नहीं सकता। यह मुझे मार रहा है क्योंकि मुझे लगता है कि यह मुझे अपने सी ++ प्रोग्रामिंग को अगले स्तर पर लाने से रोकता है। क्या किसी और को यह समस्या है? यदि हां, तो आपने इसे कैसे तोड़ दिया? क्या किसी को किसी भी किताब या ट्यूटोरियल के बारे में पता है जो वास्तव में पॉइंटर्स और कक्षा अवधारणाओं का वर्णन करता है? या शायद उन्नत पॉइंटर्स और कक्षा तकनीकों का उपयोग कर अच्छी वर्णनात्मक टिप्पणियों के साथ कुछ उदाहरण कोड? किसी भी तरह की सहायता का स्वागत किया जाएगा।

0
एफवाईआई, पॉइंटर्स और कक्षाएं सी ++ की मूल बातें हैं।
जोड़ा लेखक Wedge, स्रोत
अनुलेख सी ++ एक बहुत समृद्ध और व्यापक भाषा है। यदि आप उन्नत उदाहरणों को समझ नहीं सकते हैं जिसका अर्थ यह नहीं है कि आप कुछ खो रहे हैं ("उन्नत" सी ++ खरगोश छेद बहुत गहरा हो जाता है)। यदि आप हालांकि अधिक विशिष्ट जानकारी प्रदान करते हैं तो इससे मदद मिलेगी।
जोड़ा लेखक Wedge, स्रोत
मुझे लगता है - आप कम्प्यूटेशनल गणित कोड लिख रहे हैं, और पॉइंटर्स की समझ की आपकी कमी बहुआयामी डेटा की प्रसंस्करण के तरीके में हो जाती है। बंद करे?
जोड़ा लेखक Arkadiy, स्रोत
बहुत सारे जवाब वास्तव में अच्छे थे। उत्तर देने वाले हर किसी के लिए बहुत धन्यवाद। मैं कुछ प्रतिक्रियाओं का पालन करूंगा, लेकिन ऐसा लगता है कि मुझे बस इसके साथ रहना और अधिक अनुभव प्राप्त करना है।
जोड़ा लेखक timmyg, स्रोत
मैंने अपने प्रश्न में इसे स्पष्ट करने की कोशिश की, लेकिन शायद मैंने नहीं किया, कि मैं पाठ्यपुस्तक पाठों और उदाहरणों के संदर्भ में पॉइंटर्स और कक्षाओं को समझता हूं। लेकिन जब मुझे किसी और के कोड को पढ़ने और समझने की ज़रूरत होती है, उदाहरण के लिए पॉइंटर्स और कक्षाओं के साथ एक सॉफ्टवेयर एपीआई है जहां मुझे समझ में परेशानी होती है।
जोड़ा लेखक timmyg, स्रोत
इस ज्ञान के बिना थोड़ी देर के लिए आप सी ++ के साथ वास्तव में कैसे काम करते हैं ...? सी ++ डब्ल्यू/ओ कक्षाएं सी की तरह लगती हैं, और सी w/o पॉइंटर्स उम की तरह लगता है .....
जोड़ा लेखक Aardvark, स्रोत
यदि आप कक्षाओं की अवधारणा को समझ नहीं पाते हैं तो आप सी ++ की चाटना नहीं जानते हैं। और यदि आप पॉइंटर्स को नहीं समझते हैं, तो आप शायद सी को नहीं जानते ... शिक्षा प्रणाली असफल हो जाती है
जोड़ा लेखक FlySwat, स्रोत
जिज्ञासा से, कॉलेज में रहते हुए आपने किन भाषाओं को सीखा? शुद्ध कार्यात्मक भाषाओं के अलावा मैं ऐसी किसी भी भाषा के बारे में नहीं सोच सकता जिसके पास पॉइंटर्स या कक्षाएं नहीं हैं।
जोड़ा लेखक David Locke, स्रोत

27 उत्तर

पॉइंटर्स को बेहतर ढंग से समझने के लिए, मुझे लगता है कि यह देखने के लिए उपयोगी हो सकता है कि असेंबली भाषा पॉइंटर्स के साथ कैसे काम करती है। पॉइंटर्स की अवधारणा वास्तव में असेंबली भाषा और x86 प्रोसेसर निर्देश वास्तुकला के मौलिक भागों में से एक है। शायद यह आपको तरह की तरह गिरने देगा जैसे पॉइंटर्स एक कार्यक्रम का एक प्राकृतिक हिस्सा हैं।

कक्षाओं के रूप में, ओओ प्रतिमान से अलग मुझे लगता है कि निम्न स्तर के बाइनरी परिप्रेक्ष्य से कक्षाओं को देखना दिलचस्प हो सकता है। वे मूल स्तर पर इस संबंध में जटिल नहीं हैं।

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

0
जोड़ा

आपको यह जोएल द्वारा निर्देश निर्देशक मिल सकता है। एक तरफ, यदि आप "कुछ समय के लिए सी ++ में काम कर रहे हैं" और सीएस में स्नातक की उपाधि प्राप्त की है, तो आप जावास्कूल में जा सकते हैं (मैं तर्क दूंगा कि आप सी ++ में बिल्कुल काम नहीं कर रहे हैं; आपके पास है सी में काम कर रहा है लेकिन सी ++ कंपाइलर का उपयोग कर रहा है)।

इसके अलावा, होजौ और एनएसैंडर्स के जवाबों के लिए, पॉइंटर्स सी ++ के लिए बहुत मौलिक हैं। यदि आप पॉइंटर्स को नहीं समझते हैं, तो आप सी ++ की मूल बातें समझ नहीं पाते हैं (इस तथ्य को स्वीकार करना सी ++ को समझने की शुरुआत है)। इसी तरह, यदि आप कक्षाओं को नहीं समझते हैं, तो आप सी ++ (या उस मामले के लिए ओओ) की मूल बातें नहीं समझते हैं।

पॉइंटर्स के लिए, मुझे लगता है कि बक्से के साथ ड्राइंग एक अच्छा विचार है, लेकिन असेंबली में काम करना भी एक अच्छा विचार है। रिश्तेदार पते का उपयोग करने वाले कोई भी निर्देश आपको समझने के लिए समझेंगे कि कौन से पॉइंटर्स अपेक्षाकृत जल्दी हैं, मुझे लगता है।

कक्षाओं के लिए (और ऑब्जेक्ट उन्मुख प्रोग्रामिंग अधिक आम तौर पर), मैं स्ट्रॉस्ट्रप्स "द सी ++ प्रोग्रामिंग लैंग्वेज" नवीनतम संस्करण की अनुशंसा करता हूं। न केवल यह कैनोलिक सी ++ संदर्भ सामग्री है, बल्कि मूल ऑब्जेक्ट उन्मुख वर्ग पदानुक्रमों और विरासत से बड़ी प्रणालियों में सिद्धांतों को डिजाइन करने के लिए सभी अन्य चीजों पर भी बहुत सारी सामग्री है। यह एक बहुत अच्छा पढ़ा है (अगर थोड़ा मोटी नहीं है और धब्बे में terse)।

0
जोड़ा
लॉल, मैंने जोएल द्वारा उस लेख को पढ़ा और यही कारण है कि मुझे यहां आ गया और पॉइंटर्स के बारे में प्रश्नों की खोज की।
जोड़ा लेखक Spidey, स्रोत

असेंबली भाषा सीखें और फिर सी सीखें। फिर आपको पता चलेगा कि मशीन के अंतर्निहित सिद्धांत क्या हैं (और पहले संकेतक)।

पॉइंटर्स और कक्षाएं सी ++ के मौलिक पहलू हैं। यदि आप उन्हें समझ नहीं पाते हैं तो इसका मतलब है कि आप वास्तव में सी ++ को नहीं समझते हैं।

व्यक्तिगत रूप से मैंने कई वर्षों तक सी ++ पर वापस रखा जब तक मुझे लगा कि मुझे सी की दृढ़ समझ थी और असेंबली भाषा में हुड के नीचे क्या हो रहा था। हालांकि यह काफी समय पहले था, मुझे लगता है कि यह समझने के लिए कि यह कंप्यूटर निम्न स्तर पर कैसे काम करता है, यह वास्तव में मेरे करियर को लाभान्वित हुआ।

कार्यक्रम सीखना कई सालों लग सकता है, लेकिन आपको इसके साथ रहना चाहिए क्योंकि यह एक बहुत ही पुरस्कृत करियर है।

0
जोड़ा

Lassevek की प्रतिक्रिया से SO पर समान प्रश्न :

पॉइंटर्स एक अवधारणा है कि कई लोगों के लिए   पहले, में उलझन में हो सकता है   विशेष रूप से जब यह कॉपी करने की बात आती है   पॉइंटर मूल्य चारों ओर और अभी भी   उसी मेमोरी ब्लॉक का संदर्भ देना।

     

मैंने पाया है कि सबसे अच्छा सादृश्य है   सूचक के रूप में सूचक के रूप में विचार करें   कागज पर एक घर के पते के साथ, और   स्मृति इसे संदर्भ के रूप में संदर्भित करता है   वास्तविक घर संचालन के सभी प्रकार   इस प्रकार आसानी से समझाया जा सकता है:

     
      
  • सूचक मूल्य कॉपी करें, बस पेपर के नए टुकड़े पर पता लिखें
  •   
  • लिंक्ड सूचियां, घर के पेपर का टुकड़ा अगले पते के साथ   उस पर घर
  •   
  • स्मृति को मुक्त करना, घर को ध्वस्त करना और पता मिटा देना
  •   
  • मेमोरी लीक, आप कागज का टुकड़ा खो देते हैं और घर नहीं ढूंढ सकते
  •   
  • स्मृति को मुक्त करना लेकिन एक (अब अमान्य) संदर्भ रखना, ध्वस्त करना   घर, के टुकड़ों में से एक मिटा दें   पेपर लेकिन कागज का एक और टुकड़ा है   उस पर पुराने पते के साथ, जब आप   पते पर जाएं, आपको कोई नहीं मिलेगा   घर, लेकिन आप कुछ मिल सकता है   यह एक
  • के खंडहर जैसा दिखता है   
  • बफर ओवररन, आप घर से ज्यादा सामान ले सकते हैं जितना आप कर सकते हैं   संभवतः फिट, में फैल रहा है   पड़ोसियों का घर
  •   
0
जोड़ा

पॉइंटर्स और कक्षाएं पूरी तरह से अलग-अलग विषय हैं इसलिए मैं वास्तव में उन्हें इस तरह एक साथ नहीं जोड़ूंगा। दोनों में से, मैं कहूंगा कि पॉइंटर्स अधिक मौलिक हैं।

पॉइंटर्स के बारे में जानने के लिए एक अच्छा अभ्यास निम्नलिखित है:

  1. एक लिंक की गई सूची बनाएं
  2. इसे शुरू से ही खत्म करने के लिए पुन: प्रारंभ करें
  3. इसे उलट दें ताकि सिर अब पीछे हो और पीठ अब सिर हो

इसे सब एक व्हाइटबोर्ड पर पहले करें। यदि आप इसे आसानी से कर सकते हैं, तो आपको पॉइंटर्स समझने में कोई और समस्या नहीं होनी चाहिए।

0
जोड़ा

हम सिर्फ दोपहर के भोजन पर सी ++ और ओओ के कुछ पहलुओं पर चर्चा कर रहे थे, कोई (वास्तव में एक महान इंजीनियर) कह रहा था कि जब तक आप सी ++ सीखने से पहले वास्तव में मजबूत प्रोग्रामिंग पृष्ठभूमि नहीं रखते हैं, तो यह आपको सचमुच बर्बाद कर देगा।

मैं सबसे पहले एक और भाषा सीखने की सलाह देता हूं, फिर जब आपको इसकी आवश्यकता होती है तो सी ++ में स्थानांतरित हो जाती है। ऐसा नहीं है कि पॉइंटर्स के बारे में कुछ भी बढ़िया है, वे केवल एक वेस्टिगियल टुकड़ा हैं जब एक कंपाइलर ऑपरेशन को उनके बिना कुशलता से असेंबली में परिवर्तित करना मुश्किल था।

इन दिनों यदि एक कंपाइलर एक सरणी ऑपरेशन को बेहतर ढंग से अनुकूलित नहीं कर सकता है तो आप पॉइंटर्स का उपयोग कर सकते हैं, आपका कंपाइलर टूटा हुआ है।

कृपया मुझे गलत मत समझो, मैं यह नहीं कह रहा हूं कि सी ++ भयानक है या कुछ भी है और वकालत की चर्चा शुरू नहीं करना चाहता, मैंने इसका इस्तेमाल किया है और इसे कभी-कभी उपयोग कर रहा हूं, मैं बस आपको कुछ और शुरू करने की सिफारिश कर रहा हूं ।

यह वास्तव में एक मैन्युअल कार को चलाने के लिए सीखना पसंद नहीं है, फिर आसानी से इसे स्वचालित रूप से लागू करने में सक्षम होने के कारण, यह उन विशाल निर्माण क्रेनों में से एक पर ड्राइव करना सीखने की तरह है, यह मानते हुए कि जब आप कार चलाने शुरू करते हैं तो लागू होगा - तब आप अपनी आपातकालीन रोशनी के साथ 5 एमएफ पर सड़क के बीच में अपनी गाड़ी चलाएं।

[संपादित करें] कि अंतिम पैराग्राफ की समीक्षा करना - मुझे लगता है कि शायद मेरा सबसे सटीक सादृश्य हो सकता है!

0
जोड़ा
कोई भी भाषा जो आप पहले सीखने के लिए सुझाव देते हैं? क्या पाइथन अच्छा विकल्प होगा? मैं वर्तमान में PHP और सी ++ सीखने की कोशिश कर रहा हूं, सिंटैक्स के अनुसार वे बहुत समान हैं।
जोड़ा लेखक timmyg, स्रोत
ओह, और यदि आप वास्तव में रक्तस्राव एज प्रोग्रामिंग अवधारणाओं को सीखना चाहते हैं, तो स्कैला को देखें। ईमानदारी से यह उन सभी अवधारणाओं के कारण सबसे अच्छा हो सकता है जो आपको सही तरीके से उजागर करते हैं। हास्कल और लिस्प भी अच्छी प्रोग्रामिंग अवधारणाओं को पढ़ाने के लिए जाने जाते हैं।
जोड़ा लेखक Bill K, स्रोत
सी # और जावा अच्छे हैं क्योंकि वे संकलित समय की जांच और ईमानदारी से हैं कि यह वास्तव में अच्छी आदत है। यदि आप बस मूर्ख होना चाहते हैं, तो पाइथन अच्छा है। यदि आप एक वेबसाइट कर रहे हैं, रूबी ऑन रेल - अवधि।
जोड़ा लेखक Bill K, स्रोत

मुझे पास्कल रास्ते में पॉइंटर्स को समझने में समस्या होती थी :) एक बार जब मैं एंबलर पॉइंटर्स करना शुरू कर देता था तो वास्तव में स्मृति तक पहुंचने का एकमात्र तरीका था और यह मुझे बस मारता था। यह एक बहुत ही शॉट की तरह लग सकता है, लेकिन असेंबलर की कोशिश कर रहा है (जो हमेशा कंप्यूटर के बारे में वास्तव में कोशिश करने और समझने का एक अच्छा विचार है) शायद आपको पॉइंटर्स सिखाएंगे। कक्षाएं - अच्छी तरह से मैं आपकी समस्या को समझ नहीं पा रहा हूं - क्या आपकी स्कूली शिक्षा शुद्ध संरचित प्रोग्रामिंग थी? एक वर्ग वास्तविक जीवन मॉडल को देखने का एक तार्किक तरीका है - आप ऐसी समस्या को हल करने की कोशिश कर रहे हैं जिसे कई वस्तुओं/वर्गों में समझा जा सकता है।

0
जोड़ा

पॉइंटर्स के लिए:

मैंने इस पोस्ट को पॉइंटर्स के बारे में बहुत विचारशील चर्चा मिली। शायद वह मदद करेगा। क्या आप सी # में जैसे रिफ्रेंस के साथ familar हैं? यह ऐसा कुछ है जो वास्तव में संदर्भित करता है कुछ और करने के लिए? पॉइंटर्स को समझने के लिए शायद एक अच्छी शुरुआत है।

इसके अलावा, पॉइंटर्स को पेश करने के लिए एक और तरीके से केंट फ्रेड्रिक की पोस्ट को नीचे देखें।

0
जोड़ा

कक्षाओं के लिए:

मेरे लिए ब्रेकथ्रू पल था जब मैंने इंटरफेस के बारे में सीखा। आपने जिस समस्या को हल किया है, उसके बारे में ब्योरा देने का विचार, और कक्षा के साथ बातचीत करने वाली विधियों की एक सूची देना बहुत अंतर्दृष्टिपूर्ण था।

असल में, मेरे प्रोफेसर ने हमें स्पष्ट रूप से बताया कि वह हमारे वर्गों को अपने परीक्षण दोहन में जोड़कर हमारे कार्यक्रमों को ग्रेड करेगा। ग्रेडिंग हमें दी गई आवश्यकताओं के आधार पर की जाएगी और क्या कार्यक्रम क्रैश हो गया है।

लंबी कहानी छोटी, कक्षाएं आपको कार्यक्षमता को लपेटने देती हैं और इसे क्लीनर तरीके से कॉल करती हैं (ज्यादातर समय, हमेशा अपवाद होते हैं)

0
जोड़ा
एक परीक्षण दोहन कोड है जो कोड का एक और सेट व्यायाम करता है। मेरे प्रोफेसर के मूल रूप से एक मुख्य कार्यक्रम था जिसे हमारी कक्षा में कार्य कहा जाता था। वह परीक्षा चलाएगा, ग्रेड चिह्नित करेगा, अपनी फाइल हटा देगा, और अगले छात्रों को अपने समाधान में फाइल करेगा और पूरी प्रक्रिया दोहराएगा।
जोड़ा लेखक Jason Z, स्रोत
"परीक्षण दोहन" क्या है?
जोड़ा लेखक DarenW, स्रोत

एक सूचक का बहाना एक सरणी पता है।

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

यह एक ग्राफिक oversimplification है, लेकिन अधिकांश भाग के लिए जब तक आप कभी नहीं जानना चाहते हैं कि वह संख्या क्या है या हाथ से सेट है, तो आप ठीक होना चाहिए।

वापस जब मुझे सी समझ में आया तो मेरे पास कुछ मैक्रोज़ थे जिनके पास आपको पॉइंटर्स का उपयोग करने की अनुमति दी गई थी जैसे कि वे थे स्मृति में एक सरणी अनुक्रमणिका थे। लेकिन जब से मैं उस कोड को खो देता हूं और लंबे समय से भूल गया हूं।

मुझे याद है कि यह शुरू हुआ

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

और यह कि अपने आप पर शायद ही उपयोगी है। उम्मीद है कि कोई और उस तर्क पर विस्तार कर सकता है।

0
जोड़ा
हाँ, मुझे यह समझ में नहीं आता, मुझे लगता है कि यह पॉइंटर्स को समझने का एक शानदार तरीका है। तीर पॉइंटर्स, आईएमओ की तुलना में आसान समझते हैं, इसलिए मुझे लगता है कि यह एक महान प्रारंभिक बिंदु है ..
जोड़ा लेखक Doug T., स्रोत
मुझे लगता है कि यह एक बहुत उपयोगी excersize है। बहुत सारे एम्बेडेड सिस्टम में बिल्ली में मेरे पास आवंटित चीजों के लिए पॉइंटर नहीं था, मेरे पास एक सरणी अनुक्रमणिका थी :)।
जोड़ा लेखक Doug T., स्रोत
आप में से उन लोगों के लिए जो इस पोस्ट के लिए मुझे कम कर रहे हैं, यह काम करता है। मैंने इसका इस्तेमाल किया, मैंने इसके साथ दूसरों की मदद की। तथ्य यह है कि ओएस आपके लिए यह सब कुछ बताता है व्यायाम के लिए महत्वहीन है।
जोड़ा लेखक Kent Fredric, स्रोत

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

0
जोड़ा

क्या आपने Bjarne Stroustrup की सी ++ प्रोग्रामिंग भाषा पढ़ी? उन्होंने सी ++ बनाया।

सी ++ एफएक्यू लाइट भी अच्छा है।

0
जोड़ा

जिस बिंदु पर मुझे वास्तव में पॉइंटर्स मिलते थे, वह फ़ैटमैक (लगभग 1 9 84 या उससे भी कम) पर टर्बोपास्कल को कोड कर रहा था - उस समय मूल मैक भाषा थी।

मैक में एक अजीब स्मृति मॉडल था, जिससे पता लगाया गया था कि स्मृति को ढेर पर एक सूचक में संग्रहीत किया गया था, लेकिन उस स्थान का स्वयं की गारंटी नहीं थी और इसके बजाय मेमोरी हैंडलिंग रूटीन पॉइंटर को पॉइंटर लौटा दी - जिसे एक हैंडल के रूप में जाना जाता है । नतीजतन आवंटित स्मृति के किसी भी हिस्से तक पहुंचने के लिए इसे दो बार संभालना आवश्यक था। इसमें थोड़ी देर लग गई, लेकिन निरंतर अभ्यास ने अंततः पाठ घर चलाया।

पास्कल का पॉइंटर हैंडलिंग सी ++ की तुलना में समझना आसान है, जहां सिंटैक्स शुरुआत करने में मदद नहीं करता है। यदि आप वास्तव में और सचमुच सी में समझने वाले पॉइंटर्स फंस गए हैं तो आपका सबसे अच्छा विकल्प कॉपी ए पास्कल कंपाइलर प्राप्त करना और इसमें कुछ मूल सूचक कोड लिखने का प्रयास करना चाहिए (पास्कल सी के पास पर्याप्त है, आपको कुछ घंटों में मूल बातें मिलेंगी )। लिंक्ड सूचियां और पसंद एक अच्छी पसंद होगी। एक बार जब आप उन लोगों के साथ सहज महसूस कर सकें जो सी ++ पर वापस आते हैं और अवधारणाओं के साथ आपको पता चलेगा कि चट्टान इतनी खड़ी नहीं दिखाई देगी।

0
जोड़ा

अन्य उत्तरों में पॉइंटर्स को संबोधित किया जा सकता है (कोई इरादा नहीं है)।

कक्षाएं ओओ के लिए मौलिक हैं। मुझे ओओ में अपने सिर को तोड़ने में जबरदस्त परेशानी थी - जैसे दस साल के असफल प्रयास। जिस पुस्तक ने आखिरकार मेरी मदद की वह क्रेग लार्मन की "यूएमएल और पैटर्न लागू करना" था। मुझे पता है कि ऐसा लगता है जैसे यह कुछ अलग है, लेकिन यह वास्तव में कक्षाओं और वस्तुओं की दुनिया में आपको आसान बनाने का एक अच्छा काम करता है।

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
जोड़ा
मिट्टी के साथ कुछ भी मेरी किताब में एक +1 मिलता है।
जोड़ा लेखक Aardvark, स्रोत

इन विषयों पर मैंने जो सबसे अच्छी पुस्तक पढ़ी है वह ब्रूस एकल द्वारा सी ++ में सोच रही है। आप इसे मुफ्त यहां डाउनलोड कर सकते हैं।

0
जोड़ा
धन्यवाद डाउनलोड पुस्तक कई उदाहरणों के साथ आता है
जोड़ा लेखक timmyg, स्रोत

कक्षाएं समझने के लिए अपेक्षाकृत आसान हैं; ओओपी आपको कई सालों ले सकता है। निजी तौर पर, मैंने पिछले साल तक आईओपी को पूरी तरह से समझ नहीं लिया था। यह बहुत बुरा है कि छोटे-छोटे कॉलेजों में उतना व्यापक नहीं है जितना होना चाहिए। यह वास्तव में घर को इस बिंदु पर चलाता है कि ओओपी वस्तुओं के व्यापार संदेशों के बारे में है, बजाय वर्गों के कार्यों के साथ आत्मनिर्भर वैश्विक चर है।

यदि आप वास्तव में कक्षाओं के लिए नए हैं, तो अवधारणा को समझने में कुछ समय लग सकता है। जब मैंने पहली बार 10 वीं कक्षा में उनका सामना किया, तो मुझे तब तक यह नहीं मिला जब तक कि मेरे पास कोई ऐसा व्यक्ति न हो जो जानता था कि वे कोड के माध्यम से क्या कर रहे थे और बता रहे थे कि क्या हो रहा था। यही सुझाव है कि आप सुझाव देते हैं कि आप कोशिश करें।

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.

जब आप 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
जोड़ा

प्वाइंटर्स और कक्षाएं सी ++ में वास्तव में उन्नत विषय नहीं हैं। वे बहुत मौलिक हैं।

मेरे लिए, जब मैंने तीरों के साथ बक्से खींचना शुरू किया तो पॉइंटर्स ठोस हो गए। एक int के लिए एक बॉक्स ड्रा। और int * अब एक अलग बॉक्स है जो int बॉक्स को इंगित करने वाले तीर के साथ है।

इसलिए:

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, स्रोत
मैं इसके समर्थन में हूं। शुरुआती लोगों के लिए, हमेशा एक कार चलाने की तरह, 'पॉइंटर' को 'पता' और 'dereference' से 'ट्रैवल-टू-द-एड्रेस' में अनुवाद करें। पॉइंटर्स-टू-पॉइंटर्स पीओ-बक्से अग्रेषित कर रहे हैं - पते, कि जब आप वहां जाते हैं, तो आपको स्टोरेज स्थान के बजाय एक और पता मिलता है।
जोड़ा लेखक Aaron, स्रोत
यह अच्छी तरह से हो सकता है कि उस कोड का अधिकतर बहुत अच्छी तरह लिखा नहीं गया है। मैंने एक बार काम करने की कोशिश करने में काफी समय बिताया कि कुछ पॉइंटर-भारी कोड कैसे काम करते हैं। मैंने छोड़ दिया और एक वरिष्ठ से पूछा। उसने इसे 2 सेकंड तक देखा और कहा "हू। यह एक दुर्घटना का कारण बन जाएगा। बेहतर इसे ठीक करें।" अनुभव: एक नमूना देखने की क्षमता, इसे कुछ विचित्र करें, और सोचें कि "मेरे साथ कुछ गड़बड़ है" के बजाय "इसमें कुछ गड़बड़ है"।
जोड़ा लेखक deworde, स्रोत

सी/सी ++ में पॉइंटर्स को समझना

इससे पहले कि कोई समझ सके कि पॉइंटर्स कैसे काम करते हैं, यह समझना आवश्यक है कि प्रोग्राम में चर कैसे संग्रहीत किए जाते हैं और एक्सेस किए जाते हैं। प्रत्येक चर के पास 2 भाग होते हैं - (1) स्मृति पता जहां डेटा संग्रहीत किया जाता है और (2) संग्रहीत डेटा का मान।

मेमोरी एड्रेस को अक्सर एक चर के लाभा के रूप में जाना जाता है, और संग्रहीत डेटा के मूल्य को रावल्यू (एल और आर अर्थ बाएं और दाएं) के रूप में जाना जाता है।

बयान पर विचार करें:

int x = 10;

आंतरिक रूप से, प्रोग्राम चर एक्स के साथ एक स्मृति पता जोड़ता है। इस मामले में, मान लीजिए कि कार्यक्रम x को पते 1001 (यथार्थवादी पता नहीं, बल्कि सादगी के लिए चुना गया) पर रहने के लिए निर्दिष्ट करता है। इसलिए, x का lvalue (स्मृति पता) 1001 है, और 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.

एक सूचक केवल एक चर है जिसे किसी अन्य चर को संशोधित करने के लिए उपयोग किया जा सकता है। यह इसके रावल्यू के लिए स्मृति पता रखते हुए करता है। यही है, यह स्मृति में एक और स्थान को इंगित करता है।

"X" को पॉइंटर बनाना निम्नानुसार किया जाता है:

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;

इंडिकेटर ऑपरेटर प्रोग्राम को डेटा मान के बजाए स्मृति पते के रूप में xptr के रैवल्यू की व्याख्या करने के लिए कहता है। यही है, कार्यक्रम xptr (1001) द्वारा दिए गए पते पर संग्रहीत डेटा मान (10) की तलाश करता है।

यह सब एक साथ डालें:

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, स्रोत
लालच और राजस्व को स्मृति पते के साथ कुछ भी नहीं मिला।
जोड़ा लेखक 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...

जाहिर है इसकी एक 'सी' किताब है, लेकिन मूलभूत सिद्धांतों के लिए इसे हरा करना मुश्किल है

0
जोड़ा

इन अवधारणाओं को समझने में वास्तव में मेरी मदद करने वाली चीजों में से एक यूएमएल - एकीकृत मॉडलिंग भाषा सीखना है। एक ग्राफिकल प्रारूप में ऑब्जेक्ट उन्मुख डिजाइन की अवधारणाओं को देखकर वास्तव में मुझे यह जानने में मदद मिली कि उनका क्या मतलब है। कभी-कभी इन अवधारणाओं को समझने की कोशिश कर रहे हैं कि स्रोत कोड लागू करने के लिए उन्हें समझना मुश्किल हो सकता है।

ग्राफिकल रूप में विरासत की तरह वस्तु-उन्मुख प्रतिमानों को देखना अवधारणा को समझने का एक बहुत ही शक्तिशाली तरीका है।

मार्टिन फाउलर का यूएमएल डिस्टिल्ड एक अच्छा, संक्षिप्त परिचय है।

0
जोड़ा

अभ्यास के लिए कोई विकल्प नहीं है।

किसी पुस्तक के माध्यम से पढ़ना या व्याख्यान सुनना आसान है और ऐसा लगता है कि आप क्या कर रहे हैं इसका पालन कर रहे हैं।

मैं जो अनुशंसा करता हूं वह कुछ कोड उदाहरण ले रहा है (मुझे लगता है कि आप उन्हें कहीं डिस्क पर रखते हैं), उन्हें संकलित करें और उन्हें चलाएं, फिर उन्हें कुछ अलग करने के लिए बदलने का प्रयास करें।

  • पदानुक्रम में एक और सबक्लास जोड़ें
  • मौजूदा वर्ग में एक विधि जोड़ें
  • एक एल्गोरिदम बदलें जो पुनरावृत्त करता है जाने के लिए एक संग्रह के माध्यम से आगे बढ़ें इसके बजाय पिछड़ा।

मुझे नहीं लगता कि कोई "रजत बुलेट" किताब है जो इसे करने जा रही है।

मेरे लिए, घर पर क्या चल रहा था, जो संकेतक असेंबली में काम कर रहा था, और यह देखकर कि एक सूचक वास्तव में सिर्फ एक पता था, और एक सूचक होने का मतलब यह नहीं था कि यह एक सार्थक वस्तु थी।

0
जोड़ा

पॉइंटर्स और कक्षाओं के लिए, यहां मेरा सादृश्य है। मैं कार्ड के डेक का उपयोग करूंगा। कार्ड के डेक में चेहरे का मूल्य होता है और एक प्रकार (9 दिल, 4 हुकुम के इत्यादि)। तो हमारे सी ++ में "कार्ड के डेक" की प्रोग्रामिंग भाषा की तरह हम निम्नलिखित कहेंगे:

HeartCard card = 4;//4 of hearts!

अब, आप जानते हैं कि दिल का 4 कहां है क्योंकि मूर्खता से, आप डेक पकड़ रहे हैं, अपने हाथ में सामना कर रहे हैं, और यह शीर्ष पर है! तो बाकी कार्डों के संबंध में, हम केवल यह कहेंगे कि 4 दिल दिल में हैं। इसलिए, अगर मैंने आपको पूछा कि कौन सा कार्ड शुरू हो रहा है, तो आप कहेंगे, "निश्चित रूप से दिल के 4!"। खैर, आपने मुझे "इंगित किया" जहां कार्ड है। हमारे "डेक ऑफ कार्ड्स" प्रोग्रामिंग भाषा में, आप बस निम्न कह सकते हैं:

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

अब, कार्ड के अपने डेक को चालू करें। पिछली तरफ अब शुरू हो रहा है और आप नहीं जानते कि कार्ड क्या है। लेकिन, मान लें कि आप इसे जो कुछ भी चाहते हैं उसे बना सकते हैं क्योंकि आप जादू से भरे हुए हैं। आइए हम अपने "डेक ऑफ कार्ड्स" लैंगेज में ऐसा करते हैं!

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

खैर, मेकमीकार्ड ("दिल में से 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!

कक्षाओं के लिए, हम हार्टकार्ड के रूप में एक प्रकार को परिभाषित करके उदाहरण में कक्षाओं का उपयोग कर रहे हैं। हम जानते हैं कि हार्टकार्ड क्या है ... यह एक मूल्य और दिल के प्रकार वाला कार्ड है! इसलिए, हमने इसे हार्टकार्ड के रूप में वर्गीकृत किया है। प्रत्येक भाषा में आप जो चाहते हैं उसे परिभाषित करने या "वर्गीकृत" करने का एक समान तरीका है, लेकिन वे सभी एक ही अवधारणा साझा करते हैं! उम्मीद है कि यह मदद की ...

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 के स्मृति स्थान को पकड़ सकता है। यह इत्ना आसान है। इसके अलावा, हमेशा पॉइंटर अंकगणित के बारे में डरो मत जब आप पॉइंटर्स से बात कर रहे हों और शब्दों में सोचें तो "मेमोरी मैप" को ध्यान में रखें स्मृति पते के माध्यम से चलने के लिए।

सी ++ में कक्षाएं सार डेटा प्रकारों को परिभाषित करने का एक ही तरीका हैं। मैं अवधारणा को समझने के लिए एक अच्छी ओओपी पुस्तक पढ़ने का सुझाव दूंगा, फिर, यदि आप रुचि रखते हैं, तो सीखें कि सी ++ कंपाइलर्स ओओपी अनुकरण करने के लिए कोड कैसे उत्पन्न करते हैं। लेकिन यह ज्ञान समय पर आ जाएगा, अगर आप लंबे समय तक सी ++ के साथ चिपके रहते हैं :)

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
जोड़ा