क्या युवा दिमाग को सूचक अवधारणाओं को सीखने की आवश्यकता है?


89

सी मास्टर डेनिस रिची ने सी में पॉइंटर्स क्यों पेश किए? और अन्य प्रोग्रामिंग भाषाओं जैसे VB.NET या Java या C # को क्यों खत्म किया? मुझे Google में कुछ बिंदु मिले हैं, और मैं आपकी टिप्पणियों को भी सुनना चाहता हूं। वे आधुनिक भाषाओं में सूचक अवधारणाओं को समाप्त क्यों कर रहे हैं?

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

क्या आपको लगता है कि नए प्रोग्रामर्स के लिए पॉइंटर्स का ज्ञान अभी भी महत्वपूर्ण है? लोग इन दिनों VB.NET या Java का उपयोग कर रहे हैं, जो C की तुलना में अधिक उन्नत सुविधाओं का समर्थन करता है (और किसी भी पॉइंटर कांसेप्ट का उपयोग नहीं करता है) और बहुत से लोग जैसा कि अब मैं (मेरे दोस्त) इन भाषाओं का चयन करते हैं अनदेखी करते हैं क्योंकि वे उन्नत सुविधाओं का समर्थन करते हैं। मैं उन्हें सी के साथ शुरू करने के लिए कहता हूं। वे कहते हैं कि जब आप VB.NET या Java में उन्नत चीजें कर रहे हैं तो पॉइंटर्स की अवधारणाओं को सीखना बेकार है जो सी में संभव नहीं हैं।

तुम क्या सोचते हो?

अपडेट किया गया :

Google पर मैंने जो टिप्पणियाँ पढ़ी हैं, वे हैं:

  1. पहले के कंप्यूटर बहुत धीमे थे और अनुकूलित नहीं थे।

  2. पॉइंटर्स का उपयोग करने से किसी एड्रेस को सीधे एक्सेस करना संभव हो जाता है और इससे फंक्शन कॉल्स में उसकी कॉपी बनाने के बजाय समय की बचत होती है।

  3. पॉइंटर्स का उपयोग करके सुरक्षा काफी बदतर है, और यही कारण है कि जावा और सी # ने उन्हें शामिल नहीं किया।

ये और कुछ और जो मैंने पाया। मुझे अभी भी कुछ मूल्यवान जवाब चाहिए। यह बहुत सराहना की जाएगी।


52
जावा में संकेत नहीं हैं? यह सच नहीं है। जावा में प्रत्येक वस्तु संदर्भ, मूल रूप से, एक सूचक है।
क्वांट_देव

20
क्वांट_देव का अर्थ है कि जावा उन बिंदुओं से भरा है जो पारदर्शी रूप से उपयोग किए जाते हैं, जबकि प्रोग्रामर उन्हें स्पष्ट रूप से उपयोग नहीं कर सकते हैं।
साकिस


11
"सी मास्टर डेनिस रिची ने सी में संकेत क्यों पेश किए?" पॉइंटर्स को c में पेश नहीं किया गया था, वे सीधे असेंबली प्रैक्टिस से आए थे, इसमें नाम भी शामिल था।
dmckee

14
@quaint_dev: खैर, जावा में वास्तव में संकेत नहीं हैं। संदर्भ वह सब कुछ नहीं कर सकते हैं जो पॉइंटर्स कर सकते हैं, इसलिए पॉइंटर्स को संदर्भों के संदर्भ में समझने का प्रयास करने का तरीका नहीं है (और सी या सी ++ बनाने वाले बहुत से प्रोग्रामर सीखने में गलती करते हैं)। संकेत अंकगणित कर सकते हैं। सन्दर्भ नहीं दे सकते। (एक सीमा जो वास्तव में हर बार बदबू आती है मैं जावा का उपयोग करने के लिए मजबूर हूं)
बिली ओपल

जवाबों:


128

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

यह कहना कि "VB.Net या जावा में की गई उन्नत चीजें C में संभव नहीं हैं", देखने का एक बहुत ही सीमित बिंदु दिखाता है, जिसे स्पष्ट कहा जाता है :-)

