[Powered by Google Translate] Pakalbėkime apie structs. Structs pateikti A grupės kintamųjų krūva kartu į gražus paketas. Tai turbūt lengviausia pamatyti pavyzdį iš karto, todėl mes sakome, struct, tada atidaryti garbanotas petnešomis, ir šiame struct, mes turime int amžiaus, char * vardas, ir viskas. Tai gali atrodyti keista, kabliataškiu po garbanotas petnešomis, bet tai iš tikrųjų reikia, su structs. Bet koks neteisingas tipą gali eiti struct apibrėžimą. Čia mes naudojamas int ir char * , bet jūs taip pat galėtų naudoti masyvą, tarkim 100 elementų ar net kitą struct. Kai jūs naudojate structs C, kuriate naujų tipų iš kitų rūšių kolekcija. Čia, mes darome naujo tipo iš sveikojo skaičiaus ir char *. Kaip matysime vėliau, struct tipas yra daug būdais, lygiaverčių bet kokio kito tipo esate pripratę. Paprastai, aš bus lyginami kaip struct tipo sveikojo skaičiaus tipo yra panašus. Nors rašėme kodas galioja C tai nėra labai naudinga, Apsukite metalinis garsas duos mus perspėti. Prisiminkite, kaip structs ir jos yra panašios? Na, mes iš esmės tik pasakė int kuri nėra labai naudinga linija. Todėl galime iš tikrųjų paskelbti šio tipo kintamąjį suteikiant jam prieš kabliataškiu pavadinimą. Mes jį vadiname kintamojo studentas. Dabar mes paskelbė kintamasis vadinamas studentų struct tipo. Kaip mes gauname vidinių kintamųjų struct? Techniniu požiūriu, šių kintamųjų pavadinimai nariai. Norėdami prieiti prie studentų struct nors konkrečioje valstybėje, pridėti tašką kintamojo pavadinimą, po narys norite pavadinimą. Taigi čia, tik 2 galioja galimybės yra student.age student.name. Ir mes galime padaryti kažką panašaus student.age = 12 ir student.name = studentas. Dabar ką daryti, jei mes norėjome padaryti antrą studentas? Jūs manote, nukopijuokite ir įklijuokite šias eilutes ir pakeisti studentui Studentas 2 ar kažką, ir kad dirbs, bet techniškai, studento ir studento 2 neturi tos pačios rūšies. Matote, jūs negalėsite priskirti juos vienas prie kito. Tai yra todėl, kad iki šiol, jūsų struct buvo anonimiški. Turime suteikti jai pavadinimą. Norėdami tai padaryti, mes įterpti struct pavadinimą po žodžio struct. studentas, po apibrėžtį. Mes vis dar galime nedelsiant paskelbti tipo kintamąjį Struct studentas, kaip mes padarėme prieš. Mes jį vadiname S1 Pagal suteikia struct pavadinimą, dabar mes galime naudoti struct studentas beveik tiksliai taip pat, mes naudoti int. Taigi, mes galime paskelbti kintamąjį tipas struct studentas, kaip struct studentas S2. Kaip ir masyvai, structs nuorodų iniciacijos sintaksę, todėl mes galime pasakyti, Struct studentas S2 lygus kairėje garbanotas petnešomis 3, S2. Čia S2.age bus 3, ir S2.name S2. Pagalvokite visų dalykų, kuriuos galite padaryti su int tipo ir dauguma iš jų jūs galite padaryti su struct studentų tipo. Struct studentą mes galime naudoti kaip funkcijos parametras tipo. Mes galime naudoti struct studentas viduje naujos struct. Mes galime turėti rodyklę į struct studentas. Mes galime padaryti dydį struct studentas. Struct studentas tipas kaip ir int tipo. Mes taip pat galime priskirti S1 iki S2 nes abu yra tos pačios rūšies, todėl mes galime padaryti S1 = S2. Kas atsitiks, jei mes darome S1.age = 10? Ar S2 kaita? Vėlgi, manau, tik kaip reguliariai sveikųjų skaičių structs. Jei mes tam tikru int y priskirti šiek tiek int x, kaip x = y ir tada pakeisti X, kaip X + +, Metai pakeisti ne visi? Y neturi pakeisti čia, ir todėl nei S2 aukščiau. S2.age vis dar 3. Tačiau pažymi, kad, kai vieną struct į kitą, visi iš rodykles vis dar rodo tą patį dalyką, nes jie buvo tiesiog nukopijuoti. Jei nenorite būti dalijamasi patarimų, jums reikia dirbti, kad rankiniu būdu, galbūt malicking vieną bloką atminties vieną iš rodykles, kad rodytų į ir kopijuoti duomenis per. Tai gali būti erzina, kad turi rašyti struct studentas visur. Naudojant tipo def, mes galime padaryti tipas def struct ir mes jį vadiname studentas. Dabar mes galime naudoti studentas visur kad mes jį naudoti struct studentas. Šis tipas def yra anoniminė struct ir tai vadina studentas. Bet jei mes taip pat saugo studento identifikavimo žodis struct, Typedef struct studentas, mes galime naudoti ir struct studento ir studento pakaitomis. Jie net nereikia turėti tą patį pavadinimą. Mes galime įvesti def struct studentui Bob ir tada Struct studentų ir Bob būtų keičiamos rūšių. Nepriklausomai nuo tipo def, turime identifikatorių šalia struct jei struct apibrėžimas yra rekursinis. Pavyzdžiui, tipas def Struct mazgas ir jis bus apibrėžiamas kaip int Val ir ji turės rodyklę, kuri nukreipia į kitą struct mazgas. struct mazgas * kitą. Ir tada mes jį vadiname mazgas. Struct yra rekursinis nuo struct mazgo apibrėžimas yra joje rodyklė į struct mazgas. Atkreipkite dėmesį, kad mes turime pasakyti, Struct mazgas * Kitas viduje struct mazgo apibrėžimą, nes tipo def dar nebaigtas leisti mums supaprastinti šią tik mazgas * šalia. Sužinosite daugiau apie structs, panašių į šį kai sprendžiami su sujungtų sąrašų ir medžių. Ką apie structs funkcijos? Tai taip pat puikiai tinka. Mes galėjome netekti funkcijas kuris trunka kaip argumentas, studentas ai ir daro kažką su šio studento. Ir tada mes galime perduoti jį kaip studentų struct, kaip taip. Funk S1 nuo iki. Struct elgiasi tiksliai taip, kaip sveikasis skaičius, kai perduodama į funkciją. Funk gauna S1 kopiją ir todėl negali pakeisti S1; , o tik jo kopija, saugomas S. Jei norite, kad funkcija, kad būtų galima pakeisti S1, funkcija reikės imtis studento * s, , ir jūs turite perduoti S1 adresą, kaip tiek. Studentas * S, funkcio & S1. Yra dar viena priežastis, praeiti adresą čia. Ką daryti, jei mūsų struct 100 laukus? Kiekvieną kartą mes pereiname studentui funk, mūsų programa reikia nukopijuoti visi iš tų 100 sričių į FUNC argumentas S, net jei ji niekada naudoja didžiąją dalį jų. Taigi, net jei funkcija neplanuoja pakeisti studentas, jei vis dar gali būti vertingas praeiti adresą. Gerai, ką daryti, jei mes norime sukurti rodyklę į struct? Mes galime padaryti kažką panašaus studentas * S lygus malloc Studento dydis. Atkreipkite dėmesį, kad vis dar čia dirba dydį. Taigi, kaip mes dabar pasiekti amžius Valstybės blokas, S taškų? Jūs galite galvoti, kad padaryti * S.age = 4, tačiau tai ne visada veikia. , Nes tai bus tikrai būti aiškinama kaip * S.age skliausteliuose = 4, nebus net kaupti, nes S nėra struct ar veikiau rodyklė į struct, ir taškas neveikia čia. Mes galime padaryti (* S). Amžius = 4 bet skliausteliuose galite gauti erzina ir paini. Laimei, mes turime specialų rodyklės operatorių kad atrodo kažkas panašaus S-> amžius = 4. Šie 2 būdai nuorodas amžius yra lygiaverčiai ir mes ne tikrai kada nors reikia rodyklės operatorių, tačiau tai daro, viskas atrodo gražiau. Kadangi S yra rodyklė į tam tikrą atminties bloko, kuriame struct, jūs galite galvoti s> amžiaus sekti rodyklę rodyklę ir patraukti amžiaus narį. Taigi, kodėl mes turėtume kada nors naudoti structs? Tai tikrai galima išsisukti tik primityvių sveikieji skaičiai, simbolių, rodyklės ir panašūs , kad esame įpratę; vietoj S1 ir S2 - prieš mes galėjo age1, age2, NAME1 ir NAME2 visi skirtingu kintamųjų. Tai yra gerai, tik 2 studentų, bet ką daryti, jei mes turėjome 10 iš jų? Ir ką daryti, jei vietoj tik 2 laukai, studentas struct 100 laukus? VPS, kursai, plaukų spalva, lytis, ir pan. Vietoj to, kad vos už 10 structs, mes turime 1000 atskirus kintamuosius. Be to, mano funkciją , kad mano, kad struct su 100 laukų su jo vienintelis argumentas ir spausdina visus laukus. Jei mes ne naudoti struct kiekvieną kartą, mes vadiname šią funkciją, mes turime praeiti visais 100 kintamųjų, ir jei mes turime 100 kintamųjų Studentas 1 ir 100 kintamųjų Studentas 2, mes turime būti tikri, kad mes ne atsitiktinai perduoti keletą kintamųjų, nuo studento 1 ir kai kurie iš 2 studentas kintamieji. Tai neįmanoma padaryti, kad klaida su struct, nuo 100 kintamieji pateikiami viename pakete. Tik pora Baigiamosios pastabos: Jeigu jūs suprato viską, ką iki šio taško, puikus. Vaizdo poilsio tik komplektui labui. Nes structs gali turėti bet kokio tipo žymeklis, jie taip pat gali turėti funkcijos rodiklius. Jei esate susipažinę su objektinio programavimo, tai, kaip naudoti structs programos objektinio stiliaus. Daugiau informacijos apie funkcijos rodiklius kitu laiku. Be to, kartais jums gali tekti 2 structs kurių apibrėžimai priklauso vienas nuo kito. Pavyzdžiui, galėtume turėti struct kuris yra apibrėžiamas kaip rodyklė į struct B, struct B * X ir dabar mes galime turėti struct B kuri apibrėžiama kaip rodykle struct, struct * Y. Bet tai nebus sudaryti, Struct B neegzistuoja Struct yra sudaromas kas pusmetį tuo metu. Ir jei mes apsikeitimo struct, ir struct B , tada ir mes tiesiog paliko su ta pačia problema; Šiuo metu su Struct ne esama. Norėdami išspręsti šią problemą, mes galime parašyti struct B; prieš struct A. apibrėžimo Tai vadinama priekį deklaraciją. Tai tik leidžia sudarytojas žinoti, kad struct B yra neteisingas tipą, kuris bus išsamiai apibrėžtos vėliau arba kitur. My name is Rob Bowden, ir tai yra CS50. [CS50.TV]