[Powered by Google Translate] [4 सप्ताह जारी रहेगा]
[डेविड जे Malan हार्वर्ड विश्वविद्यालय]
[यह CS50 है. - CS50.TV]
>> इस CS50 है, और यह 4 सप्ताह के अंत है.
तो कुछ अच्छी खबर है और कुछ बुरी खबर है.
सोमवार पर नहीं व्याख्यान अगले सप्ताह, कोई समस्या नहीं. [छात्रों जयकार]
आप की तरह है, जहां यह जा रहा है नहीं जा रहे हैं.
लेकिन हम इस पर अगले बुधवार के बजाय करते हैं,
और वहाँ भी पाठ्यक्रम 1 शुक्रवार व्याख्यान के अनुसार अगले शुक्रवार इतना है कि हम ट्रैक पर रह सकते हैं.
लेकिन सब कुछ सामान्य रूप से फिल्माया जाएगा, तो चिंता करने की नहीं है.
>> और संबंध के साथ 0 प्रश्नोत्तरी क्या हम सप्ताह के अंत की ओर करूँगा
है पाठ्यक्रम के होमपेज cs50.net एक स्पष्टीकरण पर पोस्ट
उम्मीदों के किस तरह आप जब यह पहली प्रश्नोत्तरी के लिए आता है चाहिए.
सामान्य में, यह एकाधिक विकल्प, सच झूठी, कम जवाब, लघु कोडिंग समस्याओं का होगा.
आप करने के लिए बराबर लागू करने के लिए उम्मीद की जा नहीं जा रहे हैं
एक समस्या यह है कि आप एक pset पर देखना होगा, जिसके लिए आप एक कंप्यूटर है
debugger और पसंद है, लेकिन वहाँ छोटे कोडन समस्या हो जाएगी.
>> और वास्तव में, सबसे अच्छा क्या CS50 quizzes की भावना पाने के गाइड की तरह कर रहे हैं
cs50.net के लिए जाना है, लिंक क्विज़ जाना है,
और आप पिछले कई वर्षों quizzes के लायक देख सकते हैं.
बस एहसास है कि पाठ्यक्रम हमेशा साल से अधिक ही नहीं किया गया है.
कभी कभी हम कभी कभी घटाना, जोड़ने के लिए,
इसलिए यदि आप एक उन पुराने quizzes कुछ विषय देखें
कि तुम्हें पता नहीं है कि यह किस बारे में बात कर रहा है, यह भी है कि हम इसे कवर किया
या कि हम इसे कवर नहीं किया.
लेकिन समीक्षा के रूप, इस रविवार, सोमवार, और मंगलवार
के रूप में अच्छी तरह से एक कोर्स रविवार की रात को व्यापक समीक्षा सत्र के रूप में -
समय और स्थान के लिए पाठ्यक्रम के मुखपृष्ठ पर घोषणा की जानी -
आप सभी एक पाठ्यक्रम शिक्षण साथियों के साथ समीक्षा करने का अवसर है
दोनों अनुभाग में और एक पूर्ण वर्ग के रूप में इस वर्ष के लिए, सामग्री,
और सामान्य रूप से उन के रूप में अच्छी तरह से फिल्माया जाएगा.
>> सही सभी. तो आगे की हलचल के बिना, पारित पर एक टिप्पणी / विफल रहता है और जोड़ें / ड्रॉप.
आप अपने नोट्स कल रात में देखा जा सकता है, और यह वास्तव में सिर्फ कुछ अतिरिक्त आश्वासन
कि अगर आप उन लोगों के बीच विशेष रूप से कम आराम या कहीं बीच में हैं
और आप अपने सिर पर में सिर्फ एक छोटा सा महसूस कर रहे हैं,
एहसास है कि वास्तव में काफी सामान्य है, और वहाँ जगह में एक पर्याप्त समर्थन संरचना है,
जिनमें से एक कार्यालय घंटे अपने ईमेल पिछली रात के प्रति सभी को और अधिक सुधार लाने पर आमादा थे,
और भी एहसास है कि पास की तरह एक विकल्प है / इस तरह एक वर्ग के लिए विफल
वास्तव में एक तंत्र के रूप में इस तरह से एक कोर्स के किनारे दूर ले मतलब है,
इतना है कि फिर अगर आप उन 10, 15, 20 घंटे खर्च कर रहे हैं
सिर्फ कुछ pset पाने के लिए काम करने की कोशिश कर रहा है और आप जानते हैं कि आप जिस तरह के 90-95% कर रहे हैं वहाँ
लेकिन आप कुछ लानत बग नहीं मिल, एक पास में कर सकते हैं / मॉडल है कि तरह की है ठीक विफल.
>> विचार यह है कि उस तंत्र के साथ तुम तो अपने अन्य psets पर ध्यान केंद्रित करने जा सकते हैं
या सोने या जो कुछ भी यह है कि आप पर ध्यान केंद्रित करना चाहते हैं.
तो पता है कि तुम इस आने वाले मंगलवार तक - तकनीकी रूप से 5 सोमवार,
लेकिन यह एक छुट्टी है, तो इस आने वाले मंगलवार - पास से स्विच / वर्गीकृत या ठीक इसके विपरीत विफल करने के लिए.
और अगर आप करारा पर वास्तव में कर रहे हैं और पूरी तरह छोड़ने के बारे में सोच रहे हैं,
व्याख्यान के बाद मुझे पकड़ या मुझे एक चिट्ठी छोड़ कृपया.
हम कम से कम चैट करने के लिए प्यार करता हूँ इससे पहले कि आप अलविदा चाहते हैं.
सही सभी. तो हम पिछली बार से प्रशिक्षण के पहियों लेने शुरू कर दिया.
विशेष रूप से, हम स्ट्रिंग पर ध्यान केंद्रित किया.
स्ट्रिंग कुछ है कि CS50 पुस्तकालय में घोषित है,
विशेष रूप से कि cs50.h नामक एक फाइल में जो हम करने के लिए इस सप्ताह और अगले ढूंढना शुरू कर देंगे.
लेकिन स्ट्रिंग वास्तव में सिर्फ कुछ का सरलीकरण है
कि एक छोटे से अधिक arcanely चार * के रूप में वर्णित है.
CHAR हम से परिचित हैं. यह सिर्फ एक ही चरित्र है.
लेकिन क्या * सोमवार के रूप में निरूपित किया जाता है? >> [छात्र] एक सूचक.
एक संकेतक. और एक सूचक क्या है? >> [छात्र] पता.
>> यह एक पता, स्मृति में एक स्थान की तरह है.
एक पते या स्थान या स्मृति क्या है?
फिर, हम सभी के एक टमटम या राम के 2 गीगाबाइट के साथ लैपटॉप इन दिनों सबसे अधिक संभावना है,
और इसका मतलब है कि आप एक अरब या दो अरब बाइट्स स्मृति के लायक है.
और यह वास्तव में क्या यह शारीरिक रूप से की तरह लग रहा है कोई फर्क नहीं पड़ता है,
लेकिन विश्वास पर रखना है कि आप सभी व्यक्तिगत बाइट्स है कि अपने लैपटॉप की संख्या कर सकते हैं -
यह 0 बाइट है, यह 1 बाइट है, इस बाइट 2 अरब -
और कहा कि वास्तव में एक कंप्यूटर क्या करता है.
जब आप एक ही चरित्र के लिए जगह आवंटित है, उदाहरण के लिए,
यह स्पष्ट रूप से करने के लिए अपने कंप्यूटर की स्मृति में कहीं रहते है,
और शायद यह बाइट 12345 नंबर पर है,
और कहा कि कहीं आपके कंप्यूटर की मेमोरी में यहाँ है.
और फिर उस चरित्र के पते 12345 है.
>> अब, 0 के माध्यम से अब इस प्रकार अब तक सप्ताह में, हम वास्तव में परवाह नहीं है
क्योंकि स्मृति बातों में हम आम तौर पर जहां प्रतीकों का उपयोग संग्रहीत हैं,
चर, और arrays वास्तव में हमारे डेटा को पाने के लिए.
लेकिन सोमवार और सभी को और अधिक आज के रूप में, अब आप के पास जा रहे हैं
लेखन कार्यक्रमों के साथ सभी को और अधिक अर्थपूर्ण क्षमताओं
वास्तव में एक कंप्यूटर की स्मृति में हेरफेर लेकिन आप देखते हैं फिट,
दोनों अच्छे उद्देश्यों और बुरे के लिए,
कीड़े इस सामान सीखने में इस बिंदु पर एक बहुत ही आम परिणाम जा रहा है.
लेकिन यह वास्तव में क्या करने के लिए एक चार * क्या मतलब है?
चलो आगे वापस करने के लिए जाने - और हम Binky करने के लिए वापस आने के रूप में आज का वादा किया.
चलो एक सरल उदाहरण के लिए चलते हैं.
मुझे compare.c के रूप में इस फाइल को बचाने के लिए, और मुझे बस कुछ टेम्पलेट कोड यहाँ मिल
इतना stdio.h में शामिल हैं, मुझे भी अपने आप को देने में शामिल cs50.h. मैं वहाँ में ज़ूम करेंगे.
मुझे मुख्य int मुख्य (शून्य) लेखन शुरू करते हैं, और अब मैं इस तरह से कुछ करना चाहते हैं:
printf ("मुझे एक स्ट्रिंग दे:") और फिर मैं प्रयोग करेंगे स्ट्रिंग है GetString हो जाता है
उपयोगकर्ता से एक स्ट्रिंग मिलता है, तो मैं एक दूसरे के लिए उपयोगकर्ता पूछने के लिए जा रहा हूँ.
("मुझे एक स्ट्रिंग दे:") और मैं उन्हें है कि मिल GetString के माध्यम से पूछने के लिए जा रहा हूँ.
मैं इसे कहते हैं, क्योंकि टी के बाद आता है और एक स्ट्रिंग के लिए एक अच्छा नाम है अगर यह बहुत सामान्य है.
तो GetString, और अब मैं सिर्फ एक मानसिक स्वास्थ्य की जांच करना चाहते हैं और मैं कहने जा रहा हूँ
अगर (एस टी ==) तो मैं सिर्फ उपयोगकर्ता बता printf ("आप एक ही बात पर \ n टाइप") जा रहा हूँ;
और मैं बाहर की तरह ("आप टाइप कुछ अलग \ n") कुछ प्रिंट लिए जा रहा हूँ
या जो भी सजा हो जाएगा. तो ऐसा कुछ.
फिर हमेशा की तरह, मैं 0 जो सिर्फ signified कुछ भी नहीं बुरा हुआ कि वापस कर देंगे,
और मुझे आगे जाना है और संकलन और इस कार्यक्रम को चलाने के लिए जा रहा हूँ.
>> लेकिन सोमवार को हम इस कार्यक्रम भागा,
और वास्तव में बताया गया है कि हैलो हैलो नहीं है और अलविदा अलविदा नहीं है.
व्यवहार हमने देखा कि एक छोटे से इस तरह से अधिक था.
चलो मुझे अपने स्रोत निर्देशिका में जाना है, यहाँ में ज़ूम, और चलो बनाने की तुलना करते हैं.
ठीक संकलित. मुझे चलाने की तुलना करें. मुझे एक स्ट्रिंग दे: नमस्कार.
मुझे एक स्ट्रिंग दे: नमस्कार.
आप कुछ अलग टाइप!
खैर, मुझे 50 50, की तरह सरल कुछ करने की कोशिश. आप कुछ अलग टाइप!
हाय, हाय. तो जाहिर है, कुछ और यहाँ पर जा रहा है.
लेकिन क्या क्यों के लिए विवरण था?
जाहिर है, 12 लाइन पूरी तरह से बेकार है.
मौलिक यहाँ समस्या क्या है? हाँ. >> [छात्र] यह पते की तुलना है.
हाँ, बिल्कुल. यह वास्तव में पते की तुलना है
जिसमें HELLO और HELLO संग्रहीत हैं.
यह पत्र HELLO तुलना नहीं है फिर और फिर,
क्योंकि वास्तव में क्या हुआ है, यह सब समय हम GetString का उपयोग कर रहा है -
यह ब्लैकबोर्ड फिर हमारे कंप्यूटर की मेमोरी है,
और चलो का कहना है कि मैं एक चर एस की घोषणा के बाद GetString फोन.
मेरी स्मृति की तरह दिखता है?
चलो मनमाने ढंग से कहना है कि इस तरह दिखता है. यह एक वर्ग है.
और बहुत ज्यादा किसी भी समय मैं स्क्रीन पर स्मृति का एक टुकड़ा तैयार किया है
अगर यह 32 बिट है कि मैं इस तरह से किया गया है चौकों ड्राइंग उपकरण में क्योंकि वास्तव में,
एक सूचक, पते, 32 बिट है. यह एक int के रूप में ही है.
यह कंप्यूटर प्रणाली के आधार पर भिन्न हो सकते हैं.
तुम में से जो थोड़ा तथ्य यह है कि अपने मैक या पीसी 64 बिट से परिचित हैं,
कि वास्तव में अर्थ है कि आपके कंप्यूटर में 64 बिट संकेत का उपयोग कर रहा है,
64 बिट पते और कि का upsides के बीच अपने कंप्यूटर
पुराने की तुलना में अधिक हो सकता है RAM.
लंबी कहानी संक्षेप, वापस दिन में जब कंप्यूटर केवल 32 बिट का इस्तेमाल किया
पते का प्रतिनिधित्व करते हैं, बाइट्स की सबसे बड़ी संख्या में आप का प्रतिनिधित्व कर सकता है
उस मामले में किया गया था क्या हुआ अगर आप 32 बिट है?
4 तो अरब, ठीक है, क्योंकि 2 32 4 अरब है.
यह संख्या पाठ्यक्रम में आवर्ती है.
>> तो अगर आप केवल 32 बिट, उच्चतम नंबर पर आप भरोसा कर सकते हैं लगभग 4 अरब.
लेकिन यह है कि कुछ साल पहले तक कंप्यूटर की एक मौलिक सीमा
क्योंकि अगर आप केवल 4 अरब के रूप में उच्च भरोसा कर सकते हैं,
यह कोई फर्क नहीं पड़ता अगर तुम राम के 8 गीगाबाइट या भी राम की 5 गीगाबाइट खरीदने;
आपको लगता है कि उच्च गिनती नहीं है, तो यह बेकार था कर सकते हैं.
आप केवल अपने कंप्यूटर की स्मृति के पहले 3 या 4 गीगाबाइट का उपयोग कर सकता है.
वह एक मुद्दे के कम है, और आप मैकबुक पेशेवरों और Dells खरीद सकते हैं
राम के 8 गीगाबाइट या अधिक भी इन दिनों के साथ.
लेकिन अगर मैं इस कार्यक्रम में काफी बस एक सूचक आवंटित, एक सूचक कहा जाता है,
इसे इस तरह से स्क्रीन पर लग रही है क्योंकि वास्तव में हम वापस छील इस परत की जरूरत हो सकती है.
मैं कह स्ट्रिंग रखने के लिए, लेकिन सोमवार के रूप में, स्ट्रिंग वास्तव में चार *
कुछ चरित्र का पता.
तो चलो कि प्रशिक्षण पहिया बंद ले यद्यपि हम अब के लिए GetString का उपयोग जारी रखेंगे.
इसलिए मैं घोषित किया है, और यह स्मृति का एक हिस्सा है, 32 बिट है.
डिफ़ॉल्ट रूप से स्मृति में यहाँ क्या है? >> [अश्राव्य छात्र प्रतिक्रिया]
वह क्या है? >> [छात्र] कचरा. >> कचरा. बिल्कुल सही.
यदि आप एक चर में प्रोग्रामर एक मूल्य नहीं डाल दिया है, जो जानता है कि यह क्या है?
कभी कभी तुम भाग्यशाली हो और यह 0 है, जो एक अच्छी, साफ डिफ़ॉल्ट मान की तरह है,
लेकिन जैसा कि हम सोमवार को देखा, कभी कभी यह पूरी तरह बकवास है,
वास्तव में कुछ बड़ा सकारात्मक या नकारात्मक संख्या है कि कहाँ से आया था?
हाँ. >> [छात्र] पहले समारोह. >> हाँ.
>> अक्सर समारोह में कहा कि क्योंकि इससे पहले याद करने के लिए बुलाया गया,
के रूप में आप फोन स्मृति में कार्य करते हैं, वे नीचे से अधिक से अधिक स्थान ऊपर ले,
और समारोह रिटर्न के रूप में जल्द से जल्द, कि स्मृति reused हो जाता है
अगले आदमी है कि बुलाया जाता है, जो अपनी स्मृति का एक ही टुकड़ा का उपयोग कर रहा है.
और यदि आप बाईं वहाँ कचरा, पिछले मूल्यों है,
हम कुछ मूल्य वाले के रूप में वास्तव में जब हम वहाँ कुछ भी नहीं डाल दिया है गलती हो सकती है.
तो इस बिंदु पर हमारे रैम इस तरह दिखता है.
अब 7 लाइन के दाएँ हाथ की ओर हम GetString बुला रहे हैं,
जो हम सप्ताह के लिए किया गया है अब कर रहे हैं, लेकिन क्या वास्तव में कर रही GetString है?
CS50 कर्मचारियों द्वारा लिखा GetString एक छोटे से बुद्धिमान है
कि में उपयोगकर्ता के रूप में जल्द ही के रूप में शुरू होता है टाइपिंग कुंजी और हिट दर्ज करें,
GetString बाहर आंकड़े कितने keystrokes उपयोगकर्ता हिट किया था,
कितने अक्षर मैं के लिए रैम आवंटित करने की जरूरत नहीं है.
और जहां कि राम से आता है, कौन जानता है?
यह आपके कंप्यूटर की 2 गीगाबाइट मेमोरी की whatnot में कहीं है.
लेकिन लगता है कि कंप्यूटर HELLO शब्द के लिए अंतरिक्ष सही यहाँ पाया.
शब्द मैं टाइप एच ई एल एल ओ था.
और अगर हम अक्षरों के एक दृश्य के रूप में इस आकर्षित है, तो हम इसे इस तरह से आकर्षित हो सकता है.
लेकिन मैं 1 अतिरिक्त काम करने की जरूरत है. क्या सी में किसी भी स्ट्रिंग के अंत में अंतर्गत आता है?
अशक्त चरित्र है, जो हम \ 0 के रूप में लिखें.
यह तकनीकी संख्या 0, लेकिन बैकस्लैश सभी स्पष्ट करता है
कि यह सचमुच 0 संख्या, पूर्णांक 0;
यह, उदाहरण के लिए, 0 बोली - गंदें शब्द बोलना है कि आप कीबोर्ड पर टाइप हो सकता है के लिए नहीं है.
तो यह HELLO है.
>> और क्या हम सोमवार को कहा था कि GetString तरह एक समारोह
वास्तव में इन सभी सप्ताह लौटने?
यह प्रतिशत से एक स्ट्रिंग लौट नहीं है कि क्योंकि वास्तव में नहीं अर्थ करता है
क्योंकि तार मौजूद नहीं है. वे CS50 पुस्तकालय में एक निर्माण की तरह कर रहे हैं.
क्या वास्तव में एक स्ट्रिंग है, और अधिक तकनीकी? >> [छात्र] यह पहली चरित्र है.
बिल्कुल सही. यह काफी बस पहले चरित्र का पता है कि उपयोगकर्ता अंदर टाइप
तो अगर मेरे शब्द HELLO यह बाइट संख्या 123 पर और फिर बाइट संख्या 124 पर समाप्त हो जाती है,
125, 126, और बहुत आगे है, अगर मैं 0 से अभी तक मेरे बाइट्स की संख्या
वास्तव में GetString लौट रहा है कि क्या सचमुच संख्या 123 है.
तो क्या हो जाता है में डाल संख्या 123, नहीं पत्र एच शब्द है नमस्कार,
काफी बस पता जिस पर मैं HELLO के पहले अक्षर को पा सकते हैं.
लेकिन वह पर्याप्त तरह प्रतीत नहीं होता. मैं आप एक स्ट्रिंग के लिए पूछा, चरित्र एक नहीं.
तो हम या कंप्यूटर कैसे जानते हो Ello तरह एच के साथ आते हैं कि?
समझौते की तरह हम क्या है? हाँ.
[छात्र] यह अपने आप कह कुछ और वर्ण खोजने रहता है. वास्तव में. >>
>> इस सम्मेलन मानव कंप्यूटर है जिससे जब आप तार के साथ काम कर रहे हैं,
अन्यथा अब चार सितारों के रूप में जाना जाता है, तो आप बस यह पता लगाने की
जहां जीवन में हर स्ट्रिंग के अंत वास्तव में सिर्फ पाश के लिए एक के साथ इसे खत्म पुनरावृति है,
एक समय पाश, जो कुछ भी है, ताकि जब आप स्ट्रिंग के अंत
अब तुम उस से अनुमान कर सकते हैं, ओह, पूरे शब्द HELLO था.
पूर्व प्रोग्रामिंग अनुभव के साथ आप उन जावा में जानते हो सकता है
तुम सिर्फ फोन की लंबाई कर सकते हैं और अन्य भाषाओं में आप लंबाई या इसी तरह के कॉल कर सकते हैं.
वजह यह है कि भाषाओं का एक बहुत में, विशेष रूप से बातें भाषा वस्तु उन्मुख कहा जाता है,
कुछ की लंबाई ही डेटा के टुकड़े के समझाया अंदर की तरह है,
हम बहुत समझाया आईडी और नाम और सोमवार को एक छात्र के अंदर घरों की तरह.
लेकिन सी बहुत कम स्तर है. वहाँ कोई वस्तु या कक्षाएं हैं, अगर आप उन शब्दों के बारे में सुना है.
तुम सब है वास्तव में स्मृति पते है.
तो यह दिलचस्प डेटा संरचनाओं का प्रतिनिधित्व के पुराने ढंग का रास्ता की तरह है.
आप पहली चरित्र के पते की तरह एक शुरुआत मान
और फिर सिर्फ कुछ मनमाने ढंग से परंपरा है कि हर किसी का पालन करने के लिए सहमत हैं.
तो कैसे स्ट्रिंग की लंबाई कार्यान्वित किया जाता है, तो हम प्रस्ताव किया था?
Strlen, strlen, जो आप में से कुछ अब कुछ बार इस्तेमाल किया है. यह बहुत आसान है, है ना?
यह कोड के 2 लाइनों की तरह है.
यह बहुत ज्यादा किसी प्रकार की एक के लिए पाश के साथ हो सकता है, एक अतिरिक्त स्थानीय चर.
लेकिन strlen सिर्फ एक सूचक ले और फिर \ 0 के लिए तलाश शुरू करते है.
>> और जैसे ही वह यह पाता है, यह कदम है कि यह है कि स्ट्रिंग में ले लिया है की कुल संख्या लौट सकते हैं.
इसलिए हम इस से अनुमान क्या अगले पर चला जाता है.
तो लगता है कि मैं टी घोषणा के रूप में मैं 10 लाइन में किया है.
यह कुछ कचरा मूल्य है. पहली बार में कौन जानता है?
लेकिन 10 की लाइन के दाएँ हाथ की ओर पर मैं फिर GetString बुला रहा हूँ.
कौन जानता है, जहां यह समाप्त होता है?
चलो मनमाने ढंग से कहना है कि ऑपरेटिंग सिस्टम यह यहाँ तरह के लिए कमरे में पाया.
मैं संयोग एच ई एल एल ओ लिखें फिर से होगा,
और इसलिए हम तस्वीर का एक ही तरह आकर्षित कर सकते हैं.
लेकिन तथ्य यह है कि मैं इस तस्वीर को दोबारा बनाई है, विचार है
क्योंकि कि यह एक से अधिक विभिन्न नमस्कार.
तो यहाँ यह 456 स्थान हो सकता है, यह 457 है, और बहुत आगे है.
तो क्या डाल दिया जाता है जहां एक बार प्रश्न चिह्न था?
इस मामले में 456.
हम इन नंबरों मनमाने ढंग से उठा रहे हैं क्योंकि वास्तव में आज के बाद
हम क्या है कुछ के पते के बारे में इतना परवाह नहीं जा रहे हैं.
हम सब के बारे में परवाह है कि हम बाहर HELLO तरह डेटा के कुछ टुकड़े का पता लगाने कर सकते हैं.
>> तो वास्तव में ज्यादातर लोगों के कंप्यूटर विज्ञान के क्षेत्र में क्या करते हैं जब स्मृति पते के बारे में बात कर रही
और संकेत के बारे में विशेष रूप से बात कर रही है,
कौन परवाह करता है, जहां यह सब वास्तव में है, बजाय बाहर figuring 123 परेशान
हम सिर्फ इतना पता है कि यह कुछ संख्यात्मक पते पर है -
हम दुनिया सरल और बस का कहना है कि है कि चरित्र की ओर इशारा करते है
और टी कि चरित्र की ओर इशारा करते है.
और तथ्य यह है कि यह एक तीर काफी जानबूझकर है
क्योंकि सचमुच अब एच और टी में इशारा कर रहा है अन्य एच पर इशारा कर रहा है
क्योंकि दिन के अंत में, यह बात पता क्या है नहीं करता,
लेकिन यह बात है कि हम कोड के कुछ टुकड़े के साथ उस पते को व्यक्त करने की क्षमता है.
हम वास्तव में इन पतों चालाकी से नहीं है बस अभी तक
तो हम देखेंगे जहां हम interject और सॉर्ट के संकेत के साथ बातें करते हैं,
लेकिन अब के लिए लाइन में 12 सचमुच क्या हम मूल्यों की तुलना कर रहे हैं
12 लाइन में इस कहानी के अनुसार?
हम कह रहे हैं कि 123 456 के बराबर बराबर है? और कहा कि निश्चित रूप से मामला नहीं है.
और धारणात्मक भी, यह सूचक निश्चित रूप से इस रूप में ही नहीं है
क्योंकि आप दो बार GetString कहा जाता है, और GetString चालाक सुपर होने की कोशिश नहीं करता,
यह एहसास नहीं की कोशिश करता है, ओह, आप HELLO 5 मिनट पहले टाइप;
मुझे आप एक ही सूचक के रूप में मैं तुम से पहले दे दी,
यह सिर्फ स्मृति का एक नया हिस्सा हर बार जब आप यह कहते हैं का आवंटन.
>> तो हम इस समस्या को कैसे तय करते हैं?
उच्च स्तर अगर मैं HELLO और HELLO तार की तुलना करना चाहते हैं -
मैं संकेत के बारे में परवाह नहीं है - मैं सवाल का जवाब देने के बारे में कैसे जाना है,
क्या उपयोगकर्ता एक ही बात लिखें? यहाँ क्या आवश्यक है? हाँ.
[छात्र] एक समारोह का प्रयोग करें. >> मैं बॉक्स के बाहर एक समारोह का उपयोग कर सकते हैं.
मैं एक strcmp, s-टी आर - ग - मीटर पी बुलाया समारोह का उपयोग कर सकते हैं,
सिर्फ कह स्ट्रिंग तुलना के संक्षिप्त संस्करण.
और अगर हम में जाना है, उदाहरण के लिए, 2 तुलना जो आज हैंडआउट्स के बीच है,
मुझे लगता है कि वास्तव में करते हैं.
मैं नीचे 26 या ऐसा करने के लिए और सब कुछ लाइन 1 से ही रखा है,
और अब नोटिस यह हिस्सा सिर्फ एक छोटा सा बदल गया है.
चलो एक पल के लिए 28 लाइन की उपेक्षा और इस पर एक ही ध्यान केंद्रित.
क्या हम सोमवार कहा था कि str तुलना नहीं करता है?
यह इस मामले में 2 संकेत, और टी लेने की प्रक्रिया संभालती है,
सॉर्ट के लगभग उन 2 पत्र पर अपनी उंगली डाल,
और यह करना चाहिए कि क्या एक समय या पाश के लिए पाश की तरह कुछ है,
और यह कहते हैं कि ये वही कर रहे हैं? यदि हां, तो यह उंगलियों या संकेत आगे बढ़ता रहता है.
ये वही कर रहे हैं, ये वही है, ये वही,
इन एक ही, ये वही है? ऊह और मैं दोनों है और टी में स्ट्रिंग के अंत में हूँ.
मैं किसी भी विरोधाभासों नहीं मिला है. हाँ, इन तारों वही कर रहे हैं.
और क्या str वापसी की तुलना करता है अगर 2 तार वही कर रहे हैं, जाहिरा तौर पर? शून्य.
0 इस मामले में तो अच्छा है क्योंकि अगर यह -1 या +1 देता है,
इसका मतलब है कि है कि सिर्फ t वर्णानुक्रम के पहले या टी के बाद आने वाला है.
और क्यों कि उपयोगी हो करने के लिए एक समारोह में कहा कि आपको बताता है जो स्ट्रिंग से पहले आता है
या के बाद एक शब्दकोश में?
[छात्र] खोज की जा रही है. >> खोज और छँटाई.
>> तो तुम द्विआधारी खोज या बुलबुला तरह की तरह बातें करते हैं या छंटाई संविलय
जहाँ आप चीजों की तुलना है.
इस प्रकार अब तक हम कुछ कोनों में कटौती की तरह है और केवल छँटाई के बारे में बात की
संख्या के संदर्भ में है क्योंकि यह अच्छा और आसान करने के बारे में बात करते हैं,
लेकिन आप निश्चित रूप से तार, सेब और केले की तुलना कर सकते हैं,
क्योंकि अगर सेब केले से पहले आते हैं, इसी तरह करने के लिए जाना जाता है,
आप के चारों ओर तार स्थानांतरित कर सकते हैं रोब तरह सिर्फ स्मृति में मर्ज प्रकार के साथ वीडियो में
और हम चयन छंटाई, प्रविष्टि तरह है, और बुलबुला तरह के साथ मंच पर यहाँ था.
तो और जहां हम ले सकते हैं? चलो इस प्रयास करें.
चलो की तरह है कि एक पल के लिए सबक भूल जाते हैं और अब कोशिश करते हैं और निम्नलिखित करना 1.c प्रतिलिपि बनाने के.
21 लाइन में मैं में प्रिंट कुछ कह रहा हूँ,
तो मैं उपयोगकर्ता से एक स्ट्रिंग हो रही है,
तो मैं इस जाँच कर रहा हूँ.
हम वास्तव में इस आदत में नहीं डाल दिया है अभी तक, लेकिन अब ऐसा करने के.
वास्तव में वापस करने के लिए इस परत छील. यह वास्तव में चार * है. इस आदमी वास्तव में चार * है.
तो क्या यह अगर == Null जाँच हो मतलब है?
यह पता चला है कि जब आप GetString तरह एक समारोह कॉल
या अधिक आम तौर पर सिर्फ एक कंप्यूटर पूछने के लिए आप कुछ स्मृति दे,
कुछ गलत हो सकता है.
तुम पागल हो और स्मृति का एक terabyte के लिए कंप्यूटर में पूछ सकते हैं
स्मृति बाइट्स कि सिर्फ कंप्यूटर में मौजूद नहीं है के अरबों के लिए पूछ रही द्वारा,
लेकिन GetString और अन्य कार्यों तुम पर चिल्ला के कुछ तरह की जरूरत है
अगर आप बहुत ज्यादा के लिए कहा है.
और जिस तरह से GetString इस करता है अगर आप और अधिक स्मृति के लिए कहा है
से कंप्यूटर में उपलब्ध है, भले ही वह सुपर, सुपर कम संभावना है
क्योंकि हम में से कोई एक खरब वर्ण लिखें और फिर हिट दर्ज करने के लिए जा रहे हैं,
लेकिन कम संभावना है हालांकि यह हो सकता है, मैं अभी भी इसके लिए बस के मामले में जाँच करना चाहते हैं,
और विशेष मूल्य GetString, जवाब, और अन्य कार्यों कि रिटर्न
अगर कुछ गलत हो गया है, सभी टोपियां में रिक्त है.
>> और क्या नल है? नल सिर्फ इतना एक सूचक का प्रतिनिधित्व करने के लिए होता है. यह स्मृति पता 0 है.
दुनिया है कि मनमाने ढंग से फैसला किया है, अगर यह मेरे कंप्यूटर की मेमोरी है - तुम क्या जानते हैं -
हम सिर्फ हर कंप्यूटर की स्मृति के 1 बाइट चोरी करने के लिए जा रहे हैं, और यह 0 स्थान है.
हम यह नल का एक उपनाम देने के लिए जा रहे हैं, और हम वादा करने के लिए जा रहे हैं
कि हम वास्तव में असली डेटा वहाँ कभी नहीं रखा जाएगा
क्योंकि हम सिर्फ मनमाने ढंग से एक विशेष मूल्य, 0, उर्फ ​​नल की जरूरत है,
इतना है कि हम उपयोगकर्ताओं पर चिल्लाना अगर कुछ गलत हो जाता है.
अन्यथा आप नहीं जानते हो सकता है 0 मतलब है कि यहाँ कुछ रखा
या इसका मतलब यह है कि कुछ गलत हो गया?
हम सभी सहमत हैं कि रिक्त मतलब नहीं लौट रहा था,
कोई वास्तविक पते लौट रहा था.
अब, यहाँ मैं सिर्फ मैं मानव सम्मेलन अपनाने हूँ मुख्य से 1 वापसी
अगर कुछ गलत हो जाता है.
ऐसा इसलिए है क्योंकि मुख्य वापसी सम्मेलन 0 अगर अच्छी वापसी है,
1 या अगर कुछ बुरा अन्य मूल्य.
लेकिन GetString और किसी भी समारोह है कि स्मृति रिक्त रिटर्न में सौदों अगर कुछ बुरा हो जाता है.
>> ठीक है. तो दुर्भाग्य से, 27 लाइन, हालांकि यह है सुपर आसान है, पूरी तरह से स्ट्रिंग कॉपी करने में विफल रहता है.
क्यों? हम देख सकते हैं कि इस के रूप में इस प्रकार है.
मैं 27 लाइन में दावा के एक प्रतिलिपि बनाने और यह टी बुला रहा हूँ.
तो मैं 2 तार इस समय के लिए उपयोगकर्ता नहीं पूछ रहा हूँ, मैं बस में मूल्य कह रहा हूँ
के रूप में अच्छी तरह से टी में रखा जाना चाहिए.
तो अब सिर्फ प्रदर्शित करने के लिए यह कैसे टूटी हुई है, लाइन में 29 आगे मैं क्या कर रहा हूँ?
पहले मैं जाँच कर रहा हूँ अगर टी की लंबाई 0 से अधिक है.
वहाँ कुछ वहाँ स्ट्रिंग है. उपयोगकर्ता अंदर कुछ टाइप
32 कर रही लाइन, जाहिरा तौर पर क्या है?
[अश्राव्य छात्र प्रतिक्रिया] >> को राइट. आप किस तरह का मैं क्या कहा यह कर रहा है से अनुमान कर सकते हैं.
लेकिन तकनीकी तौर पर, यह क्या कर रहा है? टी [0] का प्रतिनिधित्व करता है?
[छात्र] 0 चरित्र. >> [Malan] 0 चरित्र.
या, मानव की तरह, टी में 1 चरित्र, जो कुछ भी है, एच हो सकता है इस मामले में.
और toupper यह क्या कहता है. यह टी के 0 चरित्र capitalizes और यह परिवर्तन है.
तो इसका मतलब है कि टी के 0 चरित्र ले, यह अपरकेस,
और यह है कि एक ही स्थान में वापस डाल दिया.
तो अगर मैं लोअरकेस में हैलो टाइप, यह एक राजधानी एच. लोअरकेस ज बदलना चाहिए
लेकिन समस्या यह है कि लाइनों में 35 और 36 है कि मैं क्या करने के बारे हूँ हमें और टी के लिए बाहर मुद्रित है.
और अपने कूबड़ क्या है?
मैं वास्तव में क्या कर रहा हूँ कि अगर मैं सभी लोअरकेस में हैलो में टाइप करने के लिए जा रहे हैं?
क्या मुद्रित हो रहा है? >> [अश्राव्य छात्र प्रतिक्रिया] >> वह क्या है?
[छात्र] बिग एच और बाकी छोटे. >> बड़ा एच और बाकी है, जिसमें छोटे के लिए, या एस टी?
दोनों [छात्र]. >> दोनों. बिल्कुल सही. तो देखते हैं यहाँ क्या हो रहा है.
>> मुझे आगे जाना है और इस संकलन. इस copy1 है, तो copy1 बनाते हैं. सही सभी.
अंदर ज़ूम चलो मुझे आगे जाना और copy1 चलाने के, दर्ज करें, कुछ तो कहो: हैलो लोअरकेस में.
यह प्रतिलिपि पूंजीकृत है, लेकिन यह स्पष्ट तौर पर मूल रूप में अच्छी तरह से पूंजीकृत,
क्योंकि अब इस कहानी में क्या होता है?
27 लाइन में मैं वास्तव में स्ट्रिंग नकल नहीं लग रहे हो,
लेकिन फिर भी तुम intuitively आशा व्यक्त की है हो सकता है कि मामला हो,
यदि आप इस तस्वीर के बारे में सोचते हैं, क्या वास्तव में मैंने किया है?
तस्वीर के आधा ही है.
तो चलो समय में वापस रोल इतना है कि टी अभी तक की कहानी में मौजूद नहीं है.
एस कहानी में मौजूद है, लेकिन हम हैलो इस समय लोअरकेस.
तो मुझे ठीक मैं क्या वास्तव में अंदर टाइप
इस मामले में हम ज ए एल एल ओ है.
हम यह वर्ण के एक दृश्य के रूप में आकर्षित करेंगे, मेरे विभाजक लाइनों यहाँ डाल दिया और मेरे \ 0.
तो यह है कि जहां हम 24-ish के माध्यम के रूप में 1 पंक्ति के रूप में जल्द ही दे या ले है, मार डाला.
यह मेरी स्मृति की तस्वीर है.
जब मैं 27 लाइन के लिए मिलता है, क्या होता है?
पहले की तरह, मैं एक सूचक है, जो मैं इस वर्ग के रूप में आकर्षित करेंगे.
यह टी कहा जाता है. और डिफ़ॉल्ट रूप से अपने मूल्य क्या है? कौन जानता है? कुछ कचरा मूल्य.
>> तो मैं सार हूँ कि एक प्रश्न चिह्न के रूप में दूर.
और के रूप में जल्द ही के रूप में 27 लाइन के दाएँ हाथ की ओर निष्पादित करता है, मैं क्या हूँ टी के अंदर डाल रही हो?
एक ही बात है कि में है.
तो अगर हम एक पल के लिए तीर के इस अमूर्त को हटा दें और हम कहते हैं,
ओह, यह स्मृति लोड पते 123 है, जब आप कहते हैं कि टी है, सेमीकोलन हो जाता है,
आप सचमुच 123 यहाँ डाल रहे हैं.
अब अगर हम किस तरह के चित्रों के साथ फिर से हमारी दुनिया को आसान बनाने के लिए,
आप वास्तव में क्या किया है सिर्फ अपनी दुनिया में एक और तीर
कि टी से एक ही सटीक स्ट्रिंग की ओर इशारा करते है.
तो जब लाइन 31 और 32 में मैं वास्तव में [0] टी को बदलने के बारे में जाने के लिए,
टी क्या है [0] जाहिरा तौर पर अब साथ पर्याय बन गया है? [0]
तो यह है कि जो हो रहा है सब है.
और भी हालांकि इस तरह का मानना ​​है कि एक छोटे से कम स्तर और रहस्यमय
और इस तरह शायद intuitively यह सिर्फ काम किया जाना चाहिए की तरह लगता है -
मैं चीजों की प्रतियां पहले बनाया है और यह सिर्फ काम -
यदि आप वास्तव में एक स्ट्रिंग वास्तव में क्या है के बारे में सोचते हैं, यह एक चार * है.
खैर, वह क्या है? यह कुछ चरित्र का पता है.
तो शायद यह और अधिक समझ में आता है कि जब आप कुछ करने की कोशिश
सुपर प्रतीत होता है इस तरह सरल है, आप सब कर रहे नकल एक स्मृति पता है.
आप वास्तव में स्वयं स्ट्रिंग के साथ कुछ भी नहीं कर रहे हैं.
तो भी अगर आप पता नहीं कैसे आप कोड में इस समस्या का समाधान होगा,
उच्च स्तर, धारणा, हम क्या करने की ज़रूरत है क्रम में एस की सत्य प्रतिलिपि टा बनाने, जाहिरा तौर पर?
हाँ. >> [छात्र] यह एक नया स्थान दे? वास्तव में. >>
>> हम एक ब्रांड नए स्थान देने की जरूरत है.
हम किसी भी तरह से एक दुनिया में जो हम स्मृति का एक नया हिस्सा बनाने की जरूरत है,
जो सिर्फ स्पष्टता के लिए मैं इस एक के ठीक नीचे आकर्षित है, लेकिन यह वहाँ होने की जरूरत नहीं है.
लेकिन यह एक ही आकार के होने की जरूरत है, तो मैं एक ही जगह में इन ऊर्ध्वाधर लाइनों आकर्षित करेंगे.
यह ठीक है अगर यह सब कचरा शुरू है. कौन जानता है कि वहाँ क्या था?
लेकिन 1 कदम करने के लिए मुझे बहुत स्मृति के रूप में देने के लिए किया जा रहा है के रूप में मैं की जरूरत
हैलो की एक प्रतिलिपि फिट करने के लिए, तो बाहर आंकड़ा कैसे ज को कॉपी करने के लिए यहाँ, यहाँ ई,
एल यहाँ और बहुत आगे है.
लेकिन यह पहले से ही एक छोटे से स्पष्ट लग रहा है यहां तक ​​कि अगर विवरण में से कुछ अभी भी सार चाहिए.
इस मामले में इस स्ट्रिंग कॉपी, यह सिर्फ एक पाश या एक समय पाश के लिए है
या कुछ और है जिसके साथ आप सभी को और अधिक परिचित हो गए.
तो चलो इस प्रयास करें. चलो मुझे copy2.c में जाना.
Copy2.c में हम 27 लाइन के अलावा लगभग एक ही कार्यक्रम है.
यह थोड़ा जटिल दिखता है, लेकिन अगर हम इसे तोड़ने के नीचे टुकड़ा टुकड़ा करके,
बाएँ हाथ की ओर ही है.
चार * स्मृति में इस बात को बनाता है, एक प्रश्न चिह्न के साथ यद्यपि
क्योंकि हमें पता नहीं है क्या डिफ़ॉल्ट रूप से वहाँ है.
दाएँ हाथ की ओर हम अब एक नया समारोह malloc, शुरू कर रहे हैं,
के लिए स्मृति आवंटित, मुझे स्मृति दे,
और यह स्पष्ट तौर पर कितने तर्क, कितने कोष्ठकों के अंदर बातें? लेता है
मैं 1 और 2 के बुड़बुड़ाना सुना है, लेकिन यह सिर्फ 1 है.
वहाँ कोई अल्पविराम है, जिसका अर्थ है वहाँ कोष्ठकों के अंदर सिर्फ एक बात है.
हालांकि वहाँ अन्य कोष्ठकों है, मुझे पर प्रकाश डाला
बाह्यतम कोष्ठक के अंदर क्या है, और यह इस अभिव्यक्ति है:
(Strlen () + 1) * sizeof (चार).
इसलिए यदि हम वास्तव में इस के माध्यम से लगता है, यह कह रहा है मुझे एस के लंबाई दे.
मैं क्यों कर रहा हूँ, हालांकि, लंबाई पर 1 जोड़ने? >> [अश्राव्य छात्र प्रतिक्रिया]
बिल्कुल सही. हम पूंछ में इस आदमी के लिए जगह की जरूरत है, 6 चरित्र कि कोई अंग्रेजी अर्थ है
लेकिन विशेष प्रोग्रामेटिक अर्थ है.
>> तो हम उस के लिए एक + 1 की जरूरत है क्योंकि strlen रिटर्न मानव लंबाई की उम्मीद,
नमस्ते या 5, यह आप अतिरिक्त अशक्त चरित्र नहीं देना नहीं है.
तो मैं स्वयं 1 + के साथ जोड़ने के लिए.
और फिर, * (चार) के आकार, हम इस से पहले नहीं देखा है.
यह तकनीकी रूप से एक समारोह नहीं है.
यह एक विशेष कीवर्ड है कि बस आपको बताता है क्या आकार एक कंप्यूटर पर कुछ डेटा प्रकार की है
क्योंकि वास्तव में, हम में से कुछ 32 बिट कंप्यूटर है.
मैं घर पर एक बहुत पुराने कंप्यूटर है, और यह केवल 32 बिट का उपयोग करने के लिए संकेत का प्रतिनिधित्व.
और यदि ऐसा है तो मैं एक डेटा प्रकार के आकार किया था, यह 32 बिट हो सकता है.
लेकिन अगर मैं अपने नए फैंसी कंप्यूटर का उपयोग कर रहा हूँ, मैं वापस 64 बिट्स के मूल्य मिल सकता है
एक पते की तरह कुछ के लिए.
तो इस मामले में, बस सुपर सुरक्षित करने के लिए, हम कठिन कोड की तरह कुछ करने के लिए नहीं जा रहे हैं -
ठीक है, क्या हम अब तक क्या कहा है के अनुसार चार के आकार के है?
हम बहुत ज्यादा मौखिक रूप से कहा है कि यह 1 बाइट है, और कहा कि बोर्ड भर में बहुत ज्यादा सच है.
लेकिन फिर, मान्यताओं को खराब हो जाते हैं.
वे छोटी गाड़ी सॉफ्टवेयर के लिए नेतृत्व अगर लोग तरीके आप का इरादा नहीं था में अपने सॉफ्टवेयर का उपयोग.
तो चलो सार यह दूर है और बस अधिक generically कहना
मैं स्मृति के कई विखंडू की जरूरत
और स्मृति का एक हिस्सा एक चरित्र के आकार के बराबर होना चाहिए,
जो वास्तव में 1 इस मामले में बराबर है, लेकिन यह यह लेखन की एक अधिक सामान्य तरीका है.
तो अगर शब्द हैलो है, कितने बाइट्स malloc जाहिरा तौर पर करता है हैलो के लिए आवंटित?
छह [छात्र]. छह. >> बिल्कुल के रूप में कई के रूप में हम स्क्रीन पर प्रश्न चिह्न है.
और फिर एक अब GetString की अपनी समझ के आधार पर लगता है
क्या malloc शायद वापस नहीं करता है? >> [छात्र] पता.
क्या है की एक पते? स्मृति का पहला हिस्सा.
>> हमें पता नहीं क्या है वहाँ है, क्योंकि कुछ अन्य समारोह
इस स्मृति हो सकता है पहले.
लेकिन malloc, GetString तरह, स्मृति की पहली बाइट का पता देता है
कि यह एक तरफ आप के लिए निर्धारित किया गया है.
हालांकि, ऐसा नहीं करता है क्या इस रिक्त में एक बैकस्लैश अशक्त चरित्र के साथ भरने के लिए है
क्योंकि यह मुड़ता बाहर आप malloc का उपयोग करने के लिए कुछ भी आवंटित कर सकते हैं: ints, तार, arrays,
मंगाई, छात्र संरचनाओं.
आप पूरी तरह से malloc generically का उपयोग कर सकते हैं.
यह परवाह नहीं है या पता है कि आप के लिए स्मृति का आवंटन कर रहे हैं है.
तो यह malloc के लिए अभिमान एक \ 0 रखा जाएगा
स्मृति के हर हिस्सा के अंत में यह आपको दे रही है
क्योंकि इस \ 0 बात सिर्फ तार के लिए एक सम्मेलन है.
यह ints के लिए इस्तेमाल नहीं किया है, यह तैरता के लिए इस्तेमाल नहीं किया है, यह छात्रों के लिए इस्तेमाल नहीं किया है.
और इसलिए malloc के साथ पकड़ लिया है कि बोझ आप पर पूरी तरह से प्रोग्रामर है
याद करने के लिए आप कितने बाइट्स आवंटित की है और पाश के लिए एक कभी इस्तेमाल
या एक जबकि पाश और स्मृति का हिस्सा दिया गया है की सीमा पिछले जाने.
दूसरा रास्ता रखो, जैसे ही आप स्मृति को आबंटित करने के लिए,
आप ऑपरेटिंग सिस्टम नहीं पूछ सकते हैं, ओह, जिस तरह से यह स्मृति का एक हिस्सा का कितना बड़ा था?
यह आप पर निर्भर करता है याद करने के लिए अगर आपको लगता है कि मूल्य की जरूरत है.
>> तो देखते हैं कैसे मैं इस स्मृति का उपयोग करने के लिए आगे बढ़ें.
लाइन 28 और 29 में मैं ऐसा क्यों कर रहा हूँ?
बस कुल मानसिक स्वास्थ्य की जांच.
बस के मामले में कुछ गलत हो गया है, मैं स्मृति के कुछ पागल राशि के लिए पूछना
या मैं इतने सारे चीजें कंप्यूटर पर चल रहा है कि वहाँ अभी पर्याप्त स्मृति नहीं है,
कुछ की तरह है कि मैं कम से कम करने के लिए अशक्त की जांच करने के लिए करना चाहते हैं.
हकीकत में, अधिकांश कंप्यूटर आप भ्रम दे देंगे कि हर कार्यक्रम
अपने रैम की संपूर्णता का उपयोग कर सकते हैं,
लेकिन फिर भी, शायद कुछ पागल लंबी स्ट्रिंग में उपयोगकर्ता प्रकार अगर क्योंकि वे एक बुरा आदमी हो
और वे वास्तव में इसे में अपने कार्यक्रम या हैक दुर्घटना की कोशिश कर रहे हैं,
आप कम से कम malloc की वापसी मूल्य की जांच करना चाहते हैं और क्या यह शून्य के बराबर होती है.
और अगर यह होता है, चलो बस अब छोड़ दिया है क्योंकि मैं नहीं जानता कि क्या है कि मामले में क्या करने के लिए.
मैं स्ट्रिंग कैसे कॉपी करूं? वहाँ कुछ तरीके से ऐसा कर है.
वहाँ str सी में कार्यों की प्रतिलिपि बनाने के लिए, लेकिन यह सुपर आसान है के लिए हमें इस तरह से करने के लिए पुराने जमाने.
>> पहले मुझे बाहर आंकड़ा क्या है की लंबाई है.
मैं पाश में डाल सकता है, लेकिन बजाय मैं बस यह बाहर डाल स्पष्टता के लिए यहाँ.
तो पता अब मूल स्ट्रिंग की लंबाई, जो जाहिरा तौर पर 5 भंडार.
फिर मेरे लिए पाश में मैं 0 से iterating रहा हूँ n करने के लिए,
और मैं हर पुनरावृति पर डाल रहा हूँ मैं [] टी के अंदर [i].
तो है कि मैं क्या मेरे 2 से पहले तार पर उंगली उठाई साथ निहित.
पाश के लिए यह इस तरह दोहराता है, मैं यहाँ में घंटे नकल करने के लिए जा रहा हूँ,
यहाँ, यहाँ में एल में ई क्योंकि यह है, यह टी है.
और फिर अंत में, 35 लाइन में मैं यह क्यों कर रहा हूँ?
मुझे यकीन है कि मैं स्ट्रिंग टी को समाप्त कर रहा हूँ बनाने की जरूरत है.
और मैं इसे इस तरह से किया सुपर स्पष्ट हो.
लेकिन प्रस्ताव है, कोई अगर तुम सकता है, ऐसा करने का एक अलग तरीका है.
मैं वास्तव में 35 लाइन की जरूरत नहीं है. वहाँ एक और तरीका यह करने के है.
हाँ. >> [अश्राव्य छात्र प्रतिक्रिया >> कहते हैं कि यह ज़ोर.
[छात्र] से कम या बराबर. वास्तव में. >>
हम सिर्फ कम से कम या बराबर n, जो सामान्य रूप से खराब रहा है कह सकते हैं
लगभग हमेशा जब हम बात हम भरोसा कर रहे हैं के लिए एक समान करने के लिए जाना है क्योंकि
हम एक कदम बहुत दूर जाना है.
लेकिन याद रखना, हम कितने बाइट्स आवंटित किया?
हम strlen एस के आवंटित, तो 5 + 1 6 के एक कुल के लिए.
तो इस मामले में हम इस तरह से कुछ कर सकता है
इतना है कि हम बहुत अंत में, लेकिन अभी भी नहीं हैलो \ 0 नकल कर रहे हैं.
वैकल्पिक रूप से, हम एक str प्रतिलिपि बुलाया समारोह का उपयोग, strcpy सकता है,
लेकिन यह है कि लगभग रूप में बहुत मज़ा नहीं होगा.
लेकिन यह है कि यह सब हुड के नीचे होता है.
फिर अंत में, हम पहले के रूप में एक ही बात करते हैं.
मैं टी भुनाने के लिए और फिर मैं दावा है कि मूल इस प्रतिलिपि और ऐसा लग रहा है की तरह लग रहा है.
तो चलो अब इस कोशिश. मुझे यहाँ में जाना. Copy2 बनाओ. हम में ज़ूम और copy2 चलने देंगे.
मैं लोअरकेस में हैलो में टाइप करने के लिए जा रहा हूँ, और वास्तव में मैं मूल रूप में हैलो लोअरकेस
लेकिन नकल के लिए हैलो राजधानी.
लेकिन मैं अभी तक नहीं कर रहा हूँ. मैं यहाँ 1 आखिरी बात करने की जरूरत है.
स्पष्ट रूप से 46 और 47 स्मृति मुक्त है, लेकिन है कि वास्तव में क्या मतलब है?
मैं क्या कर रहा हूँ, तुम्हें क्या लगता है, द्वारा 46 लाइन और 47 लाइन बुला?
क्या प्रभाव है? हाँ.
[अश्राव्य छात्र प्रतिक्रिया] वास्तव में. >>
>> तुम सिर्फ ऑपरेटिंग सिस्टम कह रहे हैं, हे, इस स्मृति के लिए धन्यवाद.
अब आप इसे किसी और के लिए उपयोग कर सकते हैं.
और यहाँ कचरा मूल्यों का एक आदर्श उदाहरण है.
मैं सिर्फ इस स्मृति का इस्तेमाल किया है नीचे 2 स्थानों में शब्द लिखने हैलो,
यहाँ, यहाँ, यहाँ, और.
तो यह 0 घंटे - ई - एल एल ओ \ है.
लेकिन तब मैं 46 लाइन और 47 लाइन कहते हैं, और आप जानते हैं कि क्या तस्वीर के मामले में होता है?
दरअसल, रुको, इस तस्वीर पुरानी है.
एक बार जब हम प्रतिलिपि बनाते हैं, इस आदमी वास्तव में यहाँ इशारा कर रहा है,
तो चलो संख्या को हटाने और सिर्फ अमूर्त दूर हमारे तीर के रूप में फिर से.
इस तस्वीर में क्या होता है जब मैं मुफ्त कॉल?
[अश्राव्य छात्र प्रतिक्रिया भी नहीं >>.
यदि मैं और एस टी पर मुफ्त कॉल - एक चाल सवाल की तरह सभी में इस तस्वीर को बदल नहीं करता है
s बुला और बुला क्योंकि सिर्फ ऑपरेटिंग सिस्टम बताता है,
अरे, आप इस स्मृति फिर से उपयोग कर सकते हैं, लेकिन यह इस अशक्त करने के लिए परिवर्तन नहीं करता है
या कुछ विशेष चरित्र, यह इस को बदल नहीं करता है,
यह ज या ई या या कुछ और करने के लिए या तो जगह में या एल ओ एल बदल नहीं है.
तस्वीर के मामले में, जैसे ही आप फोन मुक्त, कुछ भी नहीं बदलता.
और उसमें कचरा मूल्यों का मूल है, क्योंकि अगर मैं तो बाद में इस कार्यक्रम में
GetString या malloc या ऐसा कुछ के साथ और अधिक स्मृति के लिए ऑपरेटिंग सिस्टम पूछते हैं कि
और ऑपरेटिंग सिस्टम कहते हैं, ज़रूर, मैं स्मृति के 12 बाइट्स बस मुक्त कर दिया है,
इन का उपयोग करें, क्या आप को सौंप दिया जा रहे हैं?
आप के लिए स्मृति का एक हिस्सा है कि हम आम तौर पर आकर्षित करेगा सौंप दिया जा रहे हैं
सवाल के निशान के साथ, लेकिन उन सवाल के निशान क्या कर रहे हैं?
वे ज ए एल एल ओ, ज ए एल एल ओ होना होगा.
हमारे नए कचरा मूल्यों के रूप में जल्द ही के रूप में आपको लगता है कि स्मृति को मुक्त कर रहे हैं.
>> वहाँ एक असली दुनिया निहितार्थ यहाँ भी है.
यह राम के साथ क्या होता है, लेकिन अपने कंप्यूटर
वास्तव में डिस्क के साथ ही काम करते हैं.
हम इस बारे में विशेष रूप से एक भविष्य समस्या सेट है कि फोरेंसिक पर केंद्रित के साथ बात करेंगे.
लेकिन क्या वास्तव में होता है अगर आप अपने डेस्कटॉप पर कुछ संवेदनशील वित्तीय फ़ाइल
या कुछ ढांचे के JPEG और आप इसे अपने कचरे में खींचें,
क्या होता है जब आप इसे कचरा या रीसायकल बिन में खींचें?
तुम्हें पता था कि मैं किस बारे में बात कर रहा था. [हँसी]
क्या होता है जब आप अपने रीसायकल बिन या कचरा कर सकते हैं में सबूत है कि घसीटा है?
[अश्राव्य छात्र प्रतिक्रिया]
ठीक है, तो सावधान. क्या होता है जब आपको लगता है?
संक्षिप्त जवाब कुछ भी नहीं है, है ना?
ढांचे के रूप में या संवेदनशील फ़ाइल अभी भी सिर्फ वहाँ कहीं बैठे अपनी हार्ड ड्राइव में.
हम में से अधिकांश कम से कम कठिन रास्ता है कि आप अपने कचरा खाली करने की जरूरत है सीखा है
या अपने रीसायकल बिन वास्तव में फ़ाइलों को नष्ट करने के लिए.
और वास्तव में, जब आप ठीक क्लिक करें या नियंत्रण अपने कचरा पर क्लिक कर सकते हैं
या फ़ाइल, रद्दी खाली करें या जो कुछ भी का चयन करें
और आप वास्तव में रद्दी खाली करना है कर सकते हैं या बिन, क्या वास्तव में इस तस्वीर के लिए होता है तो?
अधिक कुछ भी नहीं है. तो वास्तव में कुछ भी नहीं डिस्क पर होता है.
>> और अगर हम सिर्फ अस्थायी रूप से पीछे हटना और लिखने - I'll सिर्फ इस के पीछे का उपयोग करें.
तो अब कहानी राम, जो है जहाँ प्रोग्राम मौजूद से बदल रहा है
जब आप उन्हें डिस्क पर चल रहे हैं, जो है, जहां वे लंबे समय तक संग्रहित कर रहे हैं
यहां तक ​​कि जब सत्ता से बाहर अब के लिए चला जाता है - और हम भविष्य में इस लिए आया हूँ -
चलो बस बहाना है कि यह आपके कंप्यूटर के हार्ड ड्राइव के अंदर का प्रतिनिधित्व करता है
क्योंकि दिन में वापस वे परिपत्र डिस्क फ्लॉपी डिस्क की तरह ज्यादा इस्तेमाल किया.
तो अगर आप कुछ संवेदनशील एक्सेल फ़ाइल है, यह स्मृति के इस हिस्सा ले सकता है
आपके कंप्यूटर की डिस्क पर, और मैं सिर्फ एक ही मनमाना 1s और 0s ड्राइंग हूँ.
जब आप अपने कचरे की तरह है कि फ़ाइल खींचें या बिन पुनरावृत्ति कर सकते हैं,
सचमुच कुछ भी नहीं होता है, क्योंकि एप्पल और माइक्रोसॉफ्ट का फैसला किया है
कचरा कर सकते हैं और रीसायकल बिन वास्तव में सिर्फ एक अस्थायी प्लेसहोल्डर है.
शायद अंततः ओएस यह आप के लिए खाली है, लेकिन आम तौर पर, यह कुछ भी नहीं है,
कम से कम जब तक आप वास्तव में अंतरिक्ष पर कम कर रहे हैं.
>> हालांकि, जब आप खाली कचरा या खाली रीसायकल बिन जाना
इसी तरह, इस तस्वीर के लिए कुछ भी नहीं होता है.
वह यह होता है कि आपके कंप्यूटर पर कहीं और है, वहाँ तालिका के किसी तरह का है.
यह एक छोटे से पत्रक धोखा है कि कहते हैं कि, चलो कहते हैं, resume.doc तरह तरह की है,
तो एक माइक्रोसॉफ्ट वर्ड फ़ाइल को अपनी हार्ड डिस्क पर 123 स्थान पर रहते थे में अपने को फिर से शुरू,
और स्मृति रैम में नहीं है, लेकिन अपनी हार्ड डिस्क पर,
और अपने ढांचे के रूप में 456 पर JPEG रहता है, और अपने Excel फ़ाइल में 789 या जहाँ भी रहता है.
जब आप वास्तव में कचरा या रीसायकल बिन खाली करके फ़ाइलों को हटाने के लिए,
इस तस्वीर बदल नहीं है. 0s और 1s अपनी हार्ड ड्राइव पर कहीं भी जाना नहीं है.
लेकिन इस मेज, एक तरह के इस छोटे से डेटाबेस, परिवर्तन करता है.
जब आप अपने को फिर से शुरू हटाते हैं, यह है फ़ाइल के रूप में हालांकि कुछ समझ में नष्ट कर दिया है,
लेकिन सभी कंप्यूटर जहां कि बात अपनी हार्ड ड्राइव पर रहता है भूल नहीं है.
0s और 1s कि अपने को फिर से शुरू या इन फ़ाइलों के अन्य किसी भी रचना अभी भी बरकरार हैं.
>> तो अगर आप इस गलती से किया था, वहाँ अभी भी एक गैर शून्य संभावना है
है कि आप अपने डेटा को ठीक Norton उपयोगिताएँ या कुछ वाणिज्यिक सॉफ्टवेयर का उपयोग कर सकते हैं
जीवन में जिसका उद्देश्य 0s और 1s उस तरह का अनाथ किया गया लगता है,
यहाँ भूल लेकिन यहाँ छोड़ दिया है, जिससे कि आप अपने डेटा को वापस प्राप्त कर सकते हैं.
या पुलिस या एफबीआई के साथ फोरेंसिक जांचकर्ताओं वास्तव में एक हार्ड ड्राइव ले जाएगा
और वास्तव में 0s और 1s कि JPEGs की तरह देखो, Excel फ़ाइलों की तरह देखने के पैटर्न के लिए देखो,
और उन्हें इस तरह भले ही कंप्यूटर उन्हें भूल गया है वहाँ ठीक हो जाते हैं.
इतना ही वास्तव में जिस तरह से करने के लिए डेटा को हटाने के लिए, के रूप में हम भविष्य में चर्चा करेंगे,
हाथ धोने या फ़ाइल या हार्ड डिस्क से मिटा है -
आप वास्तव में 0s और 1s छुटकारा नहीं मिल सकता है
क्योंकि अन्यथा आप एक गीगाबाइट हार्ड ड्राइव के साथ शुरू होता है
और आप एक मेगाबाइट हार्ड ड्राइव के साथ अंत में अगर आप लगातार को हटाने थे,
सचमुच 0s और 1s.
तो तुम क्या करना होगा अगर तुम सच में अपने पटरियों को कवर करना चाहता था
और बुनियादी समस्या यह है कि वहाँ अभी भी 0s और 1s डिस्क पर?
मैं gesticulating किसी को देखना है कि आप शारीरिक डिवाइस तोड़ना होगा. यह काम करेगा.
[हँसी] लेकिन है कि यदि एक महंगी समाधान की तरह है, क्या और अधिक उचित होगा?
हाँ. >> [छात्र] उन्हें अधिलेखित. >> उन्हें क्या साथ ओवरराइट करें? >> [छात्र] अन्य डेटा.
अन्य डेटा. तुम बस 0s या 1s या 0s सब, सभी 1s के साथ अपनी डिस्क अधिलेखित कर सकते हैं.
>> और कहा कि वास्तव में सॉफ्टवेयर के कुछ क्या करता है.
आप सॉफ्टवेयर खरीदने के लिए कर सकते हैं या भी मुफ्त सॉफ्टवेयर,
और यहां तक ​​कि मैक ओएस के लिए इन दिनों में बनाया गया है, कम Windows में ऐसा है,
सुरक्षित मिटा करने की क्षमता है.
वास्तव में, अगर तुम आज सभी घर चलाने के लिए चाहते हैं यदि आप एक मैक है और ऐसा करते हैं,
अगर आप अपने कचरे में कुछ सामान मिला है, तो आप सुरक्षित ट्रैश को खाली कर सकते हैं कर सकते हैं,
जो कि वास्तव में करता है.
बस मिटा यहाँ फ़ाइलें बजाय, यह 0s और 1s यहाँ से मिटा नहीं है,
बल्कि, यह सिर्फ उन सब बदलता है, उदाहरण के लिए 0s और डॉट, डॉट, डॉट,.
तो एक अपने भविष्य के psets के वास्तव में जानबूझकर डेटा ठीक हो जाएगा -
तस्वीरें कि हम लोगों, स्थानों, परिसर में और चीजों की लिया है
जिसके लिए हम एक डिजिटल कैमरे के मेमोरी कार्ड की एक फोरेंसिक छवि बना देंगे,
जो सटीक एक ही विचार है - और आप के लिए वास्तव में खोजने के लिए चुनौती दी जा होगा
पैटर्न है जो आपकी हार्ड ड्राइव पर JPEGs का प्रतिनिधित्व करते हैं,
बहुत कि पूर्व छात्र जिसका ईमेल की तरह मैं एक कुछ हफ्ते पहले पढ़ा था
अपनी बहन की फोटो को ठीक करने के लिए.
क्यों नहीं हम एक 5 मिनट का ब्रेक लेने के यहाँ, और हम स्मृति पर अधिक के साथ फिर से इकट्ठा करना होगा.
तो यहाँ जहां चीजें एक छोटे से दिमाग झुकने मिलता है, लेकिन यह एक बहुत शक्तिशाली कदम है
यह सभी को और अधिक समझने की ओर.
यहाँ एक pointers.c कार्यक्रम बुलाया है.
यह आज नमूना कोड के बीच है.
सूचना है कि पहले कुछ लाइनों में, 19 22 के माध्यम से, हम कर रहे हैं GetString की तरह कुछ है
और एक पते लौटने, यह एस में भंडारण.
3 pset के लिए भी आज के बाद यदि आप चाहते हैं लेकिन pset 4 और पर
जहां आप अपने आप से दूर इन प्रशिक्षण के पहियों लेने शुरू कर सकते हैं,
वहाँ कोई बहाना है कि तार अब अस्तित्व के लिए एक कारण है.
यह निश्चित रूप से करने के लिए सिर्फ चार * कह शुरू करने के लिए ठीक है.
>> एक अलग रूप में, ऑनलाइन संदर्भ में और किताबों में आप अक्सर सितारा चर के लिए बगल में देख सकते हैं.
आप भी यह दोनों पक्षों के आसपास रिक्त स्थान देख सकते हैं.
उन सब के सब कार्यात्मक सही हैं.
अभी के लिए, हालांकि, हम इस दृष्टिकोण पर मानकीकरण सुपर स्पष्ट बनाना होगा
कि चार * चरित्र सूचक कह की तरह है.
यह डेटा प्रकार है.
और फिर चर का नाम भी इस मामले में है.
तो हम एक स्ट्रिंग मिल गया है और हम यह कहा जाता है.
और फिर यहाँ नीचे लगता है कि मैं वास्तव में प्रवंचना का एक छोटा सा कर रहा हूँ.
यह सूचक अंकगणित, जो सुपर सरल की तरह है कहा जाता है.
यह बस का अर्थ है जोड़ सकते हैं और संकेत संख्या घटाना.
लेकिन यह वास्तव में काम करता है.
जाहिरा तौर पर इस कार्यक्रम के अंत परिणाम है कि इस तरह के प्रति पंक्ति है स्ट्रिंग 1 चरित्र प्रिंट -
अभी तो हम कहाँ जा रहा है खराब, संकेत कर सकते हैं, चलाने के संकेत, मुझे अंदर ज़ूम
अब मुझे HELLO और प्रकार दर्ज की तरह कुछ में टाइप करते हैं
और यह प्रति पंक्ति 1 चरित्र प्रिंट.
पहले 2, जब तक हम वर्ग कोष्ठक अंकन के साथ ऐसा किया होता.
हम एक पाश के लिए है और हम एस के printf करना चाहते हैं [i] और हम है कि फिर से और फिर से कर सकता हूँ
प्रत्येक पंक्ति के अंत में एक बैकस्लैश n के साथ.
लेकिन इस कार्यक्रम अलग है. इस कार्यक्रम का उपयोग कर रहा है, सचमुच, गणित.
तो क्या हो रहा है यहाँ?
सब से पहले, पहले भी इस पाश निष्पादित करता है, क्या, बस स्पष्ट होना, वास्तव में है?
एस है? >> [छात्र] पता. >> पता.
>> और यह पता हैलो के मामले में है, उस शब्द में 1 चरित्र है, जो ज रहा है.
इतना इस विशिष्ट उदाहरण में है, ज के पते.
तो यह क्या है करना मतलब यह नहीं है मैं +?
खैर, मैं इस में 0 पर पाश के लिए शुरू होता है. हम है कि कई बार किया है.
मैं स्ट्रिंग की लंबाई के लिए जाना है, जाहिरा तौर पर जा रहा है.
तो इस लूप की पहली यात्रा पर, मैं स्पष्ट रूप से 0 है.
तो इस अभिव्यक्ति कह रहा है मैं +, बल्कि एस +0- कि जाहिर है सिर्फ.
तो यहाँ * क्या है?
अब हम एक अलग तरह से स्टार का उपयोग कर रहे हैं.
मुझे आगे जाना है और टी से छुटकारा मिलता है क्योंकि हम टी और एस की प्रतियां के बारे में बात कर रहे हैं.
अब हम सिर्फ एक एस शामिल कहानी बताना चाहता हूँ.
और इसलिए इस पल में, प्रकार स्ट्रिंग होने के बाद, हमारी दुनिया काफी की तरह लग रहा है यह पहले किया था
सिर्फ ज के पते भंडारण और अधिक आम तौर पर स्ट्रिंग में इशारा हैलो साथ.
अगर मैं अब पसंद करते है * एक पंक्ति (s + i), इस बाहर की कोशिश करते हैं.
तो * (मैं +). मुझे इस सरल क्योंकि यह 0 है, तो यह * (0 एस) है.
खैर, एक मिनट रुको. आगे सरल. * (ओं) है.
खैर, अब कोष्ठकों बेवकूफ की तरह कर रहे हैं, तो अब बस करो * चलो.
तो इस लूप डाला है कि लाइन है कि, 26 की पहली यात्रा में,
बहुत ज्यादा इस मुद्रण करने के लिए बराबर है.
* S डेटा प्रकार क्या है?
इस संदर्भ में, क्योंकि स्टार के लिए अपने आप के पास होना होता है,
लेकिन और अधिक विशेष रूप से, क्योंकि हम अब और नहीं की घोषणा कर रहे हैं,
अब हम एक चर नहीं बना रहे हैं, वहाँ 26 लाइन में चार * का कोई जिक्र नहीं है,
वहाँ कीवर्ड स्ट्रिंग का कोई जिक्र नहीं है, हम सिर्फ एक चर कहा जाता है का उपयोग कर रहे हैं,
यह पता चला है अब सितारा थोड़ा अलग है और, बेशक, अर्थ भ्रमित.
* यहाँ मतलब एस और प्रिंट में पता करने के लिए जाने के लिए जो कुछ भी है.
* है, तो यहाँ है Chutes और सीढ़ी की तरह तरह के तीर का पालन - यहाँ.
तो यह * s है.
>> तो क्या 26 लाइन में है कि पाश की पहली यात्रा पर मुद्रित हो जाता है?
मैं बाहर% ग, जो एक चरित्र के लिए प्लेसहोल्डर है मुद्रित करते हैं,
तो एक नई लाइन के लिए एक \ n. * (मैं +) जहां मैं 0 है बस.
तो क्या चार मैं% ग के लिए में जगह? एच.
शायद आप कहाँ जा रहा है देख सकते हैं - पाश की अगली यात्रा में -
अगले चलना मैं स्पष्ट रूप से एक है, तो इसका मतलब यह है एक एस,
और अब तो मैं कोष्ठकों की जरूरत है क्योंकि अब स्टार के लिए कहने की जरूरत है
स्मृति पते एस 1 के लिए जाना.
क्या है? चलो समय में वापस रोल और कहते हैं कि इस तीर अब वास्तव में हमें कोई एहसान नहीं कर रही है.
अधिक विशेष रूप से चलो का कहना है कि यह संख्या 123 है भंडारण
क्योंकि इस स्ट्रिंग की शुरुआत हैलो, यह पता है 123, 124 है, और बहुत आगे है.
तो दूसरी यात्रा पर जब मैं एक कह रहा हूँ, कि एक 123 कह की तरह है,
अन्यथा 124 के रूप में जाना जाता है, तो क्या चार दूसरी यात्रा पर मुद्रित हो जाता है?
स्मृति 124 पते पर ई.
तो फिर +, 125, 126, 127, और इस लूप शुक्र बंद हो जाता है इससे पहले कि हम यहाँ मिल
क्योंकि मैं strlen का उपयोग कर रहा हूँ यकीन है कि मैं बहुत अधिक गिनती नहीं है.
तो यह है कि यह भी है.
फिर, यह है बस के रूप में हालांकि हम एक सप्ताह पहले किया था.
मुझे यह लाइन पर नीचे लिख भले ही हम दोनों नहीं करना चाहती.
अब यह समान है इस के लिए.
>> तो भले ही एस एक स्ट्रिंग है, के रूप में हम सप्ताह के लिए किया गया है यह फोन, वास्तव में एक चार * है.
तो अगर हम सुपर गुदा होना चाहते हैं, तो यह वास्तव में उचित है विशिष्ट चरित्र लिखने
ith इन संख्यात्मक पते और इस स्टार ऑपरेटर का उपयोग कर के स्थान पर,
लेकिन स्पष्ट रूप से, यह सिर्फ इतना क्लीनर है. तो यह बुरा नहीं है.
27 लाइन यहाँ कर रोकने के लिए कोई कारण नहीं है, लेकिन 26 ही कार्यात्मक,
और यह कार्यात्मक वास्तव में कारण है कि हम इस प्रकार अब तक चर्चा कर रहा है के लिए एक ही है.
और अंत में, 29 बस अच्छा अभ्यास है.
एस के मुक्त बुला मतलब है कि अब तुम वापस स्मृति कि GetString तुम्हें दे दिया दे रहे हैं
क्योंकि फिर, सोमवार के रूप में मैंने उल्लेख किया है, सप्ताह के लिए GetString
अपने कोड में एक बग शुरू किया गया है.
सप्ताह के लिए अपने कोड स्मृति लीक किया गया है
आप है जिससे स्मृति के लिए GetString पूछ लेकिन आप यह कभी नहीं किया गया वापस देने.
और कहा कि जानबूझकर हमारे द्वारा pedagogically करने के लिए चुना गया था
क्योंकि यह अभी भी बहुत जल्दी पर के बारे में सोचना है.
लेकिन अब हम अधिक समरूपता की जरूरत है.
यदि आप स्मृति के लिए कंप्यूटर पूछना, रूप में GetString के लिए मामला है,
के रूप में मामला malloc के लिए जाहिरा तौर पर,
अब आप pset 4 आगे के लिए भी मुक्त ऐसे किसी भी स्मृति चाहिए.
Int n कह से अलग है पर ध्यान दें.
आप इस मुक्त करने की जरूरत नहीं क्योंकि आप GetString फोन नहीं किया है
और आप malloc फोन नहीं किया.
>> और अगर आप GetInt बुलाया के रूप में हम अंततः देखेंगे,
GetInt आप के लिए स्मृति का आवंटन नहीं किया है क्योंकि आप वास्तव में चारों ओर integers पारित कर सकते हैं
और मंगाई और घर का काम अभी जिस तरह से हम सप्ताह के लिए कर दिया गया है.
स्ट्रिंग्स, हालांकि, विशेष कर रहे हैं क्योंकि वास्तव में वे कई वर्ण की अभिलाग कर रहे हैं.
तो वे सिर्फ घर का काम और मंगाई और ints से अलग कर रहे हैं और पसंद है.
लेकिन हम है कि लंबे समय से पहले वापस करने के लिए आया हूँ.
संकेत की इस शुरुआत पर कोई सवाल? हाँ.
[अश्राव्य छात्र प्रश्न]
आह, बहुत अच्छा सवाल है.
कुछ चीजें सी वास्तव में आप के लिए करता है, जो सुविधाजनक है,
यह आप के लिए बाहर के आंकड़े क्या आकार डेटा प्रकार की है
और फिर आप के लिए गुणा की उस तरह करता है.
यह घर का काम के मामले में अप्रासंगिक है क्योंकि लगभग हमेशा एक चार 1 बाइट है,
तो यह सिर्फ काम करता है.
लेकिन चर्चा के लिए, यदि आप वास्तव integers मुद्रण कर रहे थे
और तुम बाहर कुछ मूल्य है कि एक पूर्णांक में इशारा किया गया था मुद्रित करने की कोशिश कर रहे थे,
इसी प्रकार आप 4 + करने की जरूरत नहीं * मैं सिर्फ इसलिए कि एक int 4 बाइट्स है.
सूचक गणित का मतलब है कि सी और संकलक आप के लिए सभी कि गणित करते हैं.
आप सभी के बारे में परवाह है मानवीय भावना की तरह में गिनती है. हाँ.
[छात्र] यदि आप एक के अंदर पाश के लिए एक स्ट्रिंग की घोषणा करने के लिए, आप इसे बाद में स्वतंत्र है?
अच्छा सवाल है.
>> यदि आप एक पाश के लिए स्ट्रिंग के अंदर घोषित कर दिया, तो आप इसे बाद में स्वतंत्र है की क्या ज़रूरत है?
आप केवल स्मृति मुक्त करने की जरूरत है है कि आप GetString या malloc के साथ आवंटित.
तो अगर तुम सिर्फ का कहना है कि कुछ पसंद - मुझे घुंघराले ब्रेसिज़ डाल दिया तो अब सभी कोड से संबंधित है.
यदि आप buggily यद्यपि, कुछ इस तरह किया, चार * टी एस =
आप मुक्त टी की जरूरत नहीं है क्योंकि टी malloc या GetString के किसी भी उल्लेख शामिल नहीं किया करते.
इसके विपरीत यदि आप इस किया, GetString, तो हाँ, आप मुक्त टी की आवश्यकता होगी.
और वास्तव में, अपने ही है कि करने का मौका इस लूप के अंदर अब दायरे से ही जारी करने के लिए है,
कि हम अतीत में चर्चा की है.
अन्यथा आप स्मृति का आवंटन होगी, स्मृति आवंटन, स्मृति आवंटन
और कार्यक्रम के अंत में, क्योंकि आप कि लूप के बाहर हो,
t मौजूद नहीं है, लेकिन आप कभी नहीं बताया ऑपरेटिंग सिस्टम
कि आपको लगता है कि स्मृति अब जरूरत नहीं है.
और 4 या 5 pset के लिए लंबे समय से पहले, हम आपको एक वेलग्रिंड नामक कार्यक्रम के साथ लैस हूँ,
जो आत्मा में GDB के लिए इसी तरह की है कि यह कुछ हद तक एक रहस्यमय इंटरफ़ेस का मिल गया है,
लेकिन जीवन में अपने उद्देश्य के लिए आप मदद करने के लिए है.
और वेलग्रिंड एक प्रोग्राम है कि भविष्य में अपने कार्यक्रमों की खोज करेंगे
स्मृति लीक के लिए देख रहे हैं, चाहे GetString या malloc से,
जो हम सभी को और अधिक का उपयोग कर के रूप में हम के रूप में ज्यादा CS50 पुस्तकालय का उपयोग करना बंद कर देते हैं शुरू करेंगे.
हम अंत में अब शब्दावली की तरह और सिद्धांत में मानसिक मॉडल की तरह है
जिसके साथ इस टूटे हुए कार्यक्रम को हल करने के लिए.
>> तो, इस टूटे हुए कार्यक्रम में स्वैप स्वैप के अंदर काम करता है,
लेकिन यह मुख्य में वास्तव में काम नहीं किया है क्योंकि एक्स और वाई, याद में मुख्य पारित कर दिया है,
और उन में मूल्यों द्वारा पारित किए गए, तो बात करने के लिए.
उन की प्रतियां को स्वैप करने के लिए दिए गए थे.
स्वैप के अंत तक एक और ख वास्तव में विमर्श किया गया था,
लेकिन निश्चित रूप से एक्स और वाई, के रूप में हम सोमवार को चर्चा की, नहीं किया गया था.
इसलिए मैं हरे रंग में प्रस्ताव है कि यह वास्तव में यहाँ समाधान है.
और वास्तव में, मुझे मेरे सितारे चाल बस अनुरूप होना
हालांकि, फिर से, कार्यात्मक यह कोई फर्क नहीं करता है.
भविष्य हफ्तों में हम कब और क्यों यह बात करता है समझाता हूँ.
तो अब हरे रंग में एक समाधान है.
सच कहूँ तो, यह एक पूरी बहुत messier लग रहा है क्योंकि मैं इन सितारों के सभी है.
मुझे एक बात बिंदु.
शीर्ष पंक्ति यहाँ जहाँ यह कहते हैं int * एक और int ख *
मौलिक रूप से एक ही बात कर के रूप में यह हमेशा किया है.
यह 2 तर्क या पैरामीटर की घोषणा को स्वैप करने के लिए,
जो पहले के एक int सूचक है कहा जाता है,
जिनमें से 2 एक int ख बुलाया सूचक है.
केवल एक चीज है कि इस बिंदु पर नए तथ्य यह है कि वहाँ एक स्टार है.
>> इसका क्या मतलब है? एक एक int नहीं है, ख एक int नहीं है.
एक एक int के पते और बी एक अलग int के पता है.
यहाँ नीचे, यह है जहां मैं मानता हूँ सी भ्रमित हो जाता है.
अब हम एक स्टार का उपयोग कर रहे हैं, लेकिन यह इस संदर्भ में अलग - अलग अर्थ है.
क्योंकि हम संकेत की घोषणा नहीं कर के रूप में हम यहाँ हैं कर रहे हैं,
यहाँ हम चीजों dereferencing कर रहे हैं.
तकनीकी रूप से तो, स्वैप के अंदर 1, 2, और 3 लाइन के इस संदर्भ में स्टार
भिन्नता ऑपरेटर, जो बस का अर्थ है वहाँ जाओ.
तो बस के रूप में मेरी उंगली घंटे के लिए तीर का पालन किया है,
* एक का मतलब है कि पता करने के लिए जाना है और मुझे int है कि वहाँ है.
* ख का मतलब है पता करने के लिए जाने के लिए और मेरे पास क्या है.
तो चलो सोमवार अब एक तख्ते के ढेर का उपयोग करने से तस्वीर redraw,
के नीचे एक मुख्य होने जा रहा है,
जो के ऊपरी एक स्वैप होने जा रहा है,
तो यह है कि हमारी दुनिया सोमवार तरह दिखता है, इस तरह,.
यहाँ स्मृति का एक हिस्सा है कि मुख्य उपयोग करने के लिए जा रहा है.
>> सोमवार से याद है कि इस कार्यक्रम सिर्फ 2 चर था,
एक एक्स और एक y बुलाया कहा जाता है, और मैं संख्या 1 और 2 डाल दिया था.
अब जब मैं कॉल की तरह स्वैप मैं सोमवार को किया था,
पहले जब मैं इस कार्यक्रम के लाल संस्करण का इस्तेमाल किया है, जो इस तरह दिखता है,
मैं 2 पैरामीटर, ए और बी है, और हम यहाँ और यहाँ क्या लिखा था?
बस 1 और 2, सचमुच एक्स और वाई की प्रतियां.
आज हम बदल जाते हैं.
आज ints में पारित करने के बजाय एक और ख हम 2 पतों में पारित करने के लिए जा रहे हैं.
उन पतों ints करने के लिए बात करने के लिए हो सकता है, लेकिन उन पतों खुद ints नहीं कर रहे हैं.
वे पते हैं. यह बजाय एक डाक पते की तरह है.
तो अब हम सिर्फ अपने आप को स्क्रीन पर एक छोटे से अधिक विस्तार देने की जरूरत है.
यह मेरे कंप्यूटर की स्मृति के रूप में यह सब दिन हो गया है.
अब हम कुछ मनमाने ढंग से नंबर योजना की जरूरत है.
तो चलो बस कहना है, संयोग से, कि इस स्मृति पता 123, 124 है.
चलो बस का कहना है कि यह 125 है, यह 126 है, और बहुत आगे है, लेकिन यह है कि पूरी तरह से मनमाना है.
हम सिर्फ मेरी स्मृति में कुछ नंबर योजना की जरूरत है.
तो अब जब मैं वास्तव में एक्स और वाई में गुजरती हैं, मैं एक्स और वाई में पारित करने के लिए नहीं जा रहा हूँ;
मैं x और y के डाक पते में इतनी बात करने के लिए, पारित करने के लिए जा रहा हूँ
तो क्या हो जाता है यहाँ और यहाँ संग्रहीत 1 और 2 नहीं है कि,
लेकिन अगर आप अपने छोटे पाठ देख सकते हैं, यहाँ और यहाँ में पारित हो जाता है?
[अश्राव्य छात्र प्रतिक्रिया] वास्तव में. >> 123 यहाँ डाल दिया जाता है और 124 यहाँ डाल दिया जाता है.
>> अब, क्योंकि मैं यह बहुत पहले लाइन अप यहाँ रास्ते में शीर्ष पर स्टार का उपयोग किया है,
मेरे कार्यक्रम बस है कि 123 और 124 जानता है, भले ही वे स्पष्ट रूप से कर रहे हैं integers
कि किसी भी मानव नोटिस सकता है, वे पते, संख्यात्मक पते के रूप में व्याख्या की जानी चाहिए.
वे में और खुद को ints नहीं हैं, वे पते हो,
और है कि क्योंकि मैं स्पष्ट रूप से सितारों वहाँ डाल दिया.
तो अब मेरे वास्तविक कोड है कि यहाँ क्या होता है की 1, 2, और 3 लाइन में?
चलो चित्र के बाकी आकर्षित.
Tmp की तरह है यह सोमवार को किया गया था. Tmp के बारे में कुछ खास नहीं है.
यह सिर्फ एक स्थानीय 32 बिट परिवर्तनशील है, और के अंदर है कि मैं जाहिरा तौर पर * एक के मूल्य भंडारण हूँ.
अब, अगर मैं सिर्फ इतना कहा tmp = एक, मैं यहाँ क्या रखा जाएगा? >> [छात्र] 123.
123. लेकिन नहीं है कि मैं क्या कर रहा हूँ.
मैं कह रहा हूँ tmp = * एक. स्टार का मतलब है वहाँ जाओ.
तो यहाँ एक है, 123. मैं वहाँ कैसे जाना है? नाटक की तरह एक तीर है.
खैर, यह है, 1. तो tmp में जमा हो जाता है, जाहिरा तौर पर? बस 1.
तो दूसरे शब्दों में, tmp * एक * एक साधन है पता है कि एक वर्तमान में है,
जो कि जाहिरा तौर पर 123 है.
>> ठीक है, यहाँ हम 123 स्थान पर हैं, मैं 1 संख्या देखते हैं,
तो मैं 1 संख्या वहाँ रखा जा रहा हूँ.
अब मैं क्या 2 लाइन में करते हैं, * एक = ख *?
यह एक एक छोटे से अधिक शामिल है, क्योंकि अब एक क्या है? यह 123 है.
तो * एक कहाँ है? सही है, जहां मैं पहले था. तो वहाँ जाओ. ठीक है.
अब, अंत में, और फिर अंत में यह समझ बनाने के लिए शुरू करने के लिए, उम्मीद है,
* ख मतलब क्या ख में है? 124. तो मुझे वहाँ जाने की जरूरत है, जो 2 है.
तो क्या मैं कहाँ रखा है?
2 यहाँ में चला जाता है, क्योंकि * ख * एक में चला जाता है. तो मैं ऐसा करूँगा.
और आप पहले से ही देखते हैं, शायद कर सकते हैं, कि हम इतना करीब हो
इस बेवकूफ, सरल समस्या को हल करने के लिए पहली बार के लिए सही ढंग से
क्योंकि अब हम अभी भी एक्स क्या था की एक याद है,
हम 2 प्रतियां है, वैसे y के,
लेकिन अब लाइन 3 * ख कहते हैं.
तो यहाँ ख है. * ख का मतलब है वहाँ जाओ. इसलिए जहां स्थान 124 है?
जाहिरा तौर पर यह यहाँ है. तो मैं यहाँ क्या रखा है? जाहिर है, tmp.
तो अब मैं यह कर. इसलिए मैं यहाँ 1 और 2 यहाँ है.
और अब क्या यह सब, 123, 124, और 1 के बारे में?
के रूप में जल्द ही स्वैप रिटर्न के रूप में, इस स्मृति के रूप में अच्छा के रूप में खो दिया है
क्योंकि स्वैप रिटर्न, ऑपरेटिंग सिस्टम के रूप में के रूप में जल्द ही
भविष्य में उस स्मृति को फिर से उपयोग करने के लिए स्वतंत्र है.
चारों ओर केवल इस तथाकथित ढेर के नीचे मुख्य स्मृति चिपक जाती है.
>> और इसलिए हम अंत में अब एक काम संस्करण है.
मुझे swap.c में जाओ, और निम्नलिखित नोटिस.
कार्यक्रम के शीर्ष पर मैं अपने प्रोटोटाइप के लिए बदल दिया है int * एक और int * ख.
केवल एक चीज मैं से हरे रंग लाल, जो बुरा था, जो अच्छा है जाने बदल तो,
मैं आज इन सितारों जोड़ा.
लेकिन फिर नीचे में यहाँ ही स्वैप मैं नकल करने के लिए किया था, पेस्ट क्या स्लाइड पर बस गया था.
यहाँ सितारा, मैं यहाँ एक सितारा है कि प्रोटोटाइप से मेल खाता है -
और फिर इन सब बातों के अब tmp के अलावा तारों है
एक अस्थायी चर का उपयोग करें, क्योंकि वहाँ कोई नई बात नहीं है.
मैं सिर्फ एक int के लिए अस्थायी भंडारण की जरूरत है.
तो हम वहाँ एक स्टार की जरूरत नहीं है.
हम सिर्फ स्टार की जरूरत है ताकि हम मनमाने ढंग से सीमा के इस तरह पार कर सकते हैं
अपने कंप्यूटर की स्मृति में इन 2 फ्रेम के बीच.
लेकिन एक आखिरी बात करने के लिए बदल गया है, और आप इसे झलक है हो सकता है पहले से ही है.
क्या दूसरी लाइन अब स्पष्ट रूप से अलग है? >> [छात्र] और एक्स.
>> हाँ, इतना 25 कोड की अंतिम पंक्ति मैं इस के लिए बदलने के काम करने की जरूरत है.
एक सप्ताह पहले और यहां तक ​​कि सोमवार को 25 रेखा इस तरह देखा, एक्स और वाई स्वैप
और यह सिर्फ टूट गया था क्योंकि अगर आप कहते हैं कि स्वैप (एक्स, वाई)
एक्स और वाई की प्रतियां को स्वैप करने के लिए दे रहे हैं, तो अपनी बात कर रहा है,
लेकिन आप वास्तव में एक्स और y ही कभी नहीं बदल रहे हैं.
तो भी अगर आप कोड में एम्परसेंड के साथ इस चरित्र कभी नहीं देखा है पहले,
बस एक अनुमान ले. एम्परसेंड क्या करता है, जाहिरा तौर पर करते हैं?
[छात्र] पते लेता है. >> पते लेता है.
तो एम्परसेंड कह रहा है मुझे एक्स के पते दे.
कौन जानता है कि वह कहाँ है? यह 123 होना होता है. मुझे परवाह नहीं है. बस मुझे एक्स के पते दे.
और y मुझे y के पते दे मतलब है.
और कहानी पूरी तरह से चित्र के साथ संगत है कि बिंदु पर हम एक पल पहले आकर्षित किया.
>> तो मैं संकेत मानता है, निश्चित रूप से मेरे लिए, जब मैं पहली बार इस सीखने शुरू कर दिया है,
निश्चित रूप से मुश्किल बातें मेरे मन के चारों ओर लपेट में से एक थे.
लेकिन एहसास है, खासकर के रूप में हम इन चीजों की तरह साथ खेलते रहना,
अगर आप इन सुपर सरल प्रकार के लिए नीचे तोड़ने के बौद्धिक समस्याओं शुष्क
सिर्फ संख्या के आसपास चलती है, संकेत के साथ भ्रम की एक बहुत कुछ करने के लिए जवाब
वास्तव में ये बहुत बुनियादी यांत्रिकी से प्राप्त किया जा सकता है.
यहाँ एक पता है. स्टार के साथ वहाँ जाओ.
या इसके विपरीत, यहाँ एक एम्परसेंड है. चित्रा बाहर वास्तव में क्या पता है.
सही सभी.
तो इस स्मृति के सभी कहाँ से आ रहा है?
हम समय की एक जोड़ी इस तस्वीर तैयार की है, और मैं वादा रखने के लिए हम इसे वापस करने के लिए आया हूँ,
लेकिन यहाँ अपने कंप्यूटर की स्मृति का प्रतिनिधित्व है
कि एक छोटे से हमारे चॉकबोर्ड से लेबल यहाँ और अधिक है.
अपने कार्यक्रम के लिए सम्मान के साथ शीर्ष पर पाठ खंड का प्रतिनिधित्व करता है?
[अश्राव्य छात्र प्रतिक्रिया] क्षमा करें? >> फिर से कहो.
[छात्र] वास्तविक कार्यक्रम. >> वास्तविक कार्यक्रम.
>> तो 0s और 1s कि आप सी कोड लिखने के बाद संकलित किया है और फिर चल बजना
और 0s और 1s समाप्त होता है वहाँ स्मृति में tucked हो रही है
क्योंकि जब आप डबल अपने मैक या पीसी पर एक आइकन पर क्लिक करें
या आपके शीघ्र मारियो की तरह एक कमांड चलाने के लिए, अपने 0s और 1s डिस्क से
स्मृति में लोड इतना है कि कंप्यूटर उन्हें हेरफेर कर सकते
और उन्हें और अधिक जल्दी निष्पादित.
तो initialized डेटा और uninitialized डेटा, हम उन लोगों के बारे में बात नहीं होगा,
लेकिन उन सिर्फ वैश्विक चर रहे हैं.
प्रारंभिकीकरण वैश्विक चर का मतलब है कि आप मूल्यों को दे दिया है;
uninitialized वैश्विक चर का मतलब है कि आपने अभी तक मूल्यों को नहीं दिया था.
तो फिर वहाँ इन वातावरण चर जो मैं पूरी तरह से मेरे हाथ की लहर है,
लेकिन वे वहाँ हैं और है कि अपने उपयोगकर्ता नाम की तरह दुकानों बातें
और निचले स्तर के विवरण के अन्य प्रकार.
लेकिन अपने स्मृति लेआउट के juiciest टुकड़े इस बात ढेर और ढेर कहा जाता है.
फिर ढेर करने के लिए स्पष्ट हो, स्मृति है कि जब भी कार्य कहा जाता है प्रयोग किया जाता है,
जब वहाँ स्थानीय चर
और वहाँ मानकों जब भी आसपास हैं पारित किया जा रहा है.
कि सब के सब ढेर में होता है.
ढेर के बारे में हम बात नहीं की है, लेकिन एक अनुमान है जो ढेर का उपयोग करता है.
बस स्मृति का एक अलग हिस्सा है.
यह यहाँ शीर्ष पर तैयार किया जाना होता है, लेकिन है कि एक मनमाना सचित्र सम्मेलन है.
कौन ढेर से जाहिरा तौर पर किया गया है सप्ताह के लिए स्मृति का उपयोग कर रहे हैं?
यह तकनीकी रूप से है, लेकिन आप परोक्ष रूप से. >> [छात्र] GetString.
GetString और malloc. तो यहाँ बुनियादी फर्क है.
>> पिछले कुछ हफ्तों के लिए आप जानते हैं कि अगर आप स्मृति की जरूरत है, बस एक चर घोषणा.
यदि आप स्मृति की बहुत जरूरत है, तो एक सही अपने कार्य के अंदर सरणी की घोषणा.
लेकिन समस्या है जिसका हम सामना कर रखा है अगर आप चर स्थानीय कार्यों की अंदर की घोषणा,
के रूप में जल्द ही समारोह रिटर्न के रूप में, स्मृति और उन चर क्या होता है?
बस यह की तरह नहीं रह गया है तुम्हारा, है ना? यह धारणात्मक की तरह गायब हो जाता है.
यह अभी भी शारीरिक रूप से वहाँ है, जाहिर है, लेकिन यह अब अपने उपयोग करने का अधिकार है.
यह स्पष्ट रूप से समस्याग्रस्त है अगर आप जीवन में कार्य लिखने के लिए चाहते हैं
कि वास्तव में स्मृति आवंटित और वापस दे इसे तुरंत नहीं.
बिन्दु में प्रकरण: जीवन में है GetString उद्देश्य के लिए अग्रिम में कोई विचार है
कैसे मैं कीबोर्ड पर टाइप करने के लिए जा रहा हूँ एक स्ट्रिंग के बड़े,
लेकिन यह स्मृति आवंटित दाऊद या नमस्ते पकड़ करने में सक्षम हो गया है
या एक पूरी निबंध कि उपयोगकर्ता अंदर टाइप किया सकता है
तो GetString malloc का उपयोग किया गया.
Malloc इसलिए ढेर नहीं का उपयोग किया जाना चाहिए;
बजाय यह इस बात ढेर कहा जाता है का उपयोग कर रहा है.
स्मृति के बारे में अलग कुछ नहीं है. यह तेजी से धीमी है या नहीं या ऐसा कुछ है.
यह एक अलग स्थान में सिर्फ शारीरिक रूप से है.
>> लेकिन नियम है कि स्मृति कि ढेर पर आवंटित है
कभी नहीं लिया जाएगा आप से दूर जब तक आप कहते हैं - एक अनुमान ले - मुक्त.
इसके विपरीत करके, किसी भी स्मृति आप सिर्फ एक सरणी की घोषणा के द्वारा ढेर पर के लिए पूछना
या एक चर घोषित करने जैसे हम सप्ताह के लिए कर दिया गया है,
जो मूलभूत रूप से ढेर पर समाप्त होता है.
और उस समय के 90% काम करता है, लेकिन उन दुर्लभ अवसरों पर
जहाँ आप के लिए स्मृति आवंटित करने के लिए और इसे रखने के आसपास चाहते हैं,
तो आप malloc तरह एक समारोह का उपयोग करने की आवश्यकता है.
या हम GetString, जो बारी में malloc का उपयोग करता है जैसे एक समारोह का इस्तेमाल किया.
चलो देखते हैं जहां यह नीचे तोड़ने के लिए और फिर हो सकता Binky पर एक तिरछी नज़र रखना.
हम भविष्य में वापस कि करने के लिए आया हूँ.
यहाँ एक सुपर सरल कार्यक्रम है कि पहले 2 लाइनों में क्या करता है?
अंग्रेजी में, कोड के इन पहले 2 लाइनों के अंदर क्या करते हो के मुख्य?
[अश्राव्य छात्र प्रतिक्रिया]
सावधान. यह मेरे एक्स या वाई के पते देना नहीं है.
[छात्र] ints के लिए संकेत देता है. >> अच्छा है. मुझे पूर्णांकों 2 संकेत दे.
दूसरे शब्दों में, मुझे स्मृति के 2 हिस्सा है कि मैं आज ड्राइंग रखने देने के लिए,
हालांकि मैं इसे अब वर्गों के रूप में काट दिया था.
मुझे स्मृति के 2 विखंडू दे, एक एक्स कहा जाता है, एक y कहा जाता है -
पहले मैं उन्हें एस और टी कहा जाता है - और स्मृति की है कि हिस्सा के प्रकार क्या है?
यह एक पते की दुकान करने के लिए जा रहा है.
यह int * प्रकार की है.
>> तो एक int के पते अंततः x में रहते हैं,
एक int के पते के अंत में y में रहते हैं,
लेकिन शुरू में एक्स और वाई के अंदर क्या है? कौन जानता है? कचरा मान.
यह संकेत के साथ कोई लेना - देना नहीं है.
यदि हम वहाँ कुछ है, जो जानता है कि क्या वास्तव में वहाँ है नहीं डाल दिया है?
अब एक्स. यहाँ क्या होता है? अब यह कानूनी है क्योंकि x एक सूचक है. यह एक int * है.
तो इसका मतलब है कि मैं एक्स में स्मृति में से कुछ हिस्सा का पता लगा सकते हैं.
Malloc क्या वापस नहीं करता है? बिल्कुल सही, यह पते देता है,
स्मृति की एक पूरी हिस्सा में पहली बाइट के पते.
कितने बाइट जाहिरा तौर पर इस उदाहरण के लिए आवंटन, उपकरण में?
एक int के आकार क्या है? 4.
यदि आप एक सप्ताह के लिए वापस लगता है, यह सुपर महत्वपूर्ण नहीं है हमेशा याद रखें कि,
लेकिन इस मामले में यह पता करने के लिए उपयोगी है, 4 बाइट्स.
तो यह ढेर 4 बाइट्स पर आवंटन है
और यह मेरे लिए पहले एक का पता मनमाने ढंग से वापस लौट रही है.
अब, एक्स क्या कर रहा है?
एक * x 42 = क्या कर रहा है?
यदि कहानी में इस बिंदु पर हम एक्स, जो कुछ कचरा मूल्य के साथ इस तरह दिखता है,
अब यह कुछ कचरा मूल्य के साथ y, 3 लाइन में अब मैं 4 बाइट्स आवंटित है.
इस तस्वीर को अनिवार्य रूप से इस तरह दिखता है.
या अधिक विशेष रूप से, अगर यह मनमाना 123 पता है, यह है कि क्या हमारी कहानी अब की तरह दिखता है.
* X 42 = अब क्या मतलब है? इसका मतलब है कि पते 123 जाओ और संख्या 42 वहाँ डाल दिया.
मैं इन लाइनों आकर्षित करने की जरूरत नहीं है क्योंकि हम तार नहीं कर रहे हैं.
>> मैं सिर्फ इस तरह करना चाहिए यह लिखा है, और सिर्फ प्रदर्शन खातिर,
42 एक int तरह के रूप में अंतरिक्ष के एक बहुत लेता है, 4 बाइट्स.
तो है कि वहाँ क्या हुआ है, लेकिन अब वहाँ एक समस्या है.
* Y = 13. यहाँ क्या होने जा रहा है?
समस्या * y हमारे सरलीकृत दुनिया में है बस का अर्थ है y में पता करने के लिए जाना है.
Y में क्या है? यह कुछ कचरा मान है.
तो चलो मान लेते हैं कि कि कचरा मूल्य 5551212 है, ऐसा कुछ पागल.
* Y मतलब के लिए 5551212 को संबोधित जाओ.
कि यहाँ की तरह है. यह उदाहरण के लिए मौजूद नहीं है.
तो * y 13 का मतलब है मैं 13 यहाँ आकर्षित करने की कोशिश कर रहा हूँ हो जाता है. यह अस्तित्व में नहीं है.
मैं ब्लैकबोर्ड के खंड को पार कर लिया है. मुझे क्या मिलेगा?
क्योंकि मैं स्मृति में डालने की कोशिश कर रहा हूँ कि गुप्त संदेश में विभाजन गलती
एक जगह है कि अस्तित्व में नहीं है पर 13 की तरह एक मूल्य.
इस कार्यक्रम के बाकी ठीक है, लेकिन उस बिंदु यह नहीं है जब तक काम कर सकते हैं.
तो चलो इस कहानी बताने की कोशिश.
हम वापस एक बार हम हेक्स के बारे में बात की है कि करने के लिए आया हूँ.
चलो यह करने के लिए वापस जाने और इस Binky बुलाया बात के साथ समाप्त
याद जो एक स्टैनफोर्ड प्रोफेसर के घर पर बैठे claymation साथ खेल है,
वास्तव में है कि एक ही कार्यक्रम की कहानी बताओ.
यह बस के बारे में 3 मिनट तक. यहाँ हम Binky है.
[वीडियो पर पुरुष वक्ता] हे Binky, उठो. यह सूचक मज़ा के लिए समय है.
[Binky] वह क्या है? संकेत के बारे में जानें? ओह, वाह!
[पुरुष वक्ता खैर, शुरू करने के लिए, मुझे लगता है कि हम एक जोड़े संकेत की जरूरत के लिए जा रहे हैं.
>> [Binky] ठीक है. यह कोड 2 संकेत जो integers के लिए बात कर सकते हैं आवंटित.
[पुरुष वक्ता] ठीक है. खैर, मैं 2 संकेत देखते हैं, लेकिन वे कुछ भी करने के लिए ओर इशारा करते हो ऐसा नहीं लगता.
[Binky] यह सही है. प्रारंभ में, संकेत कुछ भी करने के लिए बात नहीं है.
बातें वे करने के लिए बिंदु pointees कहा जाता है, और उन्हें स्थापित करने में एक अलग कदम है.
[पुरुष वक्ता ओह, सही, सही है. मुझे पता था. pointees अलग हैं.
एर, तो आप कैसे एक pointee आवंटित?
[Binky] ठीक है. इस कोड को एक नई पूर्णांक pointee आबंटित करता है, और इस भाग x यह करने के लिए बात करने के लिए सेट है.
[पुरुष वक्ता] हे, कि बेहतर लग रहा है.
तो इसे बनाने के लिए कुछ करना है. >> [Binky] ठीक है.
मैं सूचक x भिन्नता अपने pointee में 42 नंबर की दुकान.
इस चाल के लिए मैं अपने dereferencing के जादू की छड़ी की आवश्यकता होगी.
[पुरुष वक्ता] अपने अपसंदर्भन के जादू की छड़ी? यह बहुत अच्छा है.
[Binky] इस कोड की तरह दिखता है. मैं सिर्फ संख्या निर्धारित करेंगे और ... [ध्वनि popping]
[पुरुष वक्ता] हे, देखो, यह हो जाता है.
तो एक्स पर एक भिन्नता कर तीर अपने pointee का उपयोग करने के लिए इस प्रकार है,
इस मामले में 42 स्टोर करने के लिए.
अरे, यह अन्य सूचक, y के माध्यम से 13 नंबर की दुकान का उपयोग करने के लिए प्रयास करें.
[Binky] ठीक है. मैं बस यहाँ जाऊँगा y करने के लिए और 13 नंबर की स्थापना की
और तो dereferencing और बस की छड़ी ले ... [आवाज गूंज] वाह!
[पुरुष वक्ता] हे हे, कि काम नहीं किया.
>> कहो, Binky, मुझे नहीं लगता कि y अपसंदर्भन एक अच्छा विचार है
क्योंकि ऊपर pointee की स्थापना के लिए एक अलग कदम है
और मुझे नहीं लगता कि हम कभी भी यह किया है.
[Binky] हम्म, अच्छी बात है.
[पुरुष वक्ता] हाँ. हम सूचक y आवंटित लेकिन हम सेट एक pointee की बात यह कभी नहीं.
[Binky] हम्म, बहुत चौकस है.
[पुरुष वक्ता अरे, आप अच्छा देख रहे हैं वहाँ, Binky.
आप इसे ठीक कर सकते हैं इतना है कि एक्स के रूप में एक ही pointee y अंक? >> [Binky] ज़रूर.
मैं अपने सूचक काम के जादू की छड़ी का उपयोग करेंगे.
[पुरुष वक्ता] है कि पहले की तरह एक समस्या हो रहा है?
[Binky] नहीं, इस pointees स्पर्श नहीं करता है.
यह सिर्फ एक सूचक परिवर्तन करने के लिए एक के रूप में एक ही बात करने के लिए बात है. [ध्वनि popping]
[पुरुष वक्ता] ओह, मैं देख रहा हूँ. अब एक्स के रूप में एक ही जगह के लिए y अंक.
तो इंतजार. अब y तय हो गई है. यह एक pointee है.
तो तुम फिर dereferencing 13 पर भेजने की छड़ी की कोशिश कर सकते हैं.
[Binky] उह, ठीक है. यहाँ जाता है. [ध्वनि popping]
[पुरुष वक्ता] अरे, कि देखो. अब अपसंदर्भन y पर काम करता है.
और क्योंकि संकेत है कि एक pointee साझा कर रहे हैं, वे दोनों 13 देखते हैं.
[Binky] हाँ, साझा. जो भी हो.
>> तो हम स्थानों अब स्विच करने के लिए जा रहे हैं?
[पुरुष वक्ता] ओह, देखो, हम समय से बाहर रहे. >> [Binky] लेकिन -
[पुरुष वक्ता] बस 3 सूचक नियमों को याद रखें.
नंबर 1, बुनियादी संरचना है कि आप एक सूचक है और यह एक pointee अधिक अंक.
लेकिन सूचक और pointee अलग कर रहे हैं, और आम त्रुटि के लिए एक सूचक है
लेकिन यह एक pointee देना भूल जाते हैं.
नंबर 2, सूचक dereferencing सूचक में शुरू होता है और अधिक से अधिक अपने तीर के बाद
अपने pointee का उपयोग.
जैसा कि हम जानते हैं कि सभी, यह केवल काम करता है अगर वहाँ एक pointee है,
जो की तरह वापस हो जाता है के लिए नंबर 1 पर राज.
नंबर 3, सूचक काम एक सूचक लेता है और यह परिवर्तन
एक और सूचक के रूप में एक ही pointee बात.
तो असाइनमेंट के बाद, 2 संकेत pointee ही बात करेंगे.
कभी कभी कि साझा कहा जाता है.
>> और कहा कि सब वहाँ यह सच है. अब अलविदा.
यह Binky है. यह CS50 है. हम अगले सप्ताह आप देखेंगे. [वाहवाही]
>> [CS50.TV]