सबसे पहले, इन सभी भाषाओं (यहां तक ​​कि विधानसभा) पूरी तरह से ट्यूरिंग हैं इसलिए सिद्धांत रूप में जो कुछ भी एक भाषा में संभव है, सभी में संभव है। ज़रा सोचिए कि क्या होता है जब VB.Net या जावा कोड का एक टुकड़ा संकलित और निष्पादित किया जाता है: आखिरकार, इसका अनुवाद (या मैप किया गया) मशीन कोड में किया जाता है, क्योंकि यही एकमात्र चीज़ है जिसे मशीन समझती है। सी और सी ++ जैसी संकलित भाषाओं में, आप वास्तव में मूल उच्च स्तर के स्रोत कोड के बराबर मशीन कोड का पूरा शरीर प्राप्त कर सकते हैं, एक या अधिक निष्पादन योग्य फ़ाइलों / पुस्तकालयों के रूप में। वीएम आधारित भाषाओं में, आपके प्रोग्राम के पूरे समकक्ष मशीन कोड प्रतिनिधित्व को प्राप्त करना अधिक कठिन (और संभव भी नहीं हो सकता है), लेकिन फिर भी अंततः रनटाइम सिस्टम और जेआईटी की गहरी भर्ती के भीतर कहीं न कहीं है।

अब, निश्चित रूप से, यह एक पूरी तरह से अलग सवाल है कि क्या किसी विशिष्ट भाषा में कुछ समाधान संभव है। कोई भी समझदार डेवलपर असेंबली में एक वेब ऐप लिखना शुरू नहीं करेगा :-) लेकिन यह ध्यान रखना उपयोगी है कि अधिकांश या उच्च स्तर की सभी भाषाएँ रनटाइम और क्लास लाइब्रेरी कोड की एक बड़ी मात्रा के ऊपर बनाई गई हैं, एक बड़ा हिस्सा जिसे निचले स्तर की भाषा में लागू किया जाता है, आमतौर पर सी में।

तो सवाल करने के लिए,

क्या आपको लगता है कि युवा लोगों के लिए संकेत पर ज्ञान [...] महत्वपूर्ण है?

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

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

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


5
यह एक अच्छा जवाब है, लेकिन यह वास्तव में इस सवाल का जवाब नहीं देता है: "क्या युवा दिमाग को सूचक अवधारणाओं को सीखने की आवश्यकता है?"
फाल्कन

11
+1 अच्छा जवाब। मैं ट्यूरिंग पूर्णता तर्क को छोड़ दूंगा - हालांकि व्यावहारिक प्रोग्रामिंग के लिए, यह एक लाल हेरिंग है, जैसा कि आप बाद में भी ध्यान दें। यह कम्प्यूटेबिलिटी थ्योरी है, यानी ट्यूरिंग कम्प्लीट का मतलब केवल यह है कि संभावित प्रोग्राम्स में (कई भाषाओं के लिए, अनंत) स्पेस में एक प्रोग्राम है, जो एक ही एल्गोरिदम को लागू करता है, न कि यह वास्तव में संभव है या मानवीय रूप से भी संभव है। बस यह इंगित करते हुए कि यह अंत में सभी मशीन कोड है, बस बिना किसी रूकावट के बिंदु को साबित करता है "मैं एक ही भाषा में सब कुछ कर सकता हूं क्योंकि वे सभी समान हैं, हरहर!" बीज।

5
+1 के लिए "और एक शिल्पकार जो यह नहीं समझता है कि उसके उपकरण कैसे काम करते हैं, वह बहुत ही सीमित है।"
जल्दी से जल्दी

6
इसके अलावा, बिंदुओं के यांत्रिकी (और विस्तार संदर्भ द्वारा) को समझने का अर्थ नहीं है कि आप उथले / गहरी डेटास्ट्रक्चर कॉपी की अवधारणाओं को नहीं समझते हैं, जो गंभीर हार्ड-टू-ट्रैक बग का कारण बन सकता है। यहां तक ​​कि "आधुनिक" उच्च-स्तरीय भाषाओं में भी।
माव्रिक

1
C को यूनिक्स के लिए पोर्टेबल असेंबलर यानी धातु के करीब बनाया गया था ।

39

मुझे लगता है कि आपको अलग होने की जरूरत है।

जावा और अन्य उच्च स्तरीय भाषाओं ने संकेत नहीं निकाले। उन्होंने जो किया वह सादा सूचक अंकगणित को हटाने के लिए था।

