[Powered by Google Translate] चलो structs के बारे में बात करते हैं.
Structs हमें एक चर का एक गुच्छा एक साथ समूहीकृत साथ प्रदान
एक अच्छा पैकेज में.
यह शायद आसान करने के लिए एक उदाहरण अभी देखते हैं,
तो हम कहते हैं कि संरचना,
तो धनु धनुकोष्ठक खोलने,
और इस struct में, हम एक int उम्र होगा,
एक चार * नाम,
और यह बात है.
यह एक सेमीकोलन के साथ धनु धनुकोष्ठक के बाद अजीब लग सकता है,
लेकिन यह वास्तव में structs के साथ आवश्यक है.
कोई मान्य प्रकार struct परिभाषा के भीतर जा सकते हैं.
यहाँ, हम एक int और एक चार * उपयोग किया है,
लेकिन आप भी एक सरणी का उपयोग सकता है, कहने का, 100 तत्वों
या यहाँ तक कि एक और struct.
जब तुम सी में structs का उपयोग कर रहे हैं,
आप नए प्रकार का निर्माण कर रहे हैं
बाहर अन्य प्रकार के एक संग्रह की.
यहाँ, हम कर रहे हैं एक नए प्रकार
बाहर एक पूर्णांक और एक चार * के.
जैसा कि हम बाद में देखेंगे, एक struct प्रकार
किसी भी अन्य प्रकार आप इस्तेमाल कर रहे हैं बराबर तरीके का एक बहुत में है.
आमतौर पर, मैं एक struct को किस प्रकार की तुलना हो जाएगा
एक पूर्णांक प्रकार के लिए इसी तरह की है.
जबकि कोड लिखा मान्य सी है,
यह बहुत उपयोगी नहीं है,
और बजना हमें एक चेतावनी दे देंगे.
याद है कैसे structs और उसके समान हैं?
खैर, हम मूल रूप से सिर्फ इतना कहा
int,
जो एक बहुत ही उपयोगी लाइन नहीं है.
तो चलो वास्तव में उस प्रकार के एक चर घोषणा
यह सेमीकोलन से पहले एक नाम देकर.
हम चर छात्र फोन करता हूँ.
अब हम एक चर बुलाया छात्र की घोषणा की है
struct द्वारा दिए गए प्रकार के साथ.
हम struct अंदर चर के लिए कैसे मिलता है?
तकनीकी तौर पर, इन चर के लिए नाम
सदस्य हैं.
एक छात्र struct में किसी विशेष सदस्य का उपयोग करने के लिए,
आप चर नाम एक डॉट संलग्न है,
सदस्य आप चाहते हैं के नाम से पीछा किया.
तो यहाँ केवल 2 वैध संभावित जगह
student.age हैं
और student.name.
और हम कुछ ऐसा कर सकते हैं
student.age = 12
और student.name = छात्र.
अब क्या हुआ अगर हम एक दूसरे छात्र को बनाना चाहते थे?
आप इन लाइनों को कॉपी और पेस्ट लगता है कि हो सकता है
और 2 छात्र या कुछ छात्र बदलने के लिए,
और कहा कि काम करेंगे,
लेकिन तकनीकी रूप से छात्र और 2 छात्र
एक ही प्रकार की नहीं है.
देखो, तुम उन्हें एक दूसरे से आवंटित करने में सक्षम नहीं होगा.
इसका कारण यह है, इतनी दूर है,
अपने struct गुमनाम किया गया है.
हम इसे एक नाम देने की जरूरत है.
करना है कि, हम struct का नाम सम्मिलित
शब्द struct के बाद.
छात्र,
परिभाषा के द्वारा पीछा किया.
हम अभी भी तुरंत प्रकार की एक चर की घोषणा कर सकते हैं
छात्र struct, जैसे हम पहले किया था.
हम इसे S1 फोन करता हूँ
Struct एक नाम देने,
हम अब struct छात्र का उपयोग कर सकते हैं
लगभग ठीक उसी तरह से हम int का प्रयोग करेंगे.
तो हम एक चर प्रकार struct छात्र की घोषणा कर सकते हैं,
जैसा
संरचना छात्र S2.
Arrays की तरह, structs एक शॉर्टकट initialization वाक्यविन्यास प्रदान करते हैं,
तो हम कहते हैं, छात्र S2 struct सकते हैं
के बराबर होती है
छोड़ दिया घुंघराले 3 गले लगा, S2.
यहाँ, S2.age 3 होगा,
और S2.name S2 के लिए बात करेंगे.
एक int प्रकार के साथ सभी चीजें आप कर सकते के बारे में सोचो
और उनमें से ज्यादातर आप एक struct छात्र प्रकार के साथ कर सकते हैं.
हम एक समारोह पैरामीटर के एक प्रकार के रूप में एक struct के छात्र का उपयोग कर सकते हैं.
हम एक नया struct के अंदर struct छात्र का उपयोग कर सकते हैं.
हम एक struct के छात्र के लिए एक सूचक हो सकता है.
हम struct छात्र के आकार कर सकते हैं.
Struct छात्र एक प्रकार है
int की तरह ही एक प्रकार है.
हम भी S2 S1 असाइन कर सकते हैं
के बाद से दोनों एक ही प्रकार के हैं, तो हम क्या कर सकते हैं
S1 = S2.
क्या होता है अगर हम करते हैं
S1.age = 10?
S2 परिवर्तन सब पर करता है?
फिर, नियमित रूप integers बस के रूप में structs के बारे में सोचना.
यदि हम कुछ int y कुछ int x असाइन करते हैं,
एक्स = Y की तरह
और फिर एक्स बदलने के लिए,
के रूप में एक्स + +,
करता Y सब पर बदल?
वाई यहाँ नहीं बदलने के लिए, करता है और इसलिए न तो ऊपर S2 करता है.
S2.age अभी भी 3.
लेकिन ध्यान दें कि जब दूसरे के लिए एक struct बताए
संकेत के सभी अभी भी एक ही बात करने के लिए बात करते हैं,
क्योंकि वे सिर्फ नकल थे.
यदि आप संकेत साझा करने के लिए नहीं करना चाहते,
आप स्वयं को संभालने की जरूरत होगी कि,
शायद एक संकेत के लिए स्मृति का एक ब्लॉक malicking से बात करने के लिए
और डेटा नकल पर.
यह struct छात्र हर जगह लिखने के लिए कष्टप्रद हो सकता है.
एक प्रकार def का उपयोग करना, हम कर सकते हैं
प्रकार डीईएफ़
संरचना
और हम यह छात्र फोन करता हूँ.
अब, हम छात्र हर जगह का उपयोग कर सकते हैं
कि हम struct छात्र का उपयोग करने के लिए प्रयोग किया जाता है.
इस प्रकार def एक गुमनाम struct
और यह छात्र कहता है.
लेकिन अगर हम भी छात्र पहचानकर्ता रखने
शब्द struct के बगल में, typedef struct छात्र के रूप में,
हम दोनों struct छात्र और छात्र interchangeably अब इस्तेमाल कर सकते हैं.
वे भी एक ही नाम नहीं है.
हम बॉब के लिए def struct छात्र टाइप कर सकते हैं
और तो छात्र और बॉब struct
विनिमेय प्रकार होगा.
प्रकार डीईएफ़ के बावजूद,
हम अगले पहचानकर्ता struct की जरूरत
अगर struct की परिभाषा
पुनरावर्ती है.
उदाहरण के लिए,
प्रकार def struct नोड
और यह एक int वैल के रूप में परिभाषित किया जाएगा
और यह एक सूचक है कि एक और struct नोड के लिए अंक होगा.
के रूप में struct * अगले नोड में.
और फिर हम यह नोड फोन करता हूँ.
यह struct पुनरावर्ती है,
के बाद से struct नोड की परिभाषा के भीतर इसे शामिल
एक struct नोड के लिए एक सूचक है.
सूचना है कि हम struct नोड अगले * कहना है
struct नोड की परिभाषा के अंदर,
प्रकार डीईएफ़ के बाद से अभी तक खत्म नहीं की अनुमति हमें इस सरल करने के लिए
सिर्फ नोड * अगले.
आप इस के समान structs के बारे में और अधिक जानने के लिए
लिंक सूचियों और पेड़ों के साथ जब काम कर रहे हैं.
एक समारोह में structs के बारे में क्या?
यह भी पूरी तरह से वैध है.
हम हो सकता है
समारोह शून्य
जो एक तर्क के रूप में लेता है,
छात्र है
और है कि छात्र के साथ कुछ भी नहीं करती है.
और फिर हम जैसे इतना छात्र struct के रूप में इसे पारित कर सकते हैं.
समारोह पहले से S1 की.
struct बर्ताव करता है
वास्तव में एक पूर्णांक के रूप में जब एक समारोह के लिए पारित किया जाएगा.
समारोह S1 की एक प्रतिलिपि प्राप्त
और इसलिए S1 संशोधित नहीं कर सकते हैं;
बल्कि, केवल यह की नकल है कि एस में संग्रहित है
यदि आप चाहते हैं समारोह S1 को संशोधित करने में सक्षम होने के लिए,
समारोह के लिए एक छात्र * एस लेने की आवश्यकता होगी,
और आप इस तरह से पता S1, पारित करना होगा.
छात्र * एस समारोह, और S1.
वहाँ एक और पते के आधार पर पारित करने के लिए एक कारण है.
क्या होगा अगर हमारे में struct 100 क्षेत्रों निहित है?
हर बार हम समारोह के लिए एक छात्र के पास,
हमारे कार्यक्रम समारोह तर्क एस में उन 100 क्षेत्रों के सभी नकल की जरूरत है,
भी अगर यह कभी उनमें से अधिकांश का उपयोग करता है.
तो भी अगर समारोह छात्र को संशोधित करने पर योजना नहीं है,
अगर अभी भी पता द्वारा पारित करने के लिए मूल्यवान हो सकता है.
ठीक है, क्या होगा अगर हम एक struct के लिए एक सूचक बनाना चाहते हैं?
हम कुछ इस तरह कर सकता है
छात्र * एस
malloc के बराबर होती है
छात्र के आकार.
सूचना है कि अभी भी यहाँ काम करता है आकार.
तो कैसे हम अब उम्र सदस्य का उपयोग
ब्लॉक के एस अंक के लिए है?
आप पहली बार ऐसा लगता है कि हो सकता है
* = S.age 4,
लेकिन यह काफी काम नहीं करेगा.
चूंकि यह सच के रूप में व्याख्या हो जाएगा
* = 4 कोष्ठक में S.age,
जो भी संकलन नहीं होगा,
के बाद से एक नहीं बल्कि या struct एक struct सूचक नहीं है,
और इसलिए डॉट यहाँ काम नहीं करेगा.
हम क्या कर सकते हैं
(*) = 4 उम्र
लेकिन कोष्ठकों कष्टप्रद और भ्रमित हो सकता है.
शुक्र है, हम एक विशेष तीर ऑपरेटर
कि कुछ की तरह लग रहा है
एस उम्र> = 4.
संदर्भित उम्र के इन 2 तरीके
बराबर हैं
और हम वास्तव में कभी तीर ऑपरेटर की जरूरत नहीं करते हैं,
लेकिन यह करता है बातें अच्छे लग रहे हैं.
चूंकि S स्मृति के कुछ ब्लॉक कि struct शामिल करने के लिए एक सूचक है,
आप एस> उम्र के बारे में सोच के रूप में सूचक तीर का पालन कर सकते हैं
और उम्र के सदस्य हड़पने.
तो हम कभी क्यों structs इस्तेमाल करना चाहिए?
यह निश्चित रूप से संभव है सिर्फ आदिम integers के साथ दूर चले जाओ,
घर का काम, संकेत और इस तरह
कि हम करने के लिए इस्तेमाल कर रहे हैं;
बजाय S1 और S2 से पहले,
हम age1, age2, NAME1, और NAME2 था हो सकता है
सभी अलग - अलग चर में.
यह केवल 2 छात्रों के साथ ठीक है,
लेकिन क्या होगा अगर हम उनमें से 10 था?
और अगर के बजाय केवल 2 क्षेत्रों,
छात्र struct 100 क्षेत्रों था?
GPA, पाठ्यक्रम, बालों का रंग, लिंग, और इतने पर.
सिर्फ 10 structs के बजाय, हम 1,000 अलग चर की जरूरत है.
इसके अलावा, एक समारोह पर विचार
कि 100 क्षेत्रों के साथ अपने ही तर्क के साथ कि struct लेता है
और बाहर के सभी क्षेत्रों के निशान.
यदि हम एक struct उपयोग नहीं किया,
हर समय हम उस समारोह कॉल,
हम सभी 100 चर में पारित करने की जरूरत है,
और अगर हम एक छात्र के लिए 100 चर है,
और 2 के छात्र के लिए 100 चर,
हमें यकीन है कि हम गलती से 1 छात्र से कुछ चर पारित नहीं होने की जरूरत है
और 2 छात्र से कुछ चर.
यह असंभव है एक struct के साथ कि गलती मत करना,
के बाद सभी 100 चर एक पैकेज में समाहित कर रहे हैं.
बस अंतिम नोटों की एक जोड़ी:
यदि आप इस बिंदु तक सब कुछ, महान समझा है.
वीडियो के बाकी 'पूर्णता की खातिर है.
क्योंकि structs सूचक के किसी भी प्रकार के पकड़ सकते हैं,
वे भी समारोह संकेत पकड़ सकते हैं.
यदि आप वस्तु उन्मुख प्रोग्रामिंग के साथ परिचित हैं,
यह करने के लिए एक कार्यक्रम के लिए एक वस्तु उन्मुख शैली में structs का उपयोग करने के लिए एक रास्ता प्रदान करता है.
समारोह संकेत पर एक और समय पर.
इसके अलावा, कभी कभी आप दो structs हो सकता है
जिसका परिभाषाओं का एक दूसरे पर निर्भर हैं.
उदाहरण के लिए,
हम संरचना एक हो सकता है,
जो के रूप में परिभाषित किया गया है
एक struct बी करने के लिए एक सूचक है,
struct बी * एक्स,
और अब हम एक struct बी हो सकता है
जो एक संकेत के रूप में परिभाषित किया गया है
एक struct एक करने के लिए,
struct * एक वाई
लेकिन यह संकलन नहीं होगा,
के बाद से struct बी कि struct एक संकलित किया जा रहा है समय पर मौजूद नहीं है.
और अगर हम एक संरचना और संरचना स्वैप बी,
तो हम सिर्फ एक ही समस्या के साथ छोड़ दिया था;
इस समय के साथ मौजूदा एक struct.
इस को हल करने के लिए, हम लिख सकते हैं
struct बी,
ए संरचना की परिभाषा से पहले
यह एक आगे घोषणा कहा जाता है.
यह सिर्फ संकलक पता देता है कि
struct बी एक वैध प्रकार है कि पूरी तरह से बाद में या कहीं और परिभाषित किया जाएगा है.
मेरा नाम रोब Bowden है, और इस CS50 है.
[CS50.TV]