[Powered by Google Translate] [धारा 4 - और अधिक आरामदायक]
[रोब Bowden - हार्वर्ड विश्वविद्यालय]
[यह CS50 है. - CS50.TV]
हम एक प्रश्नोत्तरी कल है, मामले में आप लोगों को पता नहीं था.
यह मूल रूप से सब कुछ आप कक्षा में देखा है सकते हैं या कक्षा में देखा जाना चाहिए पर है.
कि संकेत शामिल हैं, भले ही वे एक बहुत ही हाल के विषय रहे हैं.
आप कम से कम उनमें से उच्च स्तर को समझना चाहिए.
कुछ भी है कि कक्षा में चला गया था आप प्रश्नोत्तरी के लिए समझना चाहिए.
तो अगर आप उन पर सवाल है, तो आप उन्हें अब पूछ सकते हैं.
लेकिन यह करने के लिए एक छात्र के नेतृत्व वाली बहुत सत्र होने जा रहा है, जहां तुम लोगों को सवालों के पूछने,
इसलिए उम्मीद है कि लोगों को सवाल है.
क्या कोई सवाल है?
हां. >> [छात्र] आप संकेत पर फिर से जा सकते हैं?
मैं संकेत पर जायेंगे.
अपने चर के सभी जरूरी स्मृति में रहते हैं,
लेकिन आम तौर पर आप उस के बारे में चिंता नहीं है और आप बस कहना है कि एक्स + 2 और y + 3
और संकलक बाहर आंकड़ा जहां चीजें आप के लिए रह रहे हैं.
एक बार जब आप संकेत के साथ काम कर रहे हैं, अब आप स्पष्ट रूप से उन स्मृति पते का उपयोग कर रहे हैं.
तो एक चर ही कभी किसी भी समय में एक ही पते पर रह जाएगा.
अगर हम एक सूचक की घोषणा करना चाहते हैं, क्या प्रकार की तरह लग रहा है?
>> मैं एक सूचक पी की घोषणा करना चाहते हैं. किस प्रकार की तरह दिखता है?
[छात्र] int * p. >> हाँ. तो int * p.
और मैं कैसे कर सकता हूँ यह एक्स के लिए बात? >> [छात्र] एम्परसेंड.
[Bowden] तो सचमुच एम्परसेंड ऑपरेटर का पता कहा जाता है.
तो जब मैं कहता हूँ और एक्स चर x की स्मृति पता हो रही है.
तो अब मैं सूचक पी है, और कहीं भी अपने कोड में मैं * पी का उपयोग कर सकते हैं
या मैं एक्स का उपयोग करें और यह सटीक एक ही बात हो जाएगा सकता है.
(पी *). यह क्या कर रही है? उस स्टार का क्या मतलब है?
[छात्र] यह उस बिंदु पर एक मूल्य का मतलब है. >> हाँ.
तो अगर हम इसे देखो, यह बहुत उपयोगी हो सकता है बाहर चित्र आकर्षित कर सकते हैं
जहां इस एक्स के लिए एक स्मृति के छोटे से बॉक्स है, जो 4 मूल्य होता है,
तो हम पी के लिए एक स्मृति के एक छोटे से बॉक्स है,
और तो एक्स के लिए पी अंक, तो हम एक्स पी से एक तीर आकर्षित.
तो जब हम कहते हैं * पी हम कह रहे हैं बॉक्स है कि पी है.
स्टार तीर का पालन करने के लिए है और फिर भी आप सही है कि बॉक्स के साथ वहाँ चाहते हैं.
इसलिए मैं कह सकता हूँ * = 7 पी, और कि बॉक्स कि एक्स और कि 7 से परिवर्तन करने के लिए जाना जाएगा.
या मैं कह सकता int z = * 2; p यह भ्रामक है, क्योंकि यह सितारा सितारा,.
एक सितारा पी dereferencing है, अन्य सितारा 2 से गुणा है.
सूचना है मैं बस के रूप में अच्छी तरह से एक्स के साथ * पी की जगह हो सकता है.
आप उन्हें उसी तरह का उपयोग कर सकते हैं.
और फिर मैं बाद में एक पूरी तरह से नई बात पी बिंदु हो सकता है.
मैं सिर्फ कह सकते हैं p = &z;
तो अब एक्स के लिए अब अंक पी, यह Z करने के लिए कहते हैं.
और यह किसी भी समय मैं * पी z कर के रूप में एक ही है.
तो इस बारे में उपयोगी बात यह है कि एक बार हम कार्यों में शुरू हो रही है.
>> यह बेकार की तरह करने के लिए एक सूचक है कि अंक की घोषणा करने के लिए कुछ करने के लिए
और फिर तुम सिर्फ यह dereferencing कर रहे हैं
जब आप मूल चर इस्तेमाल किया जा सकता है के साथ शुरू.
लेकिन जब आप कार्यों में मिलता है तो हम कहते हैं कि हम कुछ समारोह, int foo है,
कि एक सूचक लेता है और सिर्फ * p = 6 करता;
जैसे हम पहले स्वैप के साथ देखा था, आप एक प्रभावी स्वैप और एक अलग समारोह नहीं कर सकते
बस integers गुजर क्योंकि सी में सब कुछ हमेशा मूल्य से गुजर रहा है.
यहां तक ​​कि जब आप संकेत गुजर रहे हैं आप मूल्य से गुजर रहे हैं.
यह सिर्फ इतना होता है कि उन मूल्यों को स्मृति पते हैं.
इसलिए मैं कह सकता जब foo (पी), मैं function foo में सूचक गुजर रहा हूँ
और फिर foo * = 6 पी कर रही है;
तो अंदर है कि समारोह के * पी अभी भी एक्स के लिए बराबर है,
लेकिन मैं x कि समारोह के अंदर का उपयोग नहीं है क्योंकि यह है कि समारोह के भीतर scoped नहीं है.
तो * p = 6 केवल जिस तरह से मैं एक अन्य समारोह से एक स्थानीय चर का उपयोग कर सकते हैं.
या, ठीक है, संकेत केवल जिस तरह से मैं एक अन्य समारोह से एक स्थानीय चर का उपयोग कर सकते हैं कर रहे हैं.
[छात्र] चलो कहते हैं कि आप के लिए एक सूचक वापसी करना चाहता था. वास्तव में आप कैसे करते हो?
Bowden [] int y = 3 तरह कुछ के रूप में एक सूचक लौटें, और वापसी y? >> [छात्र] हाँ.
[Bowden] ठीक है. आप यह कभी नहीं करना चाहिए. यह बुरा है.
मुझे लगता है कि मैं इन व्याख्यान स्लाइड में देखा आप स्मृति के इस पूरे चित्र देख शुरू
ऊपर आप यहाँ कहाँ स्मृति पता 0 मिल गया है
और यहाँ नीचे आप स्मृति पता 4 gigs 32 या 2 है.
तो फिर आप कुछ सामान और कुछ सामान मिला है और फिर आप अपने ढेर
और आप अपने ढेर, जो आप बस के बारे में सीखने शुरू कर दिया है, आगे बढ़ रही है मिल गया है.
[छात्र] ढेर ऊपर ढेर नहीं है?
>> हाँ. ढेर के शीर्ष पर है, यह नहीं है? >> [छात्र] खैर, वह शीर्ष पर 0 डाल दिया.
[छात्र] ओह, वह शीर्ष पर 0 डाल दिया. >> [छात्र] ओह, ठीक है.
अस्वीकरण: CS50 साथ कहीं भी आप इसे इस तरह से देखने के लिए जा रहे हैं. >> [छात्र] ठीक है.
यह सिर्फ है कि जब आप पहली बार के ढेर देख रहे हैं,
जैसे जब आप एक ढेर आप एक दूसरे के ऊपर पर बातें stacking के बारे में सोच के बारे में सोचो.
तो हम इस के आसपास फ्लिप इतना ढेर एक ढेर सामान्य तरह से बढ़ रहा है करते हैं
बजाय ढेर के नीचे लटक. >> [छात्र] नहीं ढेर तकनीकी भी बढ़ता है, हालांकि?
यह तुम क्या मतलब बड़े होते हैं पर निर्भर करता है.
ढेर और ढेर हमेशा विपरीत दिशाओं में बढ़ने.
ढेर हमेशा समझ में आगे बढ़ रही है कि यह संख्या बढ़ रही है
की ओर उच्च स्मृति पते, और ढेर के नीचे से बढ़ रहा है
में है कि यह कम स्मृति पते की ओर बढ़ रही है.
तो शीर्ष 0 और नीचे उच्च स्मृति पते है.
वे दोनों दिशाओं विरोध में बढ़ रहे हैं.
[छात्र] मैं तो सिर्फ उस का मतलब है क्योंकि तुमने कहा कि तुम तल पर ढेर डाल
क्योंकि यह अधिक सहज लगता है क्योंकि एक ढेर के शीर्ष पर ढेर के लिए शुरू करने के लिए,
ढेर भी खुद के शीर्ष पर है, तो that's - >> हाँ.
तुम भी आगे बढ़ रही है और बड़े के रूप में ढेर के बारे में सोचना है, लेकिन ढेर तो और अधिक.
तो ढेर एक है कि हम किस तरह से आगे बढ़ रही है दिखाने के लिए चाहते है.
लेकिन हर जगह आप अन्यथा देखने के लिए शीर्ष पर 0 पता दिखाने जा रहा है
और उच्चतम नीचे स्मृति पता है, तो यह अपनी स्मृति के सामान्य दृश्य है.
>> क्या आप में एक सवाल है?
[छात्र] आप हमें ढेर के बारे में और अधिक बता सकते हैं?
हाँ. मैं एक दूसरे में मिल जाएगा.
सबसे पहले, क्यों y और लौटने के लिए वापस जा रहा है एक बुरी बात है,
ढेर पर आप ढेर फ्रेम का एक गुच्छा है जो कार्यों के सभी का प्रतिनिधित्व है
जो बुलाया गया है.
पिछले बातें की अनदेखी तो, अपने ढेर के ऊपर हमेशा के लिए मुख्य समारोह होने जा रहा है
उस के बाद से पहली समारोह में कहा कि कहा जा रहा है.
और फिर जब आप किसी अन्य समारोह कहते हैं, ढेर करने के लिए नीचे हो जाना जा रहा है.
तो अगर मैं कुछ समारोह, foo, फोन और इसे अपने स्वयं के ढेर फ्रेम हो जाता है
यह कुछ बार, समारोह कॉल कर सकते हैं, यह अपने स्वयं के ढेर फ्रेम हो जाता है.
और बार पुनरावर्ती हो सकता है और यह ही कह सकते हैं सकता है,
और इतनी है कि 2 बार के लिए कॉल करने के लिए अपने स्वयं के ढेर फ्रेम पाने के लिए जा रहा है.
और तो क्या इन ढेर फ्रेम में चला जाता है स्थानीय चर के सभी कर रहे हैं
और समारोह तर्क है कि सभी -
किसी भी काम है कि स्थानीय स्तर पर इस समारोह के लिए scoped इन ढेर फ्रेम में जाना.
तो इसका मतलब है कि जब मैंने कहा कि बार की तरह कुछ एक समारोह है,
मैं सिर्फ एक पूर्णांक घोषित करने और फिर कि पूर्णांक के लिए एक सूचक वापस जा रहा हूँ.
तो जहां y रहते हैं?
[छात्र] y बार में रहती है. >> [Bowden] हाँ.
स्मृति के इस छोटे से वर्ग में कहीं न कहीं एक के रूप में बड़ा वर्ग है कि उस में y है.
जब मैं वापस और y, मैं स्मृति के इस छोटे से ब्लॉक करने के लिए एक सूचक लौट रहा हूँ.
लेकिन तब जब एक समारोह रिटर्न, अपने स्टैक फ्रेम ढेर popped हो जाता है.
और यही कारण है कि यह ढेर कहा जाता है.
यह ढेर डेटा संरचना की तरह है, यदि आप जानते हैं कि क्या है.
या यहां तक ​​कि ट्रे के एक ढेर की तरह हमेशा उदाहरण है,
मुख्य तल पर जाने के लिए जा रहा है, तो आप 1 समारोह कॉल करने के लिए उस के शीर्ष पर जा रहा है,
और तुम वापस करने के लिए मुख्य नहीं मिलता जब तक आप बुलाया गया है जो सभी कार्यों से वापस कर सकते हैं
कि यह के शीर्ष पर रखा गया है.
>> [छात्र] तो अगर तुम नहीं किया और y, कि मूल्य सूचना के बिना परिवर्तन के अधीन है वापसी.
हाँ, it's - >> [छात्र] यह ओवरराइट हो सकती है. >> हाँ.
यह पूरी तरह से है - अगर आप कोशिश करते हैं और
यह भी एक int * बार हो सकता है क्योंकि यह एक सूचक लौट रहा है,
तो अपनी वापसी प्रकार int * है.
यदि आप इस समारोह की वापसी मूल्य का उपयोग करने का प्रयास करें, यह अपरिभाषित व्यवहार है
क्योंकि कि सूचक बुरा स्मृति अंक. >> [छात्र] ठीक है.
तो क्या हुआ अगर, उदाहरण के लिए, आप घोषित int * y = malloc ((int) sizeof)?
यह बेहतर है. हां.
[छात्र] हम कैसे के बारे में बात की थी जब हम हमारे रीसायकल बिन बातें खींचें
वे वास्तव में नहीं मिटा रहे हैं, हम सिर्फ उनके संकेत खो.
तो इस मामले में हम वास्तव में मूल्य मिटा या है यह स्मृति में अभी भी वहाँ है?
अधिकांश भाग के लिए, यह अभी भी वहाँ होने जा रहा है.
लेकिन हम कहते हैं कि हम कुछ अन्य समारोह, baz कॉल करने के लिए होता है.
बाज यहाँ पर अपने स्वयं के ढेर फ्रेम मिल जा रहा है.
यह इस सामान के सभी overwriting किया जा रहा है,
और फिर अगर आप बाद में प्रयास करें और सूचक है कि आप पहले मिला का उपयोग करने के लिए,
यह एक ही मूल्य होने नहीं जा रहा है.
यह करने के लिए बदल दिया है है क्योंकि आप समारोह baz बुलाया जा रहा है.
[छात्र] लेकिन हम हम था नहीं होगा, अभी भी 3 मिलता है?
[Bowden] सभी संभावना में, आप होगा.
लेकिन आप उस पर भरोसा नहीं कर सकते. सी बस अपरिभाषित व्यवहार कहते हैं.
>> [छात्र] ओह, यह करता है. ठीक है.
तो जब आप एक सूचक वापस करना चाहते हैं, यह है जहां malloc उपयोग में आता है.
वास्तव में मैं लिख रहा हूँ, बस malloc वापसी (3 * sizeof (int)).
हम malloc पर एक दूसरे में जाना है, लेकिन malloc का विचार है अपने स्थानीय चर के सभी
हमेशा ढेर पर जाना.
कुछ भी है कि malloced है ढेर पर चला जाता है, और यह हमेशा के लिए और हमेशा ढेर पर होगा
जब तक आप स्पष्ट रूप से यह मुक्त.
तो इसका मतलब है कि जब आप कुछ malloc, यह समारोह रिटर्न के बाद जीवित रहने के लिए जा रहा है.
[छात्र] के बाद यह कार्यक्रम चल रहा है बंद हो जाता है बच निकलेंगे? >> सं.
ठीक है, तो यह वहाँ होना जब तक कार्यक्रम सभी तरह से चल रहा है किया जा रहा है. हाँ. >>
हम पर क्या होता है जब प्रोग्राम चल रहा बंद हो जाता है के विवरण के लिए जा सकते हैं.
तुम मुझे याद दिलाने की जरूरत है, लेकिन हो सकता है कि पूरी तरह से एक अलग बात है.
[छात्र] तो malloc एक सूचक बनाता है? >> हाँ.
Malloc - >> [छात्र] मुझे लगता है कि malloc स्मृति है कि एक सूचक का उपयोग कर सकते हैं की एक ब्लॉक designates.
[Bowden] मुझे लगता है कि आरेख फिर से करना चाहते हैं. >> [छात्र] तो इस समारोह में काम करता है, हालांकि?
[छात्र] हाँ malloc स्मृति का एक ब्लॉक है कि आप उपयोग कर सकते हैं designates,
और तो यह है कि स्मृति के 1 ब्लॉक का पता देता है.
>> [Bowden] हाँ. तो जब आप malloc, आप स्मृति के कुछ ब्लॉक हथियाने रहे हैं
कि ढेर में वर्तमान है.
अगर ढेर बहुत छोटा है, तो ढेर बस बढ़ने जा रहा है, और यह इस दिशा में बढ़ता है.
तो चलो का कहना है कि ढेर बहुत छोटा है.
तो यह एक छोटा सा बढ़ने और इस ब्लॉक कि सिर्फ बढ़ी एक सूचक वापसी के बारे में है.
जब आप मुफ्त सामान, आप ढेर में और अधिक कमरे बना रहे हैं
यदि ऐसा है तो फिर बाद में एक malloc कॉल करने के लिए है कि आप पहले से मुक्त कर दिया था कि स्मृति पुन: उपयोग कर सकते हैं.
malloc और मुफ्त के बारे में महत्वपूर्ण बात यह है कि तुम पूरी तरह नियंत्रण देता है
इन स्मृति ब्लॉकों के जीवनकाल में.
वैश्विक चर हमेशा जीवित हैं.
स्थानीय चर अपने दायरे के भीतर जीवित हैं.
जैसे ही आप एक घुंघराले ब्रेस अतीत जाना, स्थानीय चर मर चुके हैं.
Malloced स्मृति को जीवित है जब आप यह जिंदा रहने के लिए करना चाहते हैं
और फिर जब आप यह बताने के लिए जारी किया जा जारी है.
वे वास्तव में कर रहे हैं स्मृति के केवल 3 प्रकार, वास्तव में.
स्वत: स्मृति प्रबंधन है, जो ढेर है.
चीजें आप के लिए स्वचालित रूप से होता है.
जब आप int x कहते हैं, स्मृति int x के लिए आवंटित है.
जब x दायरे से बाहर चला जाता है, स्मृति के लिए एक्स reclaimed है.
तो फिर वहाँ गतिशील स्मृति प्रबंधन, जो malloc क्या है,
जो है, जब आप पर नियंत्रण है.
आप गतिशील तय जब स्मृति और आवंटित किया जाना चाहिए चाहिए नहीं.
और फिर वहाँ स्थिर है, जो बस का अर्थ है कि यह हमेशा के लिए रहता है,
जो वैश्विक चर क्या कर रहे हैं.
वे सिर्फ स्मृति में हमेशा से रहे हैं.
>> प्रश्न?
[छात्र] आप घुंघराले ब्रेसिज़ का उपयोग करके सिर्फ एक ब्लॉक को परिभाषित कर सकते हैं
लेकिन नहीं करने के लिए एक बयान या एक समय या उस तरह बयान कुछ भी अगर?
आप के रूप में एक समारोह में एक ब्लॉक को परिभाषित कर सकते हैं, लेकिन है कि घुंघराले ब्रेसिज़ भी है.
तो [छात्र] क्या आप सिर्फ अपने कोड में घुंघराले ब्रेसिज़ के एक यादृच्छिक जोड़ी की तरह नहीं हो सकता है
कि स्थानीय चर है? >> हाँ, आप यह कर सकते हैं.
Int पट्टी के अंदर हम {int y = 3;} हो सकता है.
यहीं होना चाहिए.
लेकिन यह है कि पूरी तरह से int y की गुंजाइश को परिभाषित करता है.
कि 2 घुंघराले ब्रेस के बाद, y अब और नहीं इस्तेमाल किया जा सकता है.
तुम लगभग कभी नहीं है कि हालांकि,.
क्या होता है जब एक कार्यक्रम को समाप्त करने के लिए वापस हो रही है,
कि हम में आदेश सिर्फ चीजों को आसान बनाने के लिए दे एक झूठ / ग़लतफ़हमी 1/2 की तरह है.
हम आपको बताना है कि जब आप स्मृति आवंटित करने के
आप उस चर के लिए राम का कुछ हिस्सा आवंटित कर रहे हैं.
लेकिन तुम सच में सीधे नहीं रैम रहे हैं कभी छू अपने कार्यक्रमों में.
यदि आप यह सोच है, मैं कैसे आकर्षित किया है -
और वास्तव में, अगर आप GDB में के माध्यम से जाना आप एक ही बात देखेंगे.
चाहे कितनी बार आप अपने कार्यक्रम या चलाने के कार्यक्रम में आप क्या चल रहे हैं,
ढेर हमेशा के लिए शुरू हो रहा है -
तुम हमेशा चर पता oxbffff आसपास कुछ देखने के लिए जा रहे हैं.
यह आमतौर पर कहीं है कि इस क्षेत्र में है.
लेकिन 2 कार्यक्रमों संभवतः कैसे एक ही स्मृति संकेत हो सकता है?
[छात्र] जहां oxbfff रैम पर माना जाता है के कुछ मनमाना पदनाम
कि वास्तव में जब समारोह में बुलाया गया था पर निर्भर करता है अलग स्थानों में हो सकता है.
हाँ. अवधि आभासी स्मृति है.
विचार है कि हर एक प्रक्रिया है, हर एक प्रोग्राम है कि आपके कंप्यूटर पर चल रहा है
अपनी ही है - पूरी तरह से स्वतंत्र पता स्थान - चलो 32 बिट मान.
यह पता स्थान है.
यह अपने आप ही पूरी तरह से उपयोग करने के लिए स्वतंत्र 4 गीगाबाइट है.
>> तो अगर आप 2 कार्यक्रमों के साथ चलाने के लिए, इस कार्यक्रम में ही 4 गीगाबाइट देखता है,
इस कार्यक्रम में ही 4 गीगाबाइट देखता है,
और यह इस कार्यक्रम के लिए भिन्नता के लिए असंभव एक सूचक
और इस कार्यक्रम से स्मृति के साथ खत्म होता है.
और आभासी स्मृति क्या एक प्रक्रियाओं पता स्थान से एक मानचित्रण
राम पर वास्तविक बातें.
तो यह आपके ऑपरेटिंग सिस्टम पर निर्भर करता है कि पता है,
अरे, जब इस आदमी को dereferences सूचक oxbfff, कि वास्तव में इसका मतलब है
कि वह रैम 1000 बाइट चाहता है,
है जबकि इस कार्यक्रम dereferences oxbfff अगर, वह वास्तव में रैम 10000 बाइट चाहता है.
वे मनमाने ढंग से दूर अलग हो सकता है.
यह एक एकल प्रक्रियाओं पता स्थान के भीतर चीजों की भी सच है.
तो जैसे ही सभी 4 गीगाबाइट देखता है, लेकिन हम कहते हैं -
[छात्र] हर एक प्रक्रिया करता है -
मान लीजिए कि आप केवल राम के 4 गीगाबाइट के साथ एक कंप्यूटर है.
क्या हर एक प्रक्रिया पूरे 4 गीगाबाइट देख रहे हो? हाँ. >>
लेकिन 4 गीगाबाइट यह देखता है एक झूठ है.
यह सिर्फ यह सोचता है कि यह सब स्मृति है, क्योंकि यह पता नहीं है किसी भी अन्य प्रक्रिया मौजूद है.
यह केवल उतनी ही स्मृति का उपयोग करें, क्योंकि यह वास्तव में जरूरत होगी.
ऑपरेटिंग सिस्टम के लिए इस प्रक्रिया को रैम देने वाला नहीं है
अगर यह इस पूरे क्षेत्र में किसी भी स्मृति का उपयोग नहीं है.
यह यह है कि इस क्षेत्र के लिए स्मृति देने के लिए नहीं जा रहा है.
लेकिन यह विचार है कि - मैं के बारे में सोच की कोशिश कर रहा हूँ - मैं एक सादृश्य की नहीं सोच सकती.
Analogies कड़ी मेहनत कर रहे हैं.
आभासी स्मृति के मुद्दों में से एक या एक चीजें हैं इसे हल है
यह है कि प्रक्रिया पूरी तरह से एक दूसरे से अनजान होना चाहिए.
और इसलिए आप किसी भी प्रोग्राम लिख सकते हैं कि बस किसी भी सूचक dereferences
की तरह बस एक प्रोग्राम है कि * (ox1234) कहते हैं लिखने,
और कि अपसंदर्भन स्मृति पते 1234.
>> लेकिन यह ऑपरेटिंग सिस्टम पर निर्भर है तो क्या 1234 का मतलब है अनुवाद.
तो 1234 अगर इस प्रक्रिया के लिए एक वैध स्मृति पता होना होता है,
जैसे कि यह ढेर या कुछ और पर है, तो यह है कि स्मृति पते के मूल्य वापसी करेंगे
के रूप में दूर के रूप में इस प्रक्रिया को जानता है.
लेकिन अगर 1234 एक वैध पता नहीं है, जैसे कि यह देश के लिए होता है
स्मृति के कुछ थोड़ा यहाँ टुकड़ा है कि ढेर से परे है और ढेर से परे
और तुम सच है कि, तो है कि जब आप segfaults की तरह बातें करने के लिए इस्तेमाल नहीं किया है
क्योंकि आप स्मृति छू रहे हैं कि आप को छू नहीं किया जाना चाहिए.
यह भी सच है -
एक 32-bit प्रणाली, 32 बिट्स मतलब है कि आप एक स्मृति पते को परिभाषित करने के लिए 32 बिट है.
यह क्यों संकेत 8 बाइट्स है क्योंकि 32 बिट 8 बाइट्स हैं - या 4 बाइट्स है.
सूचक 4 बाइट्स हैं.
तो जब आप एक सूचक oxbfffff की तरह देखते हैं, वह यह है कि -
किसी भी कार्यक्रम के भीतर आप सिर्फ किसी भी मनमाने ढंग से सूचक का निर्माण कर सकते हैं,
कहीं भी ox0 से बैल 8 f's - ffffffff.
[छात्र] क्या तुमने नहीं कहा वे 4 बाइट्स कर रहे हैं? >> हाँ.
[छात्र] तो प्रत्येक बाइट होगा - >> [Bowden] हेक्साडेसिमल.
हेक्साडेसिमल - 5, 6, 7, 8. संकेत तो आप हमेशा हेक्ज़ाडेसिमल में देखने जा रहे हैं.
यह सिर्फ है कि हम कैसे संकेत वर्गीकृत.
षोडश आधारी के हर 2 अंक 1 बाइट है.
तो वहाँ 4 बाइट्स के लिए 8 हेक्साडेसिमल अंक होने जा रहा है.
तो एक 32-bit प्रणाली पर हर एक सूचक 4 बाइट्स होने जा रहा है,
जिसका अर्थ है कि अपनी प्रक्रिया में आप किसी भी मनमाने ढंग से 4 बाइट्स का निर्माण कर सकते हैं
और यह एक सूचक बाहर करना,
जिसका अर्थ है कि जहाँ तक यह पता है, यह स्मृति के 32 बाइट्स के लिए एक पूरे 2 का पता कर सकते हैं.
हालांकि यह सच है कि करने के लिए पहुँच नहीं है,
भले ही आपके कंप्यूटर केवल 512 मेगाबाइट है, यह सोचता है कि यह है कि ज्यादा मेमोरी है.
और ऑपरेटिंग सिस्टम काफी चालाक है कि यह केवल आवंटित क्या आप वास्तव में जरूरत है.
यह बस नहीं जाना है, ओह, एक नई प्रक्रिया: 4 gigs.
>> हाँ. >> [छात्र] बैल क्या मतलब है? आप यह क्यों लिख सकता हूँ?
यह सिर्फ हेक्सादशमलव के लिए प्रतीक है.
जब आप बैल के साथ एक नंबर शुरू देखते हैं, लगातार बातें षोडश आधारी हैं.
[छात्र] तुम क्या होता है जब एक कार्यक्रम समाप्त होता है के बारे में समझा रहे थे. हाँ. >>
ऑपरेटिंग सिस्टम क्या होता है जब एक कार्यक्रम समाप्त होता है
बस मैपिंग कि यह इन पतों के लिए है, और वह यह है erases.
ऑपरेटिंग सिस्टम अब सिर्फ कि स्मृति उपयोग करने के लिए एक कार्यक्रम के लिए दे सकते हैं.
[छात्र] ठीक है.
तो जब आप ढेर या ढेर या वैश्विक चर या कुछ भी पर कुछ आवंटित,
वे सब बस के रूप में जल्द ही के रूप में कार्यक्रम समाप्त होता है गायब
क्योंकि अब ऑपरेटिंग सिस्टम के लिए किसी अन्य प्रक्रिया है कि स्मृति देने के लिए स्वतंत्र है.
[छात्र] हालांकि वहाँ शायद अभी भी मूल्यों में लिखा? >> हाँ.
मान की संभावना अभी भी कर रहे हैं वहाँ.
यह सिर्फ उन पर निकलना मुश्किल हो जा रहा है.
यह ज्यादा मुश्किल है उन पर की तुलना में यह एक फ़ाइल को नष्ट में मिल रहा है
क्योंकि नष्ट कर दिया फ़ाइल की तरह एक लंबे समय के लिए वहाँ बैठता है और हार्ड ड्राइव एक बहुत बड़ा है.
तो यह स्मृति के विभिन्न भागों को अधिलेखित करने के लिए जा रहा है
इससे पहले कि यह करने के लिए स्मृति का हिस्सा है कि फाइल में इस्तेमाल किया जा अधिलेखित होता है.
लेकिन मुख्य स्मृति, रैम, आप एक बहुत तेजी से चक्र के माध्यम से,
तो यह बहुत तेजी से अधिलेखित हो जा रहा है.
इस या किसी और चीज़ पर सवाल?
[छात्र] मैं एक अलग विषय के बारे में प्रश्न हैं. ठीक है. >>
क्या किसी को इस पर सवाल है?
>> ठीक है. अलग विषय है. >> [छात्र] ठीक है.
मैं अभ्यास परीक्षण के कुछ के माध्यम से जा रहा था,
और उनमें से एक में यह sizeof के बारे में बात कर रहा था
और मूल्य है कि यह रिटर्न या विभिन्न प्रकार के चर. हाँ. >>
और यह कहा कि दोनों int और लंबी दोनों 4 वापसी, तो वे दोनों 4 बाइट्स लंबे हैं.
वहाँ एक int और एक लंबे समय के बीच कोई अंतर है, या यह एक ही बात है?
हाँ, वहाँ एक अंतर है.
सी मानक -
मैं शायद गड़बड़ करने के लिए जा रहा हूँ.
सी मानक बस की तरह है सी क्या है, सी. के सरकारी दस्तावेज
यह है कि यह क्या कहते हैं.
सी मानक तो बस का कहना है कि एक चार और हमेशा हमेशा 1 बाइट होगा.
उस के बाद सब कुछ - हमेशा एक छोटी बस से अधिक या एक चार के बराबर किया जा रहा है के रूप में परिभाषित किया है.
इस सख्ती से अधिक हो सकता है, लेकिन सकारात्मक नहीं है.
एक int सिर्फ एक कम करने के लिए अधिक से अधिक या बराबर किया जा रहा है के रूप में परिभाषित किया गया है.
और एक लंबे सिर्फ एक int से अधिक या बराबर किया जा रहा है के रूप में परिभाषित किया गया है.
और एक लंबे से अधिक या एक लंबे समय के लिए बराबर है.
इतनी ही बात सी मानक को परिभाषित करता है सब कुछ के रिश्तेदार आदेश है.
स्मृति की वास्तविक राशि है कि चीजों को लेने के आम तौर पर लागू करने के लिए है,
लेकिन यह बहुत अच्छी तरह से इस बिंदु पर परिभाषित किया गया है. >> [छात्र] ठीक है.
शॉर्ट्स तो लगभग हमेशा के लिए 2 बाइट्स होने जा रहे हैं.
Ints लगभग हमेशा के लिए 4 बाइट्स होने जा रहे हैं.
लांग चाहता लगभग हमेशा 8 बाइट्स होने जा रहे हैं.
और चाहता है, यह है कि क्या आप एक 32-bit या 64-bit प्रणाली का उपयोग कर रहे हैं पर निर्भर करता है.
तो एक लंबे समय के लिए प्रणाली के प्रकार के अनुरूप रहा है.
यदि आप उपकरण की तरह एक 32-bit प्रणाली का उपयोग कर रहे हैं, यह 4 बाइट्स होने जा रहा है.
यदि आप हाल ही में कंप्यूटर के एक बहुत पसंद है एक 64-bit का उपयोग कर रहे हैं, यह 8 बाइट होने जा रहा है.
>> Ints लगभग हमेशा इस बिंदु पर 4 बाइट्स.
लांग चाहता लगभग हमेशा 8 बाइट्स.
अतीत में, ints केवल 2 बाइट्स होना करने के लिए इस्तेमाल किया.
लेकिन नोटिस कि यह पूरी तरह से अधिक करने के लिए और बराबर के इन संबंधों के सभी संतुष्ट है.
तो लंबे समय से पूरी तरह से एक पूर्णांक के रूप में एक ही आकार के होने की अनुमति दी है,
और यह भी एक लंबे समय के रूप में एक ही आकार के होने की अनुमति दी है.
और यह सिर्फ इतना होता है करने के लिए हो सकता है कि सिस्टम की 99,999% में, यह करने के लिए बराबर होने जा रहा है
या तो एक int या एक लंबे. यह सिर्फ 32-bit या 64-bit पर निर्भर करता है. >> [छात्र] ठीक है.
मंगाई, कैसे बिट्स के मामले में नामित दशमलव बिंदु है?
द्विआधारी के रूप में की तरह? >> हाँ.
आप CS50 के लिए पता है कि जरूरत नहीं है.
तुम भी है कि 61 में सीखना नहीं है.
आपको लगता है कि वास्तव में किसी भी पाठ्यक्रम में सीखना नहीं है.
यह सिर्फ एक प्रतिनिधित्व है.
मैं सही बिट आवंटन भूल जाते हैं.
चल बिन्दु का विचार है कि आप का प्रतिनिधित्व करने के लिए बिट्स की एक विशिष्ट संख्या आवंटित -
असल में, सब कुछ वैज्ञानिक संकेतन में है.
तो आप 1.2345 तरह संख्या ही है, का प्रतिनिधित्व करने के लिए बिट्स की एक विशिष्ट संख्या आवंटित.
मैं 5 से अधिक अंकों के साथ कभी नहीं एक संख्या का प्रतिनिधित्व कर सकते हैं.
तो फिर आप भी बिट्स की एक विशिष्ट संख्या आवंटित इतना है कि यह की तरह हो जाता है
आप केवल एक निश्चित संख्या के लिए जा सकते हैं, जैसे कि सबसे बड़ा प्रतिपादक हो सकता है आप है,
और आप केवल एक निश्चित प्रतिपादक करने के लिए नीचे जा सकते हैं,
जैसे कि छोटी से छोटी प्रतिपादक हो सकता है आप है.
>> मुझे याद नहीं है सही तरीके बिट्स इन मूल्यों के सभी के लिए आवंटित कर रहे हैं,
लेकिन बिट्स की एक निश्चित संख्या में 1.2345 करने के लिए समर्पित कर रहे हैं,
बिट्स की एक और निश्चित संख्या प्रतिपादक करने के लिए समर्पित कर रहे हैं,
और यह केवल एक निश्चित आकार के एक प्रतिपादक का प्रतिनिधित्व करने के लिए संभव है.
[छात्र] और एक डबल? कि एक अतिरिक्त लंबी नाव की तरह है? >> हाँ.
यह अब 4 बाइट्स की बजाय 8 बाइट का उपयोग कर रहे हैं के अलावा एक नाव के रूप में एक ही बात है.
अब आप 9 अंक या 10 अंक का उपयोग करने में सक्षम हो जाएगा,
और यह 300 के बजाय 100 करने के लिए जाने के लिए सक्षम हो जाएगा. >> [छात्र] ठीक है.
और तैरता भी 4 बाइट्स. हाँ. >>
खैर, फिर से, यह शायद समग्र सामान्य कार्यान्वयन पर निर्भर करता है,
लेकिन मंगाई 4 बाइट्स हैं, युगल, 8 रहे हैं.
डबल्स डबल कहा जाता है क्योंकि वे डबल मंगाई के आकार के होते हैं.
[छात्र] ठीक है. और वहाँ डबल डबल्स रहे हैं? >> नहीं कर रहे हैं.
मुझे लगता है कि - >> लंबी चाहता है की तरह [छात्र]? >> हाँ. मुझे नहीं लगता. हां.
पिछले साल के परीक्षण पर [छात्र] वहाँ मुख्य समारोह के बारे में एक सवाल था
करने के लिए अपने कार्यक्रम का हिस्सा होने.
जवाब था कि यह करने के लिए अपने कार्यक्रम का हिस्सा होना नहीं है.
क्या स्थिति है? यही कारण है कि मैंने क्या देखा.
[Bowden] ऐसा लगता है - >> [छात्र] क्या स्थिति है?
क्या आप समस्या है? >> [छात्र] हाँ, मैं निश्चित रूप से इसे खींच कर सकते हैं.
यह होना नहीं है, तकनीकी तौर पर, लेकिन मूल रूप से यह होने जा रहा है.
[छात्र] मैं एक अलग साल पर एक देखा था.
यह सही है या गलत तरह था: एक वैध - >> ओह, एक ग फ़ाइल.?
छात्र किसी भी सी फ़ाइल होना चाहिए - [दोनों को एक साथ बोल - unintelligible]
ठीक है. तो यह है कि अलग है.
>> सिर्फ एक सी फाइल करने के लिए कार्यों को रोकने की जरूरत है.
आप मशीन कोड में एक फ़ाइल, द्विआधारी, जो कुछ भी संकलन कर सकते हैं,
बिना यह निष्पादन अभी तक किया जा रहा है.
एक वैध निष्पादन एक मुख्य कार्य होना चाहिए.
आप एक फाइल में 100 कार्य करता है, लेकिन कोई मुख्य लिख सकते हैं
और तो द्विआधारी कि नीचे संकलन,
तो आप किसी अन्य फ़ाइल है कि केवल मुख्य है लिखने लेकिन यह इन कार्यों में से एक गुच्छा कॉल
यहाँ पर इस बाइनरी फ़ाइल में.
और इसलिए जब आप निष्पादन कर रहे हैं, कि linker क्या करता है
यह इन 2 में एक निष्पादन योग्य द्विपदीय फाइल को जोड़ती है.
तो एक सी फाइल करने के लिए एक मुख्य समारोह की जरूरत नहीं है.
और बड़े कोड के आधार पर आप ग. फ़ाइलें और 1 मुख्य फाइल के हजारों देखेंगे.
और सवाल?
[छात्र] एक और सवाल था.
यह कहा जाता है एक संकलक है. सही है या गलत?
और जवाब झूठा था, और मैं समझ क्यों यह बजना की तरह नहीं है.
लेकिन हम क्या कर अगर यह नहीं है कहते हैं?
मूल रूप से बस - मैं देख सकते हैं कि क्या वास्तव में यह कॉल.
लेकिन यह सिर्फ आदेश चलाता है.
बनाओ.
मैं इस ऊपर खींचने के लिए कर सकते हैं. हाँ.
ओह, हाँ. यह भी है कि नहीं करता है.
यह कहते हैं बनाने उपयोगिता के उद्देश्य के लिए स्वचालित रूप से निर्धारित है
जो एक बड़े कार्यक्रम के टुकड़े को कंपाइल किया जाना चाहिए
और आदेश जारी करने के लिए उन्हें recompile.
आप फ़ाइलें है कि पूरी तरह से कर रहे हैं विशाल बनाने के लिए कर सकते हैं.
फ़ाइलों के समय टिकटों पर लग रहा है और, जैसे कि हम पहले कहा,
आप अलग - अलग फ़ाइलों संकलन नीचे कर सकते हैं, और यह नहीं है जब तक आप linker को मिल
कि वे एक साथ एक निष्पादन में डाल रहे हैं.
तो अगर आप 10 अलग अलग फ़ाइलों है और आप उनमें से एक के लिए एक बदलाव बनाने,
तो बनाने के लिए नहीं जा रहा है कि क्या सिर्फ recompile है कि 1 फ़ाइल
और फिर सब कुछ एक साथ relink.
लेकिन यह है कि बहुत से dumber है.
यह आप पर निर्भर है करने के लिए पूरी तरह से परिभाषित करने के लिए है कि है कि यह क्या कर किया जाना चाहिए.
यह डिफ़ॉल्ट रूप से करने के लिए इस समय स्टाम्प सामान को पहचान करने की क्षमता है,
लेकिन आप एक फ़ाइल बनाने के लिए लिखने के लिए कुछ भी कर सकते हैं.
आप लिख सकते हैं एक फ़ाइल इतना करना है कि जब आप यह सिर्फ सीडी एक निर्देशिका बनाने के लिए लिखें.
मैं निराश हो गया था क्योंकि मैं कील सब कुछ मेरे उपकरण के अंदर
और फिर मैं मैक से पीडीएफ देखने.
>> तो मैं खोजक के लिए जाना है और मैं जाना कर सकते हैं, सर्वर से कनेक्ट करने के लिए,
और सर्वर मैं कनेक्ट मेरी उपकरण है, और फिर मैं ऊपर पीडीएफ खोलने
कि लेटेक्स द्वारा संकलित किया जाता है.
लेकिन मैं निराश हो रही थी क्योंकि हर बार मैं करने के लिए पीडीएफ ताज़ा करने की जरूरत है,
मैं इसे एक विशिष्ट निर्देशिका है कि इसे का उपयोग कर सकते हैं कॉपी किया था
और यह गुस्सा आ रहा था.
तो बजाय मैं एक फ़ाइल बनाने के लिए है, जो आप को परिभाषित करने के लिए है कि यह कैसे काम करता है लिखा था.
तुम कैसे बनाने के लिए यह पीडीएफ लेटेक्स है.
बस किसी भी अन्य फ़ाइल बनाने के लिए तरह - या मुझे लगता है कि आप बनाने फ़ाइलों को नहीं देखा है,
लेकिन हम इस उपकरण में एक वैश्विक फ़ाइल बनाने के लिए है कि बस का कहना है,
यदि आप एक सी फ़ाइल संकलन कर रहे हैं, बजना का उपयोग करें.
और यहाँ तो मेरे बनाने फ़ाइल में है कि मैं मैं कहता हूँ,
इस फाइल करने के लिए पीडीएफ लेटेक्स के साथ संकलन करना चाहता हूँ जा रहे हैं.
और इसलिए यह पीडीएफ लेटेक्स कि संकलन कर रहा है.
बनाने के लिए नहीं संकलन है. यह सिर्फ मैं निर्दिष्ट अनुक्रम में इन आदेशों का चल रहा है.
तो यह पीडीएफ लेटेक्स चलाता है, यह प्रतियां निर्देशिका मैं इसे नकल करना चाहते हैं,
यह सीडी निर्देशिका और अन्य बातें करता है,
लेकिन यह सब होता है जब एक फ़ाइल में परिवर्तन की पहचान है,
और अगर यह परिवर्तन, तो यह हुक्म है कि इसे चलाने के लिए माना जाता है चलेंगे
जब फ़ाइल में परिवर्तन. >> [छात्र] ठीक है.
मैं नहीं जानता कि जहां वैश्विक बनाने फ़ाइलें हैं मेरे लिए यह जांच करने के लिए बाहर.
अन्य प्रश्न? अतीत से कुछ भी quizzes? कोई सूचक बातें?
जैसे संकेत के साथ सूक्ष्म बातें कर रहे हैं -
मैं उस पर एक प्रश्नोत्तरी सवाल खोजने के लिए सक्षम होने के लिए नहीं जा रहा हूँ -
लेकिन सिर्फ इस तरह की बात की तरह.
सुनिश्चित करें कि आप समझते हैं कि जब मैं कहता हूँ int * x * y -
यह वास्तव में यहाँ कुछ भी नहीं है, मुझे लगता है.
लेकिन जैसे * x * y, उन 2 चर ढेर पर हैं.
जब मैं कहता हूँ x = malloc (sizeof (int)), एक्स अभी भी ढेर पर एक चर है,
malloc ढेर में अधिक कुछ ब्लॉक है, और हम ढेर करने के लिए एक्स बात कर रहे हैं.
>> ढेर के ढेर अंक पर कुछ तो है.
जब भी आप कुछ भी malloc, आप अनिवार्य रूप से यह एक सूचक के अंदर भंडारण कर रहे हैं.
इसलिए कि सूचक ढेर पर है, malloced ब्लॉक ढेर पर है.
लोगों का एक बहुत उलझन में हैं और कहते हैं कि int * x = malloc, x ढेर पर है.
सं x क्या करने के लिए अंक ढेर पर है.
x ही ढेर पर है, जो भी कारण के लिए जब तक आप एक्स एक वैश्विक चर हो गए हैं,
जो मामले में यह स्मृति का एक और क्षेत्र में होना होता है.
तो ट्रैक रखने, इन बॉक्स और तीर चित्र प्रश्नोत्तरी के लिए बहुत आम हैं.
या अगर यह 0 प्रश्नोत्तरी पर नहीं है, यह 1 प्रश्नोत्तरी पर होगा.
आप इनमें से सभी जानते हैं, संकलन में कदम
के बाद आप उन पर सवालों के जवाब देने के लिए किया था. हां.
[छात्र] हम उन कदमों पर जा सकते हैं - >> ज़रूर.
कदम और संकलन से पहले हम preprocessing है,
संकलन, संयोजन, और जोड़ने.
Preprocessing. क्या करता है?
यह आसान में कदम है - अच्छी तरह से नहीं, जैसे -
है कि इसका मतलब है कि यह स्पष्ट किया जाना चाहिए नहीं है, करता है, लेकिन यह आसान कदम है.
तुम लोग इसे अपने आप लागू कर सकता है. हाँ.
[छात्र] लो क्या आप अपने में इस तरह से शामिल है और यह और फिर प्रतियां भी परिभाषित करता है.
यह # शामिल की तरह बातों के लिए लग रहा है और परिभाषित #
और यह सिर्फ प्रतियां और चिपकाता है जो वास्तव में क्या मतलब है.
तो जब आप कहते # cs50.h शामिल पूर्वप्रक्रमक को कॉपी करने और चिपकाने cs50.h
उस लाइन में.
जब आप कहते हैं # x को परिभाषित करने के लिए 4 हो, पूर्वप्रक्रमक पूरे कार्यक्रम के माध्यम से चला जाता है
और 4 के साथ एक्स के सभी उदाहरणों की जगह है.
तो पूर्वप्रक्रमक एक वैध सी फ़ाइल लेता है और एक वैध सी फ़ाइल outputs
बातें है, जहां नकल किया गया है और चिपकाया.
तो अब संकलन. क्या करता है?
[छात्र] यह सी से द्विआधारी के लिए चला जाता है.
>> [Bowden] यह द्विआधारी करने के लिए सभी तरह से जाना नहीं है.
[छात्र] तो मशीन कोड? >> यह मशीन कोड नहीं है.
[छात्र] विधानसभा? >> विधानसभा.
यह विधान सभा के लिए हो जाता है इससे पहले कि यह सी कोड के लिए सभी का रास्ता जाता है,
और सबसे अधिक भाषाओं कुछ इस तरह करते हैं.
किसी भी उच्च स्तर की भाषा उठाओ, और यदि आप यह संकलन करने के लिए जा रहे हैं,
यह चरणों में संकलन करने की संभावना है.
पहले यह सी पायथन संकलन करने के लिए जा रहा है, तो यह विधान सभा के लिए सी संकलन करने के लिए जा रहा है,
और फिर विधानसभा द्विआधारी करने के लिए अनुवाद करने के लिए जा रहा है.
तो संकलन सी से विधानसभा के लिए लाने के लिए जा रहा है.
संकलन शब्द आम तौर पर यह एक उच्च स्तर से लाने का मतलब
एक निचले स्तर के प्रोग्रामिंग भाषा के लिए.
तो इस संकलन में ही एक कदम है जहां आप एक उच्च स्तर की भाषा के साथ शुरू
और एक कम स्तर भाषा में खत्म होता है, और यही कारण है कि कदम संकलन कहा जाता है.
संकलन के दौरान छात्र], चलो कहना है कि आप # शामिल किया है cs50.h.
संकलक recompile cs50.h, जैसे कार्य करता है कि वहाँ में कर रहे हैं,
और विधानसभा कोड में है कि के रूप में अच्छी तरह से अनुवाद करने के लिए,
या यह कॉपी और पेस्ट कुछ है कि पूर्व विधानसभा गया है?
cs50.h विधानसभा में बहुत ज्यादा खत्म हो जाएगा ऊपर कभी नहीं.
समारोह प्रोटोटाइप और चीजों की तरह सामान हैं सिर्फ तुम्हारे लिए सावधान रहना.
ये गारंटी है कि संकलक बातों की जांच करने की तरह आप कार्य बुला रहे हैं कर सकते हैं
सही वापसी प्रकार और सही तर्क और सामान के साथ.
>> तो cs50.h फ़ाइल में preprocessed किया जाएगा, और फिर जब यह संकलन है
यह मूल रूप से दूर फेंक दिया है, के बाद यह सुनिश्चित करें कि सब कुछ सही ढंग से बुलाया जा रहा है बनाता है.
लेकिन CS50 पुस्तकालय में परिभाषित कार्यों है, जो cs50.h से अलग कर रहे हैं,
उन अलग संकलित नहीं किया जाएगा.
यह वास्तव में जोड़ने चरण में नीचे आ जाएगा, तो हम एक दूसरे में मिल जाएगा.
लेकिन पहले, क्या संयोजन है?
[छात्र] विधानसभा द्विआधारी करने के लिए? >> हाँ.
कोडांतरण.
हम यह संकलन फोन नहीं है क्योंकि विधानसभा बहुत ज्यादा बाइनरी का शुद्ध अनुवाद है.
विधानसभा से बाइनरी जाने में बहुत कम तर्क है.
यह सिर्फ एक तालिका में देख तरह है, ओह, हम यह निर्देश है;
01110 द्विआधारी से मेल खाती है.
और इसलिए फाइल है कि आम तौर पर कोडांतरण outputs ओ फ़ाइलें.
और ओ. फाइल कर रहे हैं कि हम पहले कह रहे थे,
एक फाइल करने के लिए एक मुख्य समारोह के लिए जरूरत नहीं है.
कोई फ़ाइल ओ. फ़ाइल के लिए नीचे हो सकता है लंबे समय के रूप में यह एक वैध सी फ़ाइल के रूप में संकलित है.
यह ओ. नीचे संकलित कर सकते हैं.
अब, जोड़ने है क्या वास्तव में का एक गुच्छा लाता ओ फ़ाइलों और उन्हें एक निष्पादन योग्य के लिए लाता है.
और इसलिए जोड़ने क्या करता है आप CS50 पुस्तकालय के ओ. फ़ाइल के रूप में सोच सकता है.
यह एक पहले से ही संकलित बाइनरी फ़ाइल है.
और इसलिए जब आप अपनी फ़ाइल, अपने hello.c है, जो GetString कॉल संकलन,
hello.c नीचे hello.o संकलित किया जाता है,
hello.o बाइनरी में अब है.
यह GetString का उपयोग करता है, तो यह खत्म cs50.o के लिए जाने की जरूरत है,
और linker उन्हें एक साथ smooshes और इस फाइल में GetString प्रतियां
और एक निष्पादन योग्य है कि सभी कार्यों की जरूरत है यह है के साथ बाहर आता है.
तो cs50.o वास्तव में एक हे फ़ाइल नहीं है, लेकिन यह काफी करीब है कि वहाँ कोई बुनियादी फर्क है.
तो बस जोड़ने के लिए फ़ाइलों का एक गुच्छा एक साथ लाता है
कि अलग - अलग कार्यों के सभी शामिल मैं का उपयोग करने की जरूरत है
और निष्पादन योग्य बनाता है कि वास्तव में चला जाएगा.
>> और इसलिए भी कि हम क्या पहले कह रहे थे
जहां आप 1000 ग फ़ाइलों कर सकते हैं., आप उन सब संकलन ओ फ़ाइलों.
जो शायद एक समय लग जाएगा, तो आप 1 ग फ़ाइल को बदलने के लिए.
आप केवल कि 1. ग फ़ाइल और फिर relink और सब कुछ recompile की जरूरत है,
सब कुछ एक साथ वापस लिंक.
[छात्र] जब हम लिंक कर रहे हैं हम lcs50 लिखने के लिए?
हाँ, तो lcs50. Linker कि झंडा संकेत है कि आपको लगता है कि पुस्तकालय में जोड़ने किया जाना चाहिए.
प्रश्न?
क्या हम पहला व्याख्यान में 5 सेकंड से अन्य बाइनरी पर चला गया है?
मुझे नहीं लगता.
तुम बड़ा ओएस के सभी पता होना चाहिए कि हम पर चला गया है,
और आप करने में सक्षम हो सकता है, अगर हम आप एक समारोह में दिया जाना चाहिए,
आप कहते हैं कि यह बड़ा हे है, मोटे तौर पर करने में सक्षम होना चाहिए. या अच्छी तरह से, बड़ा हे मोटा है.
तो अगर आप चीजों की एक ही नंबर पर पाशन loops के लिए नेस्टेड देख सकते हैं,
>> चुकता [छात्र] n - int j, जम्मू <n, int i, मैं > यह n चुकता करने के लिए जाता है.
यदि आप ट्रिपल नीडिंत है, यह होना n cubed जाता है.
तो उस चीज़ की तरह आप तुरंत बाहर बात करने में सक्षम होना चाहिए.
आप प्रविष्टि तरह और बुलबुला तरह जानते हैं और तरह और उन सभी मर्ज की जरूरत है.
यह आसान है समझने के लिए क्यों वे उन n चुकता और n लॉग एन और वह सब कर रहे हैं
क्योंकि मुझे लगता है कि वहाँ एक प्रश्नोत्तरी पर एक वर्ष जहाँ हम मूल रूप से तुम्हें दे दिया था
बुलबुला तरह के एक कार्यान्वयन और कहा, "इस समारोह का समय चल रहा है क्या है?"
तो अगर आप यह बुलबुला तरह के रूप में पहचान है, तो आप तुरंत पता चुकता कह सकते हैं.
लेकिन अगर आप बस इसे देखो, तुम भी यह बुलबुला तरह का एहसास नहीं की जरूरत नहीं है;
तुम बस कहना है कि यह कर रहा है और इस कर सकते हैं. इस चुकता n है.
[छात्र] वहाँ किसी भी मुश्किल उदाहरण आप के साथ आ सकते हैं,
बाहर figuring के एक समान विचार की तरह?
>> मुझे नहीं लगता कि हम आप किसी भी कठिन उदाहरण देना होगा.
बुलबुला तरह बात के बारे में के रूप में मुश्किल के रूप में हम चलते हैं,
और भी है कि, के रूप में लंबे समय के रूप में आप समझते हैं कि आप सरणी पर iterating कर रहे हैं
सरणी में प्रत्येक तत्व के लिए, जो कुछ है कि चुकता एन होने जा रहा है.
यहाँ की तरह सामान्य सवाल है, हम कर रहे हैं - ओह.
बस दूसरे दिन डौग दावा किया, "मैं एक एल्गोरिथ्म है कि एक सरणी सॉर्ट कर सकते हैं आविष्कार किया है
"हे (लॉग एन) समय! में n संख्या"
तो कैसे हम जानते हैं कि असंभव है?
[अश्राव्य छात्र प्रतिक्रिया] >> हाँ.
बहुत कम से कम, आप सरणी में प्रत्येक तत्व को स्पर्श किया है,
तो यह असंभव है की एक सरणी तरह -
यदि सब कुछ unsorted क्रम में है, तो आप सरणी में सब कुछ छू हो जा रहे हैं,
तो यह असंभव है यह पता हे से कम समय में करना.
[छात्र] आप हमें n हे में ऐसा करने में सक्षम होने की है कि उदाहरण दिखाया
अगर आप स्मृति का एक बहुत का उपयोग करें. >> हाँ.
और - मैं क्या भूल that's that's यह तरह गिनती है?
हम्म. कि एक पूर्णांक छँटाई एल्गोरिथ्म है.
मैं इस बात के लिए विशेष नाम के लिए देख रहा था कि मैं पिछले हफ्ते याद नहीं कर सकता.
हाँ. इन प्रकार के प्रकार है कि n का बड़ा हे में चीजें हासिल कर सकते हैं.
लेकिन वहाँ सीमाएं हैं, आप की तरह केवल पूर्णांकों एक निश्चित संख्या के लिए उपयोग कर सकते हैं ऊपर.
इसके अलावा अगर आप कुछ that's सुलझाने की कोशिश कर रहे हैं -
यदि आपके सरणी 012, -12, 151, 4 लाख है,
तो है कि एक तत्व के लिए पूरी तरह से पूरे छँटाई बर्बाद जा रहा है.
>> प्रश्न?
[छात्र] यदि आप एक पुनरावर्ती समारोह है और यह सिर्फ पुनरावर्ती कॉल करता है
एक वापसी के बयान के भीतर, कि पुनरावर्ती पूंछ है,
और इतनी है कि क्रम के दौरान और अधिक स्मृति का उपयोग नहीं होगा
या कम से कम तुलनीय स्मृति का उपयोग के रूप में एक समाधान चलने का होगा?
[Bowden] हाँ.
यह संभावना कुछ हद तक धीमी हो सकता है, लेकिन वास्तव में नहीं है.
पुनरावर्ती पूंछ बहुत अच्छा है.
ढेर फ्रेम में फिर से देख रहे हैं, हम कहते हैं कि हम मुख्य है
और हम int (int x) बार या कुछ और है.
यह एक आदर्श पुनरावर्ती समारोह नहीं है, लेकिन वापसी बार (एक्स - 1).
तो जाहिर है, यह त्रुटिपूर्ण है. आप बेस मामलों और सामान की जरूरत है.
लेकिन यहाँ विचार है कि इस पुनरावर्ती पूंछ है,
जो जब मुख्य कॉल बार यह करने के लिए अपने ढेर फ्रेम हो रहा है का मतलब है.
इस ढेर फ्रेम में स्मृति की एक छोटी सी ब्लॉक होने जा रहा है
कि अपने तर्क एक्स से मेल खाती है.
और तो चलो का कहना है कि मुख्य बार (100) कॉल करने के लिए होता है;
तो x 100 के रूप में शुरू हो रहा है.
यदि संकलक यह स्वीकार करता है कि यह एक पूंछ पुनरावर्ती समारोह है,
फिर जब बार बार इसकी पुनरावर्ती कॉल करने के लिए बनाता है,
, जो है, जहां ढेर काफी हद तक बढ़ रही शुरू होता है एक नया ढेर फ्रेम बनाने के बजाय,
अंततः यह ढेर में चलाने के लिए और फिर आप segfaults मिल जाएगा
क्योंकि स्मृति टकराने शुरू होता है.
>> तो अपने खुद के ढेर फ्रेम बनाने के बजाय, यह महसूस कर सकते हैं,
अरे, मैं इस ढेर फ्रेम करने के लिए वापस आने के वास्तव में कभी नहीं की जरूरत है,
इसलिए बजाय मैं सिर्फ 99 के साथ इस तर्क की जगह और फिर बार शुरू सब कुछ खत्म.
और फिर इसे फिर से करना होगा और यह वापसी बार (एक्स - 1) तक पहुंच जाएगा,
और एक नया ढेर फ्रेम बनाने के बजाय, यह सिर्फ 98 के साथ अपने वर्तमान तर्क की जगह लेगा
और फिर बार के बहुत शुरुआत में वापस कूद.
उन कार्यों, ढेर पर है कि 1 मूल्य की जगह और शुरू करने के लिए वापस कूद,
बहुत कुशल हैं.
इतना ही नहीं, यह एक अलग समारोह के रूप में एक ही स्मृति उपयोग है जो चलने का है
क्योंकि आप केवल 1 स्टैक फ्रेम का उपयोग कर रहे हैं, लेकिन आप downsides पीड़ित नहीं कर रहे हैं
कार्य कॉल करने वाले की.
कॉलिंग कार्य कुछ हद तक महंगा हो सकता है क्योंकि यह यह सब सेटअप नहीं है
और कटाव और यह सब सामान.
तो यह पूंछ recursion अच्छा है.
[छात्र] यह नए कदम क्यों नहीं बना?
क्योंकि यह पता चलता है कि यह जरूरत नहीं है.
पट्टी करने के लिए कॉल सिर्फ पुनरावर्ती कॉल लौट रहा है.
तो यह वापसी मूल्य के साथ कुछ भी करने की जरूरत नहीं है.
यह सिर्फ इसे तुरंत वापस जा रहा है.
तो यह सिर्फ करने के लिए अपने स्वयं के तर्क को बदलने के लिए और अधिक शुरू करने जा रहा है.
और यह भी, अगर आप पूंछ पुनरावर्ती संस्करण नहीं है,
तो आप इन सभी सलाखों जहां और जब इस बार रिटर्न
यह करने के लिए यह एक अपने मूल्य लौटा, तो यह है कि बार तुरंत रिटर्न
और इस एक के लिए अपने मूल्य देता है, तो यह सिर्फ तुरंत वापस जा रहा है
और इस एक के लिए अपने मूल्य वापस.
तो आप इन सब बातों के ढेर से बंद popping की बचत कर रहे हैं
के बाद वापसी मूल्य के लिए सभी तरह से पारित किया जा वापस वैसे भी जा रहा है.
तो क्यों हमारे तर्क की जगह नहीं है बस अद्यतन तर्क के साथ और अधिक शुरू?
यदि समारोह पुनरावर्ती पूंछ नहीं है, अगर आप की तरह कुछ करते हैं -
[छात्र] यदि बार (x 1 +). >> हाँ.
>> इसलिए यदि आप इसे हालत में डाल दिया है, तो आप वापसी मान के साथ कुछ कर रहे हैं.
या यहाँ तक कि अगर आप सिर्फ 2 वापसी * ​​बार (एक्स - 1).
तो अब पट्टी (एक्स - 1) के क्रम में लौटने की जरूरत के लिए यह है कि मान 2 बार की गणना करने के लिए,
तो अब यह अपनी अलग ढेर फ्रेम की जरूरत नहीं है,
और अब, कोई बात नहीं कितना मुश्किल आप कोशिश करते हैं, आप करने की आवश्यकता जा रहे हैं -
यह पूंछ पुनरावर्ती नहीं है.
[छात्र] मैं एक पूंछ recursion के लिए लक्ष्य एक recursion लाने की कोशिश करेगा -
[] एक आदर्श दुनिया में Bowden, लेकिन CS50 में आप नहीं है.
आदेश में पूंछ recursion प्राप्त करने के लिए, आम तौर पर, आप एक अतिरिक्त तर्क सेट
जहां बार y में int x ले जाएगा
और y अंतिम बात आप को वापस चाहते हैं से मेल खाती है.
(X 1), 2 * y तो फिर इस बार लौट जा रहे हैं.
तो यह है कि सिर्फ एक उच्च स्तर के तुम कैसे चीजों को पूंछ पुनरावर्ती करने के लिए बदलने.
लेकिन अतिरिक्त तर्क -
और फिर अंत में जब आप अपने आधार के मामले तक पहुँचने, तुम सिर्फ y लौटने के
क्योंकि आप पूरे समय वापसी मान है कि आप चाहते हैं जमा है.
यह आप की तरह किया गया है iteratively कर रही है, लेकिन पुनरावर्ती फोन का उपयोग कर.
प्रश्न?
सूचक गणित के बारे में हो सकता है कि जब तार का उपयोग कर की तरह, [छात्र]. ज़रूर. >>
सूचक गणित.
जब तार का उपयोग यह आसान है क्योंकि तार चार तारे हैं,
घर का काम हमेशा के लिए और हमेशा एक बाइट,
और तो सूचक गणित नियमित गणित जब आप तार के साथ काम कर रहे हैं के लिए बराबर है.
चलो बस चार * s = "नमस्ते" कहते हैं.
तो हम स्मृति में एक ब्लॉक है.
यह 6 बाइट्स की जरूरत है क्योंकि आप हमेशा अशक्त टर्मिनेटर की जरूरत है.
और चार * इस सरणी की शुरुआत करने के लिए बात करने के लिए जा रहा है.
तो वहाँ अंक.
अब, यह मूल रूप से किसी सरणी कैसे काम करती है,
चाहे वह malloc या यह ढेर पर है कि क्या एक वापसी की परवाह किए बिना.
कोई सरणी मूलतः सरणी के शुरू करने के लिए एक सूचक है,
और फिर किसी भी सरणी आपरेशन, किसी भी अनुक्रमण, बस उस सरणी में जा रहा है एक निश्चित ऑफसेट.
>> तो जब मैं [3] एस की तरह कुछ का कहना है, यह एस के लिए जा रहा है और अंदर 3 चार्स गिनती
तो [3] हम 0, 1, 2, 3, इतना [3] इस एल का उल्लेख करने के लिए जा रहा है.
[छात्र] और हम + s 3 कर रही है और तब कोष्ठकों सितारा द्वारा एक ही मूल्य तक पहुंच सकता है?
हां.
यह * (+ 3) के बराबर है,
और कहा कि हमेशा के लिए और हमेशा बराबर कोई फर्क नहीं पड़ता कि तुम क्या करना है.
आप की जरूरत कभी नहीं ब्रैकेट सिंटैक्स का उपयोग.
तुम हमेशा * वाक्यविन्यास (3 + ओं) का उपयोग कर सकते हैं.
लोगों ब्रैकेट वाक्यविन्यास की तरह करते हैं, हालांकि.
[छात्र] तो सभी arrays वास्तव में सिर्फ संकेत हैं.
वहाँ एक मामूली अंतर है जब मैं कहता हूँ int x [4]; >> [छात्र] करता है कि स्मृति बना?
[Bowden] यह ढेर पर 4 ints बनाने के लिए है, तो 16 बाइट्स समग्र जा रहा है.
यह ढेर पर 16 बाइट्स बनाने जा रहा है.
x कहीं भी संग्रहीत नहीं है.
यह सिर्फ एक बात की शुरू करने के लिए बात का प्रतीक है.
क्योंकि आप इस समारोह के अंदर सरणी की घोषणा की है,
संकलक क्या करने जा रहा है सिर्फ चर x के सभी मामलों की जगह
जहां यह करने के लिए इन 16 बाइट्स डाल चुन हुआ.
ऐसा लगता है कि चार * के साथ नहीं कर सकते हैं क्योंकि यह एक वास्तविक सूचक है.
यह तो अन्य बातों के लिए बात करने के लिए स्वतंत्र है.
x एक स्थिर है. आप इसे एक अलग सरणी बिंदु नहीं हो सकता. >> [छात्र] ठीक है.
लेकिन इस विचार है, इस अनुक्रमण, उसी की परवाह किए बिना यह है कि क्या यह एक पारंपरिक सरणी
या अगर यह कुछ या अगर एक सूचक है यह एक malloced सरणी के लिए एक सूचक है.
और वास्तव में, यह इतना बराबर है कि वह भी एक ही बात है.
यह वास्तव में सिर्फ तब्दील कोष्ठक के अंदर क्या है और क्या कोष्ठक के छोड़ दिया है,
उन्हें एक साथ कहते हैं, और dereferences.
तो यह बस के रूप में रूप में मान्य है * (+ 3) या एस [3].
[छात्र] आप 2 - आयामी arrays की ओर इशारा करते हुए संकेत मिल सकता है?
>> यह कठिन है. परंपरागत रूप से, नहीं.
एक 2 आयामी सरणी सिर्फ कुछ सुविधाजनक वाक्यविन्यास के साथ एक एक आयामी सरणी है
क्योंकि जब मैं कहता हूँ int x [3] [3], यह वास्तव में सिर्फ 9 मूल्यों के साथ 1 सरणी है.
और इसलिए जब मैं सूचकांक, संकलक जानता है कि मैं क्या मतलब है.
अगर मैं कहूँ कि एक्स [1] [2], यह जानता है कि मैं दूसरी पंक्ति के लिए जाना चाहते हैं, तो यह पहले 3 छोड़ जा रहा है,
और फिर यह दूसरी बात है कि में है, तो यह इस एक मिल रहा है चाहता है.
लेकिन यह अभी भी एक एक आयामी सरणी है.
और यदि ऐसा है तो मैं उस सरणी के लिए एक सूचक असाइन करना चाहता था,
मैं कहना चाहूँगा int * p = x;
सिर्फ एक्स के प्रकार है -
यह एक्स के किसी न किसी प्रकार कह रही है क्योंकि यह सिर्फ एक प्रतीक है और यह एक वास्तविक चर नहीं है,
लेकिन यह सिर्फ एक int * है.
x सिर्फ इस के शुरू करने के लिए एक सूचक है. >> [छात्र] ठीक है.
और इसलिए मैं [1] [2] का उपयोग करने में सक्षम नहीं होगा.
मुझे लगता है कि वहाँ एक सूचक की घोषणा करने के लिए विशेष वाक्यविन्यास है,
int तरह हास्यास्पद कुछ (* [पी - मैं बिल्कुल हास्यास्पद कुछ भी पता नहीं है.
लेकिन वहाँ कोष्ठक और चीजों के साथ की तरह संकेत घोषित करने के लिए एक वाक्य रचना है.
यह भी आप ऐसा नहीं हो सकता है.
मैं वापस कुछ है कि मुझे सच बताना होगा पर लग सकता है.
मैं इसके लिए बाद में दिखेगा, अगर वहाँ बिंदु के लिए एक वाक्य रचना है. लेकिन आप यह कभी नहीं देखेंगे.
और भी वाक्यविन्यास तो पुरातन है कि अगर आप इसे उपयोग करते हैं, लोगों को चकित किया जाएगा.
बहुआयामी arrays बहुत दुर्लभ हैं के रूप में यह है.
तुम बहुत सुंदर -
वैसे, अगर आप मैट्रिक्स बातें कर रहे हैं के लिए दुर्लभ हो नहीं जा रहा है,
लेकिन सी में आप शायद ही कभी बहुआयामी arrays का उपयोग करने जा रहे हैं.
हाँ. >> [छात्र] चलो कहते हैं कि आप एक बहुत लंबे समय सरणी है.
>> आभासी स्मृति में तो यह सब लगातार होना प्रकट होता है,
ठीक एक दूसरे के बगल में तत्वों की तरह,
लेकिन भौतिक स्मृति में, यह संभव है कि के लिए विभाजित करने के लिए होगा? हाँ. >>
कैसे आभासी स्मृति काम करता है, यह सिर्फ अलग -
आवंटन की इकाई एक पृष्ठ है, जो 4 किलोबाइट हो जाता है,
और इसलिए जब एक प्रक्रिया कहते हैं, अरे, मैं इस स्मृति का उपयोग करना चाहते हैं,
ऑपरेटिंग सिस्टम के लिए यह स्मृति के उस छोटे से ब्लॉक के लिए 4 किलोबाइट का आवंटन करने के लिए जा रहा है.
यहां तक ​​कि अगर आप केवल स्मृति के पूरे ब्लॉक में एक छोटे से बाइट का उपयोग करते हैं,
ऑपरेटिंग सिस्टम के लिए यह पूरा 4 किलोबाइट दे रहा है.
तो क्या इसका मतलब यह है कि मैं हो सकता है - चलो कहना है कि यह मेरे चुकी है.
इस ढेर को अलग किया जा सकता है. मेरा ढेर मेगाबाइट और मेगाबाइट हो सकता है.
मेरा ढेर बड़ा हो सकता है.
लेकिन ढेर ही अलग - अलग पृष्ठों में विभाजित हो गया है,
जो अगर हम यहाँ पर दिखेगा का कहना है कि यह हमारे रैम है,
अगर मैं राम का 2 गीगाबाइट है, यह मेरे राम के 0 बाइट की तरह वास्तविक पते 0 है,
और यह 2 गीगाबाइट नीचे सभी तरह यहाँ है.
तो इस पृष्ठ यहाँ पर इस ब्लॉक के अनुरूप कर सकते हैं.
इस पृष्ठ यहाँ पर इस ब्लॉक के अनुरूप कर सकते हैं.
यह एक यहाँ पर एक के अनुरूप कर सकते हैं.
तो ऑपरेटिंग सिस्टम भौतिक स्मृति आवंटित करने के लिए स्वतंत्र है
किसी भी व्यक्ति को मनमाने ढंग से पेज.
और इसका मतलब है कि अगर इस सीमा के लिए एक सरणी पैर फैलाकर बैठना होता है,
एक सरणी के लिए इस बात का नहीं छोड़ा जा सकता होता है और एक पृष्ठ के इस आदेश की सही,
तो उस सरणी के लिए भौतिक स्मृति में विभाजित किया जा रहा है.
और फिर जब आप कार्यक्रम छोड़ दिया, जब प्रक्रिया समाप्त हो जाती है,
इन मैपिंग मिटा मिलता है और फिर इसे करने के लिए अन्य बातों के लिए इन छोटे ब्लॉकों का उपयोग करने के लिए स्वतंत्र है.
और सवाल?
[छात्र] सूचक गणित. >> ओह, हाँ.
स्ट्रिंग्स आसान थे, लेकिन ints की तरह कुछ देख रहे हैं,
तो वापस int x [4];
क्या यह एक सरणी है या क्या यह 4 integers के malloced सरणी के लिए एक सूचक है,
यह उसी तरह का इलाज किया जा रहा है.
[छात्र] तो arrays ढेर पर कर रहे हैं?
[Bowden] Arrays ढेर पर नहीं कर रहे हैं. >> [छात्र] ओह.
>> [Bowden] सरणी के इस प्रकार के ढेर पर हो जाता है
जब तक आप में घोषित वैश्विक चर की अनदेखी. वैश्विक चर का उपयोग नहीं.
अंदर एक समारोह मैं कहता हूँ की int x [4];
यह इस सरणी के लिए ढेर पर एक 4-पूर्णांक ब्लॉक बनाने के लिए जा रहा है.
लेकिन इस malloc (4 * (int) sizeof), ढेर पर जा रहा है.
लेकिन इस बिंदु के बाद मैं बहुत ज्यादा एक ही तरीके में और एक्स पी का उपयोग कर सकते हैं,
मैं अपवाद के बारे में इससे पहले कि आप पी फिरसेआबंटितकरें कर सकते हैं के अलावा अन्य.
तकनीकी तौर पर, उनके आकार कुछ अलग कर रहे हैं, लेकिन वह पूरी तरह से अप्रासंगिक है.
आप उनके आकार वास्तव में इस्तेमाल कभी नहीं.
पी मैं कह सकता p [3] = 2, या एक्स [3] = 2;
आप उन्हें बिल्कुल एक ही तरीके का उपयोग कर सकते हैं.
तो सूचक अब गणित - हाँ.
[छात्र] क्या आप पी * अगर आप कोष्ठक नहीं?
कोष्ठक एक अंतर्निहित भिन्नता हैं. ठीक है. >>
असल में, यह भी आप के साथ कह रहे हैं क्या आप बहुआयामी arrays प्राप्त कर सकते हैं
संकेत के साथ, आप क्या कर सकते हैं की तरह कुछ है, हम कहते हैं, int ** पीपी = malloc (sizeof (int *) * 5);
मैं सिर्फ यह सब बाहर पहले लिख देंगे.
मैं एक है कि नहीं चाहता था.
ठीक है.
क्या मैं यहाँ किया है - यह होना चाहिए पीपी [i].
तो पीपी एक संकेतक के लिए एक सूचक है.
आप पीपी mallocing 5 int सितारों में से एक सरणी को इंगित कर रहे हैं.
तो स्मृति में आप ढेर पीपी पर
यह 5 ब्लॉकों जो सभी कर रहे हैं खुद संकेत की एक सरणी में बात करने जा रहा है.
और फिर जब मैं यहाँ malloc, मैं malloc कि उन व्यक्तिगत संकेत के प्रत्येक
ढेर पर 4 बाइट्स की एक अलग ब्लॉक करने के लिए बात करनी चाहिए.
तो 4 बाइट्स के लिए इस अंक.
और एक अलग 4 बाइट्स इस एक अंक.
>> और उन सभी को अपने स्वयं के 4 बाइट्स को इंगित.
यह मेरे बहुआयामी बातें कर रही का एक तरीका देता है.
मैं पीपी [3] [4], लेकिन अब यह एक ही बात नहीं है, के रूप में बहुआयामी arrays कह सकते हैं
क्योंकि बहुआयामी arrays [3] [4] में एक एकल x सरणी में ऑफसेट. अनुवाद
इस dereferences पी, 3 सूचकांक accesses, तो dereferences कि
और accesses - 4 अवैध होगा - 2 सूचकांक.
जबकि जब हम int x [3] [4] के रूप में एक बहुआयामी सरणी पहले
और जब आप ब्रैकेट डबल वास्तव में केवल एक ही भिन्नता है,
आप एक ही सूचक का पालन कर रहे हैं और फिर एक ऑफसेट,
यह वास्तव में 2 डी संदर्भ है.
आप 2 अलग - अलग संकेत का पालन करें.
तो यह भी तकनीकी रूप से अनुमति देता है कि आप बहुआयामी arrays
जहां प्रत्येक व्यक्ति सरणी विभिन्न आकारों है.
तो मुझे लगता है दांतेदार बहुआयामी arrays क्या यह कहा जाता है
वास्तव में पहली बात कुछ है कि 10 तत्व है करने के लिए बात कर सकता है के बाद से,
दूसरी बात यह है कि 100 तत्व है कुछ करने के लिए बात कर सकता है.
[छात्र] वहाँ संकेत हो सकता है आप की संख्या के लिए किसी भी सीमा है
अन्य संकेत की ओर इशारा करते हैं? >> सं.
आप ***** int पी हो सकता है.
वापस सूचक गणित - >> [छात्र] ओह. >> हाँ.
[छात्र] अगर मैं int *** पी है और फिर मैं एक dereferencing करते हैं और मैं कहना है कि पी * इस मूल्य के बराबर है,
यह केवल dereferencing के स्तर 1 करने के लिए जा रहा है? हाँ. >>
तो अगर मैं बात यह है कि पिछले सूचक पर इशारा कर रहा है का उपयोग करना चाहते हैं -
तो फिर आप *** पी. ठीक है. >>
तो यह 1 ब्लॉक, एक और ब्लॉक करने के लिए कहते हैं, एक और ब्लॉक करने के लिए अंक पी अंक है.
तो अगर आप * p = कुछ और है, तो आप इस बदल रहे हैं
अब एक अलग खंड करने के लिए बात. ठीक है. >>
>> Bowden [] और अगर इन malloced थे, तो आप अब स्मृति लीक कर दी है
जब तक आप इन में से अलग संदर्भ के लिए होता है
जब से तुम वापस उन लोगों के लिए नहीं मिलता है कि आप सिर्फ दूर फेंक कर सकते हैं.
सूचक गणित.
int x [4]; 4 integers के एक सरणी आवंटित जा रहा है
जहाँ x सरणी की शुरुआत करने के लिए बात करने के लिए जा रहा है.
तो जब मैं एक्स [1] की तरह कुछ का कहना है कि, मैं यह सरणी में 2 पूर्णांक के लिए जाने के लिए इसका मतलब के लिए चाहते हैं,
जो इस एक होगा.
लेकिन वास्तव में, कि सरणी में 4 बाइट्स के बाद से इस पूर्णांक 4 बाइट्स लेता है.
1 की भरपाई तो वास्तव में इसका मतलब है एक 1 की भरपाई
बार जो भी सरणी के प्रकार के आकार.
यह पूर्णांकों की सरणी है, तो यह int की 1 बार आकार जानता है कि जब यह करने के लिए ऑफसेट चाहता.
अन्य वाक्यविन्यास. याद रखें कि यह * (x + 1) के बराबर है;
जब मैं सूचक 1 + का कहना है, कि रिटर्न क्या पता है कि सूचक है भंडारण
प्लस 1 बार सूचक के प्रकार के आकार.
तो अगर एक्स = ox100, तो एक्स 1 + ox104 =.
और आप इस दुरुपयोग और कुछ कह सकते हैं चार तरह ग * = (चार *) x;
और अब सी एक्स के रूप में एक ही पते होने जा रहा है.
ग ox100 के बराबर होने जा रहा है,
लेकिन सी 1 + ox101 के बराबर होने जा रहा है
सूचक गणित के बाद से सूचक का प्रकार है कि आप जोड़ रहे हैं पर निर्भर करता है.
इतनी सी 1 + यह ग में दिखता है, यह एक चार सूचक है, तो यह चार की 1 बार आकार जोड़ने के लिए जा रहा है,
जो हमेशा के लिए एक हो जा रहा है, तो आप 101 मिलता है,
जबकि अगर मैं एक्स, जो भी अभी भी 100 x + 1 104 होने जा रहा है.
[छात्र] आप सी + + क्रम में 1 से अपने सूचक अग्रिम का उपयोग कर सकते हैं?
हाँ, आप यह कर सकते हैं.
आपको लगता है कि एक्स के साथ नहीं है क्योंकि एक्स सिर्फ एक प्रतीक है, यह एक निरंतर है, आप एक्स नहीं बदल सकते हैं.
>> लेकिन ग के लिए सिर्फ एक सूचक होता है, तो सी + + पूरी तरह से वैध है और यह 1 से वेतन वृद्धि होगी.
यदि आप ग सिर्फ एक int * थे, तो सी + + 104 किया जाएगा.
+ + सूचक अंकगणित करता है बस के रूप में ग 1 + सूचक गणित है किया जाएगा.
यह वास्तव में कैसे मर्ज प्रकार की तरह बातें की एक बहुत कुछ है -
चीजों की प्रतियां बनाने के बजाय, आप के बजाय पारित कर सकते हैं -
जैसे कि अगर मैं सरणी के इस आधे पारित करना चाहता था - चलो इस में से कुछ मिटा.
चलो कहते हैं कि मैं एक समारोह में सरणी के इस पक्ष को पारित करना चाहता था.
क्या मैं उस समारोह के लिए पारित होगा?
अगर मैं एक्स के पास, मैं इस पते गुजर रहा हूँ.
लेकिन मैं इस विशेष पते पास करना चाहते हैं. तो मैं क्या पारित करना चाहिए?
[छात्र] सूचक 2 +?
[Bowden] तो x 2 +. हां.
कि इस पते को होने जा रहा है.
तुम भी बहुत बार के रूप में इसे देखेंगे x [2] और फिर उस के पते.
तो तुम यह के पते ले क्योंकि ब्रैकेट एक अंतर्निहित भिन्नता है की जरूरत है.
x [2] मूल्य है कि इस बॉक्स में है करने के लिए संदर्भित करता है, और तो आप कि बॉक्स का पता करना चाहते हैं,
तो आप कह और एक्स [2].
तो यह है कि मर्ज प्रकार में कुछ जहाँ आप कुछ करने के लिए 1/2 सूची पारित करना चाहते हैं
तुम सच में सिर्फ पारित करने के लिए और एक्स [2], और अब जहाँ तक पुनरावर्ती कॉल का संबंध है,
मेरी नई सरणी वहाँ से शुरू होता है.
अंतिम मिनट सवाल.
[छात्र] अगर हम एक ampersand नहीं डाल या एक - कि क्या कहा जाता है? >> स्टार?
[छात्र] स्टार. >> तकनीकी तौर पर, भिन्नता ऑपरेटर, लेकिन - >> [छात्र] भिन्नता.
>> यदि हम एक सितारा या एक एम्परसेंड डाल नहीं है, क्या होता है अगर मैं सिर्फ y का कहना है = एक्स और एक्स एक सूचक है?
Y के प्रकार क्या है? >> [छात्र] मैं सिर्फ यह 2 सूचक कहूँगा.
तो अगर तुम सिर्फ का कहना है कि y = x, अब एक्स और वाई बिंदु एक ही बात करने के लिए. >> एक ही बात करने के लिए [छात्र] प्वाइंट.
और यदि x एक int सूचक है? >> यह है क्योंकि आप संकेत नहीं असाइन कर सकते हैं शिकायत करेंगे.
[छात्र] ठीक है.
याद रखें कि संकेत है, भले ही हम उन्हें तीर के रूप में आकर्षित,
वास्तव में वे दुकान - int * x वास्तव में सभी एक्स भंडारण है ox100 की तरह कुछ है,
जो हम 100 ब्लॉक में संग्रहीत की ओर इशारा करते के रूप में प्रतिनिधित्व करने के लिए होता है.
तो जब मैं कहता हूँ int * y = x; मैं सिर्फ y में हूँ ox100 नकल,
जो हम सिर्फ y के रूप में प्रतिनिधित्व करने जा रहे हैं, भी ox100 की ओर इशारा करते हैं.
और अगर मैं कहता हूँ int i = (int x), तो मैं स्टोर करने के लिए जो भी ox100 के मूल्य जा रहा है
अंदर से है, लेकिन अब यह एक सूचक की बजाय एक पूर्णांक के रूप में व्याख्या की जा जा रहा है.
लेकिन आप कलाकारों की जरूरत है या नहीं यह शिकायत करेंगे.
[छात्र] तो आप के लिए डाली मतलब है -
क्या यह एक्स या y के कास्टिंग int int कास्टिंग किया जा रहा है?
[Bowden] क्या?
[छात्र] ठीक है. इन कोष्ठकों के बाद वहाँ एक एक्स या वहाँ प्र होने जा रहा है?
>> [Bowden] या तो. एक्स और वाई के बराबर हैं. >> [छात्र] ठीक है.
क्योंकि वे दोनों संकेत कर रहे हैं. >> हाँ.
[छात्र] तो यह पूर्णांक के रूप में हेक्साडेसिमल 100 स्टोर होगा? >> [Bowden] हाँ.
लेकिन जो कुछ भी यह करने के लिए अंक का मूल्य नहीं है.
[Bowden] हाँ. >> [छात्र] तो बस पूर्णांक के रूप में पता है. ठीक है.
[Bowden] यदि आप कुछ अजीब कारण के लिए चाहता था,
आप विशेष रूप से संकेत के साथ निपटने के लिए और पूर्णांक के साथ कभी समझौता
और सिर्फ int * x = 0 की तरह हो.
तो आप वास्तव में एक बार सूचक गणित हो रहा शुरू होता है उलझन में मिल जा रहे हैं.
तो संख्या है कि वे दुकान व्यर्थ कर रहे हैं.
ऐसा नहीं है बस आप कैसे अंत में उन्हें व्याख्या.
तो मैं एक int * से ox100 एक int कॉपी करने के लिए स्वतंत्र हूँ,
शायद नहीं ढलाई के लिए पर चिल्लाया जा you're - और मैं असाइन करने के लिए नि: शुल्क कर रहा हूँ -
मैं (int *) इस मनमाना int * में ox1234 तरह कुछ असाइन करने के लिए करने के लिए स्वतंत्र हूँ.
तो ox123 है बस के रूप में मान्य एक स्मृति पते के रूप में y है.
और y कुछ है कि बहुत ज्यादा है ox123 वापस करने के लिए होता है.
[छात्र] कि एक बहुत अच्छा षोडश आधारी दशमलव रूप से करने के लिए जाने के लिए रास्ता होगा,
अगर आप एक सूचक है और आप इसे एक int के रूप में डाली?
[Bowden] तुम सच में सिर्फ printf की तरह उपयोग कर मुद्रित कर सकते हैं.
चलो कहते हैं कि मैं int y = 100 है.
Printf (% d \ n - जैसा कि आप पहले से ही पता होना चाहिए - मुद्रित रूप में एक पूर्णांक% एक्स.
षोडश आधारी रूप में हम सिर्फ यह मुद्रित करेंगे.
तो एक सूचक षोडश आधारी के रूप में संग्रहीत नहीं है,
और एक पूर्णांक दशमलव के रूप में संग्रहीत नहीं है.
सब कुछ बाइनरी रूप में जमा है.
यह सिर्फ है कि हम हेक्सादशमलव के रूप में संकेत दिखाई देते हैं
क्योंकि हम इन 4 बाइट ब्लॉकों में चीजों के बारे में सोचना,
और स्मृति पते के लिए परिचित हो जाते हैं.
हम कर रहे हैं की तरह, अगर यह bf के साथ शुरू होता है, तो यह ढेर पर होना होता है.
तो यह सिर्फ हेक्सादशमलव के रूप में संकेत की हमारी व्याख्या है.
ठीक है. कोई अंतिम सवाल?
>> मैं यहाँ एक बिट के लिए हो सकता है बाद में अगर आप कुछ और है.
और कहा कि उस के अंत है.
>> [छात्र] हाँ! [वाहवाही]
>> [CS50.TV]