वास्तव में, जावा अभी भी एक संरक्षित और प्रतिबंधित सूचक अंकगणित: सरणी पहुंच की अनुमति देता है । सादे पुराने सी में, सरणी का उपयोग कुछ और नहीं है, बल्कि डेरेफ़रिंग है। यह एक अलग संकेतन है, एक सिंटैक्टिक शुगर, यदि आप स्पष्ट रूप से संवाद करने के लिए, आप क्या कर रहे हैं।
फिर भी, array[index]के बराबर है *(array+index)। इसके कारण यह भी बराबर है, index[array]हालांकि मुझे लगता है कि कुछ सी संकलक आपको चेतावनी दे सकते हैं, यदि आप ऐसा करते हैं।
एक कोरोलरी के रूप में, pointer[0]के बराबर है *pointer। ऐसा केवल इसलिए है क्योंकि "व्यूअर टू एरे" एरे की पहली प्रविष्टि का पता है और बाद के तत्वों के पते सूचकांक को जोड़कर गणना की जाती है।

जावा में, सादे पॉइंटर अंकगणित (संदर्भ और डीफ़रिंग) अब मौजूद नहीं हैं। हालाँकि संकेत मौजूद हैं। वे उन्हें संदर्भ कहते हैं, लेकिन यह नहीं बदलता है कि यह क्या है। और सरणी पहुंच अभी भी बिल्कुल वैसी ही है: पते को देखें, सूचकांक जोड़ें और उस मेमोरी स्थान का उपयोग करें। हालाँकि, जावा में, यह जाँच करेगा कि सूचकांक उस सरणी की सीमा के भीतर है या नहीं, जिसे आपने मूल रूप से आवंटित किया था। यदि नहीं, तो यह एक अपवाद फेंक देगा।

अब जावा एप्रोच का फायदा यह है कि आपके पास कोड नहीं है, कि बस आँख बंद करके मनमाने ढंग से मेमोरी लोकेशन में मनमाने ढंग से बाइट लिखते हैं। यह सुरक्षा और सुरक्षा में भी सुधार करता है, क्योंकि यदि आप बफर ओवरफ्लो और इस तरह की जांच करने में विफल रहते हैं, तो रनटाइम आपके लिए यह करेगा।

इसका नुकसान यह है, कि यह कम शक्तिशाली है। सी में मेमोरी सुरक्षित प्रोग्रामिंग करना संभव है। गति और जावा में असुरक्षित प्रोग्रामिंग की संभावनाओं से लाभ उठाना असंभव है।

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

IMHO, हमारी नौकरी में हर कोई यह समझने में सक्षम होना चाहिए, या वे केवल गलत क्षेत्र में हैं।


13
+1 Java और C # में अभी भी पॉइंटर्स हैं, और निश्चित रूप से NullPointerException
jk।

5
यह भी ध्यान दें कि संदर्भ समय के साथ अलग-अलग क्षेत्रों को इंगित कर सकते हैं, क्योंकि कचरा कलेक्टर चारों ओर सामान ले जाता है। संकेत आमतौर पर स्थिर होते हैं।

3
+1: यह! और मुझे लगता है कि सूचक (सामान्य रूप से) के बारे में समझ के लिए दो कठिन चीजें हैं: अप्रत्यक्ष (जो सी, सी #, जावा, ...) और सूचक अंकगणित (जो जावा में उसी तरह नहीं होता है) में होता है। मेरी राय में दोनों सीखने के लिए महत्वपूर्ण अवधारणाएं हैं और दोनों शुरुआती के लिए प्रमुख ठोकर हैं। लेकिन उन्हें भ्रमित नहीं होना चाहिए: सूचक अंकगणित के बिना अप्रत्यक्ष हो सकता है ।
जोकिम सॉर

2
वास्तव में, back2dosपहली बार सही था, क्योंकि (array + index)पहले से ही वस्तुओं के आकार (सी में) का ध्यान रखता है।
मैथ्यू फ़्लेशेन

4
@ CyberSkull, जवाब सिंटैक्टिक के बराबर दे रहा था array[index], और वह है *(array+index)। यदि आप यह दिखाना चाहते हैं कि कंपाइलर आंतरिक रूप से कैसे काम करता है, तो आप स्पष्ट रूप से बाइट्स के बारे में बात कर सकते हैं या असेंबली दे सकते हैं।
मैथ्यू फ्लेशेन

24

ज्ञान की सामान्य कंप्यूटर प्रोग्रामिंग बॉडी में पॉइंटर्स की अवधारणा महत्वपूर्ण है। अवधारणा को समझना किसी भी भाषा के प्रोग्रामर या प्रोग्रामर के लिए अच्छा है, भले ही भाषा सीधे समर्थन न करे।

पॉइंटर्स का उपयोग डेटा स्ट्रक्चर्स (लिंक्ड लिस्ट) और डेटाबेस डिजाइन (फॉरेन की) में होता है।

VB और C # जैसी भाषाएं "रेफरेंस" के तरीकों से डेटा पास कर सकती हैं, जिन्हें एक प्रकार का पॉइंटर माना जा सकता है।

यह समझना कि डेटा कहां मेमोरी (ढेर बनाम ढेर) में आवंटित किया गया है, एल्गोरिदम की दक्षता के लिए अभी भी महत्वपूर्ण है।

मूल बातें सही सीखना मेरी राय में महत्वपूर्ण है।


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

2
आप एक तरह से सही हैं, लेकिन जब आप विधियों में डेटा पास करते हैं, तो संभावना यह है कि कुछ मामलों में आप एक पॉइंटर को वेरिएबल में भेज रहे हैं। हालांकि, एक पॉइंटर की अवधारणा उपयोगी है (मेरी राय में) एक सॉफ्टवेयर भाषा में इसके कार्यान्वयन के बावजूद।
NoChance

1
@SirTapTap: ऐसा इसलिए है क्योंकि अगर आपने किसी तरह से C ++ सीखी है, तो वे आपको C ++ सिखाते हैं। C ++ का उपयोग करने का सबसे अच्छा तरीका नहीं है। पॉइंटर अंकगणित को आमतौर पर चमक दिया जाता है क्योंकि यह कुछ ऐसा है जिसे आप C ++ के साथ पास कर सकते हैं और नहीं जानते हैं। लेकिन यहां तक ​​कि सामान्य संग्रह पर पुनरावृति जैसी चीजें वास्तविक / मुहावरेदार सी ++ में संकेत के साथ की जाती हैं। (जैसा कि यह मानक टेम्पलेट लाइब्रेरी कैसे काम करती है, इसकी नींव है)
बिली ओपल

@ बिलियन पॉइंटर्स लगभग आधे थे, वास्तव में, मुझे अभी भी एक प्रोग्रामर के रूप में (स्मार्ट) पॉइंटर्स के लिए एक व्यावहारिक उपयोग कभी नहीं मिला, मुझे लगता है कि मुझे कभी भी किसी भी चीज़ में स्मृति पर नियंत्रण के प्रत्यक्ष निर्देश की आवश्यकता नहीं है। बेशक वहाँ हमेशा संभावना है कि पाठ्यक्रम खराब सिखाया गया था, यह वास्तव में मेरा पसंदीदा नहीं था।
बेन ब्रोका

1
@SirTapTap: व्यावहारिक उपयोग: एसटीएल में हर संग्रह और एल्गोरिथ्म। std::sort, std::partition, std::find, आदि वे संकेत के साथ काम है, और वे वस्तुओं ऐसा संकेत (iterators) में कार्य के साथ काम करते हैं। और वे किसी भी सामान्य संग्रह पर काम करते हैं; लिंक की गई सूचियाँ, डायनेमिक सरणियाँ, dequeएस, पेड़, या किसी अन्य प्रकार के उपयोगकर्ता परिभाषित संग्रह। आप संकेत के बिना एक अमूर्त की तरह नहीं कर सकते।
बिली ओनेल

19

हाँ, हाँ, हाँ, हाँ और हाँ !!!

यदि आप मूल बातें नहीं जानते हैं तो आप वास्तव में कठिन, अजीब, कठिन और जटिल समस्याओं को हल करने में सक्षम होंगे जो आपके रास्ते में आते हैं।

और यदि आप मूल रूप से अच्छी तरह से समझते हैं, तो आप नौकरी के बाजार में अधिक उपयोगी हैं।


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

जितना संभव हो उतना जानें।


लेकिन वाह क्या मूल बातें हैं? असेंबली, बाइनरी कोड?
साइबेरियाईगू

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

4
@ भारत: नहीं, और भी अधिक बुनियादी, कई प्रोग्रामर के आजकल यह भी नहीं पता है कि गो 'ओले' चिप्स में ट्रांजिस्टर और लॉजिक गेट कैसे काम करते हैं, और उन्हें निश्चित रूप से पता होना चाहिए कि इलेक्ट्रॉनों के बारे में कैसे चलता है और लघुकरण पर क्वांटम प्रभाव पड़ता है; मैंने क्वैक, लिपटन और बाइसन पर भी शुरुआत नहीं की है! और हिचकी बाइसन कणों!
रेयान

2
मूल बातें .... चीजें कैसे संग्रहीत की जाती हैं जैसी चीजें। एक बाइट, एक शब्द, कैसे हस्ताक्षरित और अहस्ताक्षरित कार्य के बीच का अंतर। पॉइंटर्स कैसे काम करते हैं। एक चरित्र क्या है। एएससीआईआई (और इन दिनों, यूनिकोड) में चीजों को कैसे कोडित किया जाता है। केवल साधारण संरचनाओं का उपयोग करके मेमोरी में एक लिंक्ड सूची कैसे बनाई जा सकती है। वास्तव में कैसे काम करते हैं। इन छोटी चीजों से, बड़ी चीजें बढ़ती हैं।
जल्‍दी से जल्‍दी से जल्‍दी

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

18

हां, समझ जरूरी है।

कुछ महीने पहले मैं C # में प्रोग्रामिंग कर रहा था, और मैं एक सूची की एक प्रति बनाना चाहता था। बेशक मैंने जो किया था NewList = OldList;और फिर संशोधित करना शुरू कर दिया NewList। जब मैंने दोनों सूचियों को प्रिंट करने की कोशिश की, तो वे दोनों एक ही थे, चूंकि NewListसिर्फ एक संकेतक था OldListऔर एक प्रति नहीं थी, इसलिए मैं वास्तव में OldListसभी को बदल रहा था । मुझे यह पता लगाने में बहुत समय नहीं लगा कि एक बाहर है, लेकिन मेरे कुछ सहपाठी उस त्वरित नहीं थे और यह समझाया जाना चाहिए कि ऐसा क्यों हो रहा है।

उदाहरण:

List<int> a = new List<int>();
a.Add(2);
a.Add(9);
a.Add(8);
a.Add(1);
List<int> b = new List<int>();
b = a; //Does not make a copy, b is just a synonym!
b.Sort();
for (int i = 0; i < a.Count; i++)
{
    Console.WriteLine("a: " + a[i] + " b: " + b[i]);
}

और निश्चित रूप से, परिणाम इस तरह है:

a: 1 b: 1
a: 2 b: 2
a: 8 b: 8
a: 9 b: 9

यह जानना कि उनका उपयोग कैसे करना है, यह महत्वपूर्ण नहीं है, फिर भी उन्हें समझना महत्वपूर्ण है!


2
इसके बजाय उनका उपयोग क्यों करें और उनका उपयोग कब करें सबसे महत्वपूर्ण है :)
niko

5
" NewListबस एक सूचक था OldList" - सटीक होने के लिए, दोनों NewListऔर OldListसिर्फ एक ही Listवस्तु का जिक्र करते हुए संकेत थे ।
Péter Török

यह समझने के लिए भी महत्वपूर्ण है कि आपके द्वारा बनाई गई नई सूची bअब इसके लिए कोई संदर्भ नहीं है, और अब कचरा है।
TMN

14

अवधारणा को इंगित करें! = अंकगणित को इंगित करें! = वाक्यविन्यास को इंगित करें

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


1
आजकल आपको केवल संदर्भ की मूल अवधारणा को जानने की आवश्यकता है, न कि सूचक वाक्यविन्यास / गणित। मैंने दिन में सी बैक में अंकगणित (अंकगणित और वाक्य रचना के साथ) सीखा। अब मैं जिन भाषाओं में प्रोग्राम करता हूं, वे सी-स्टाइल पॉइंटर्स के साथ सौदा नहीं करते हैं जो आपको असुरक्षित चीजें करने देते हैं। एक व्यक्ति समझ सकता है कि अजगर में क्यों a=[1,2]; b=a; a.append(3)दोनों aऔर सामान को जाने बिना bएक ही वस्तु [1,2,3]को संदर्भित कर रहे हैं जैसे कि सी iकिसी सरणी के वें तत्व को संदर्भित किया जा सकता है arr[i]या i[arr]जैसे दोनों हैं *(arr+i)। मैं पसंद करता हूं जब भाषा का उपयोग नहीं i[arr]किया जाता है।
डॉ। जिंबाब

" अन्य दो मामले केवल तभी जब आपकी भाषा डु पत्रिकाएं आपको उनका उपयोग करने की अनुमति देती हैं। " - यह वाक्य अपने स्वयं के विनाशकारी को चारों ओर ले जा रहा है। भाषा की दो पत्रिकाओं की परिभाषा है कि कल जिस भाषा का इस्तेमाल किया जाता है, वही भाषा होने की संभावना नहीं है। और कल आपको सूचक-सक्षम भाषा के साथ सामना किया जा सकता है। जमीनी स्तर? बेहतर यह है कि यह अब, एक बार और हमेशा के लिए पकड़ लेता है। यह इतना कठिन नहीं है, लेकिन यह इसके लायक है।
जेन्सजी

14

सी मास्टर डेनिस रिची ने सी में पॉइंटर्स क्यों पेश किए?

क्योंकि पॉइंटर्स एक बहुत शक्तिशाली तंत्र है जिसका उपयोग कई तरीकों से किया जा सकता है।

और क्यों अन्य प्रोग्रामिंग भाषाओं जैसे VB.NET या Java या C # को खत्म किया?

क्योंकि पॉइंटर्स एक बहुत ही खतरनाक तंत्र है जिसका कई तरीकों से दुरुपयोग किया जा सकता है।

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

यहाँ एक अधूरी सूची दी गई है कि किस बिंदु का उपयोग किया जाता है:

  • गतिशील आवंटन ( new T)
  • पुनरावर्ती डेटा संरचनाएं ( struct T { T* next; /* ... */ };)
  • सरणियों पर चलने वाले ( for (T* p = &a[0]; p != &a[0] + n; ++p) { ... })
  • वस्तुओं तक साझा पहुंच ( T* new_pointer = existing_pointer;)
  • उपप्रकार बहुरूपता ( T* pointer_to_base = pointer_to_derived;)
  • संदर्भ द्वारा विरासत कॉल ( mutate(&object);)
  • वैकल्पिक प्रकार ( if (p) { /* ... */ })

ध्यान दें कि इन सभी अवधारणाओं के लिए एक एकल तंत्र का उपयोग करना अनुभवी प्रोग्रामर के लिए शक्ति और लालित्य दोनों को प्रदर्शित करता है और किसी नए प्रोग्रामिंग के लिए महान भ्रम की क्षमता।


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

12

क्यों? आप फॉर्म डिजाइनर और कोड जनरेटर के साथ एक विशाल प्रणाली लिख सकते हैं। क्या यह पर्याप्त नहीं है? (विडंबना)

और अब गंभीरता से, पॉइंटर्स कई क्षेत्रों में प्रोग्रामिंग का महत्वपूर्ण हिस्सा नहीं हैं, लेकिन वे लोगों को यह समझने की अनुमति देते हैं कि इंटर्न कैसे काम करते हैं। और अगर हमारे पास कोई नहीं होगा जो समझता है कि इंटर्न कैसे काम करते हैं, तो ऐसी स्थिति होगी जहां SQL2020, विंडोज 15 और लिनक्स 20.04 कचरा एकत्र करने वाली वर्चुअल मशीन में लिखा जाएगा, जो अमूर्त की 30 परतों में चल रही है, IDE के माध्यम से कोड के साथ, जावास्क्रिप्ट में। ।

यह निश्चित रूप से वह नहीं है जो मैं देखना चाहता हूं।

तो हाँ, वे करने के लिए, निश्चित रूप से है!


2
अच्छा मज़ाक! +1 और पूरी तरह से सहमत हैं।
हेल्टनबीकर

7

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

C ++ और Java में निम्नलिखित पर विचार करें, और मुझे लगता है कि यह C # में बहुत भिन्न नहीं है:
aClass *x = new aClass();
aClass x = new aClass();
बिंदुओं और संदर्भों के बीच वास्तव में बहुत अंतर नहीं है, है ना?
जब तक आवश्यक न हो और जब उच्च स्तर के मॉडल के साथ प्रोग्रामिंग की जाए तो पॉइंटर अंकगणित से बचा जाना चाहिए, इसलिए वहां बहुत समस्या नहीं है।


6

पेशेवर प्रोग्रामर को मास्टर पॉइंटर्स होना चाहिए।

जो लोग प्रोग्रामिंग जानना चाहते हैं, उन्हें इसकी मौजूदगी और निहितार्थ के बारे में सीखना चाहिए, लेकिन जरूरी नहीं कि उनका उपयोग किया जाए।

वे लोग जो प्रोग्रामिंग के माध्यम से व्यक्तिगत समस्याओं को हल करना चाहते हैं (जैसे कि, जो बहुत सारे पायथन लिपियों का उपयोग करते हैं) उन्हें बहुत अच्छी तरह से अनदेखा कर सकते हैं।

खैर, यह मेरी राय है ... ओ)


3

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


3

बिल्कुल हां ! कार्यक्रम को इंगित करने वाले और अप्रत्यक्ष सभी को समझने की आवश्यकता है।

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

यह समझना कि पॉइंटर्स कैसे काम करते हैं, यह समझना बुनियादी है कि कंप्यूटर वास्तव में कैसे काम करते हैं। पॉइंटर्स संदर्भों की तुलना में अधिक लचीले और शक्तिशाली भी हैं।

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

int a, foo[10];
foo[2] = a;

सूचक अंकगणितीय में पंक्ति 2 होगी:

*(foo + sizeof(int) * 2) = a;

पॉइंटर्स को समझने के बिना, कोई मेमोरी मैनेजमेंट, स्टैक, हीप या एरे भी नहीं समझ सकता है! इसके अतिरिक्त, किसी को यह समझने के लिए पॉइंटर्स और डेरेफ्रेंसिंग को समझने की आवश्यकता है कि फ़ंक्शन और ऑब्जेक्ट कैसे पारित किए जाते हैं।

TL: DR : समझने वाले बिंदु वास्तव में काम करने वाले कंप्यूटरों को समझने के लिए मूलभूत हैं


2

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

पॉइंटर्स के साथ मैन्युअल रूप से निपटना त्रुटि-प्रवण हो सकता है (मेमोरी लीक और शोषक कोड के लिए अग्रणी) और सही होने में समय लगता है। तो जावा और C # आदि सभी अब अपनी वर्चुअल मशीन (VMs) के माध्यम से आपके लिए अपनी मेमोरी और आपके संकेत का प्रबंधन करते हैं। कच्चे सी / सी ++ का उपयोग करने की तुलना में यह यकीनन कम कुशल है, हालांकि वीएम लगातार सुधार कर रहे हैं।

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

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


0

यह उद्देश्य सत्य है:

कुछ भाषाएं डायरेक्ट मेमोरी एक्सेस (पॉइंटर्स) का समर्थन करती हैं, कुछ नहीं। प्रत्येक मामले के अच्छे कारण हैं।

  1. जैसा कि किसी ने यहां कहा, सी के दिनों में, स्वत: स्मृति प्रबंधन उतना विस्तृत नहीं था जितना आज है। और लोगों को किसी भी तरह से इस्तेमाल किया गया था। फिर अच्छे प्रोग्रामर को हमारी पीढ़ी (मैं 21 वर्ष) की तुलना में कंप्यूटर प्रोग्राम की बहुत गहरी समझ थी। वे मेनफ्रेम पर कुछ संकलन-समय के लिए पंच-कार्ड और प्रतीक्षा दिनों का उपयोग कर रहे हैं। उन्हें शायद पता था कि उनके कोड में हर बिट क्यों मौजूद है।

  2. C जैसी भाषाओं का स्पष्ट लाभ यह है कि वे आपको अपने कार्यक्रम पर बेहतर नियंत्रण रखने की अनुमति देती हैं। इन दिनों आपको वास्तव में इसकी आवश्यकता कब है ? जब आप इन्फ्रास्ट्रक्चर एप्लिकेशन बना रहे हों, जैसे कि ओएस से संबंधित प्रोग्राम और रनटाइम वातावरण। यदि आप सिर्फ अच्छा, तेज, मजबूत और विश्वसनीय सॉफ्टवेयर विकसित करना चाहते हैं, तो स्वचालित मेमोरी प्रबंधन सबसे अधिक बार आपकी बेहतर पसंद है।

  3. तथ्य यह है कि प्रत्यक्ष मेमोरी एक्सेस का अधिकतर सॉफ्टवेयर विकास इतिहास के दौरान दुरुपयोग किया गया है। लोग ऐसे प्रोग्राम बना रहे थे जो मेमोरी को लीक करते थे, और वास्तव में अनावश्यक मेमोरी एलोकेशन के कारण धीमे थे (सी में यह आसान और सामान्य है कि हर एक आवंटन के लिए प्रक्रिया 'वर्चुअल मेमोरी स्पेस का विस्तार करें)।

  4. इन दिनों, वर्चुअल मशीन / रनटाइम्स मेमोरी को आवंटित करने और जारी करने में 99% प्रोग्रामर की तुलना में बहुत बेहतर काम करते हैं। इसके शीर्ष पर, वे आपको उस प्रवाह में अतिरिक्त लचीलापन प्रदान करने की अनुमति देते हैं जो आप चाहते हैं कि आपका कार्यक्रम हो, क्योंकि आप (अधिकतर) सही समय और स्थान पर आवंटित स्मृति को मुक्त नहीं कर रहे हैं।

  5. ज्ञान के लिए के रूप में। मुझे लगता है कि यह सराहनीय है कि प्रोग्रामर जानते हैं कि वे जिस तरह से प्रोग्राम करते हैं, वे कैसे लागू होते हैं। जरूरी नहीं कि छोटे विवरण, लेकिन बड़ी तस्वीर हो।

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

  1. जिस तरह से मैं इसे देखता हूं, अगर आप सभी से यह करने के लिए कहेंगे कि आप जावा या सी # में एक एप्लिकेशन बनाएं या ऐसा कुछ हो, तो आपको उचित डिजाइन और कार्यान्वयन तकनीकों पर ध्यान केंद्रित करने की आवश्यकता है। परीक्षण योग्य कोड, स्वच्छ कोड, लचीला कोड। उस क्रम में।

क्योंकि भले ही आप सभी छोटे विवरणों को नहीं जानते हों, लेकिन जो कोई करता है वह वही बदल पाएगा जो आपने किसी ऐसी चीज़ में बनाया होगा जो केवल बेहतर प्रदर्शन करती है। और यह अक्सर एक मुश्किल काम नहीं है, एक बार जब आपके पास जगह में एक उचित, साफ और परीक्षण योग्य डिजाइन होता है (और यह आमतौर पर अधिकांश काम होता है)।

अगर मैं एक साक्षात्कारकर्ता था जो किसी को उच्च-स्तरीय भाषा के लिए किसी को नियुक्त करना चाहता था, तो वे चीजें होंगी जिन्हें मैं सबसे अधिक रुचि रखता हूं।

निम्न-स्तरीय ज्ञान एक बोनस है। यह डिबगिंग के लिए अच्छा है और कभी-कभी थोड़ा बेहतर समाधान बनाता है। यह आपको पेशेवर रूप से एक दिलचस्प व्यक्ति बनाता है। यह आपको अपने कार्यस्थल में कुछ सम्मान देता है।

लेकिन आज की दुनिया में, यह कोई पवित्र आवश्यकता नहीं है।


-1

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

वहाँ बहुत अधिक कार्यात्मक और आधुनिक बहु-प्रतिमान दृष्टिकोण हैं, जिन्हें मैं कहने के लिए फैंसी सूचक अंकगणित करने में सक्षम होने की तुलना में बहुत अधिक मूल्य दूंगा, 1000 वें अनुकूलित स्ट्रिंग कॉपी फ़ंक्शन को लिखना संभवत: आपके std lib के String.copy से किसी भी तरह से बदतर प्रदर्शन कर रहा है।

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

जब मैं कैशिंग (ज्ञापन), SQL- अनुकूलन, या सिर्फ वेबसर्वर कॉन्फिग ट्यूनिंग को कम प्रयास के साथ 100% या अधिक प्राप्त कर सकते हैं, तो मैं अक्सर 5% लाभ के लिए माइक्रो-ऑप्टिमाइज़्ड कोड या माइक्रो-ऑप्टिमाइज़ कोड के पूरी तरह से विफल प्रयासों को देखता हूं। अधिकांश मामलों में पॉइंटर्स के साथ फ़िडलिंग समयपूर्व अनुकूलन है।


-1

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

इसके अलावा, अब एक दिन, मोबाइल एप्लिकेशन पर विचार करते हुए, जिनके पास बहुत सीमित मेमोरी है, हमें इसे बहुत सावधानी से उपयोग करने की आवश्यकता है ताकि इसका संचालन उपयोगकर्ता की प्रतिक्रिया के साथ बहुत जल्दी हो ... इसलिए इस उद्देश्य के लिए हमें मूल्य का एक सीधा संदर्भ चाहिए ...

ऐप्पल के उपकरणों, या उद्देश्य सी भाषा पर विचार करें, जो केवल सूचक अवधारणा के साथ पूरी तरह से काम कर रहा है। ऑब्जेक्टिव C में घोषित सभी वैरिएबल पॉइंटर हैं। आपको ऑब्जेक्टिव सी की विकी से गुजरना होगा


कुछ मोबाइल केंद्रों पर C की कल्पना की गई थी, मोबाइल ऐप्स में अधिक मेमोरी उपलब्ध है। कई मोबाइल ऐप जावा, या एकमुश्त HTML + जावास्क्रिप्ट में लिखे गए हैं, जो सभी पॉइंटर्स के बिना हैं (क्या संदर्भ हैं)। बहुत विशिष्ट प्रोग्रामर का केवल एक छोटा सा हिस्सा कभी अंतर्निहित ओएस परतों को देखने के लिए मिलता है।
जुरगेन स्ट्रोबेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.