[Powered by Google Translate] Við skulum tala um structs. Structs gefa okkur leið til hóp fullt af breytum saman í a ágætur pakki. Það er líklega auðveldast að sjá dæmi strax, svo við segjum strúktúr, þá opna hrokkið Brace, og í þessum strúktúr, munum við hafa int aldri, a char * nafn, og það er það. Það kann að virðast skrýtið með semíkommu eftir hrokkið borsveif, en það er í raun nauðsynlegt structs. Hvaða gildi tegund getur farið í strúktúrinn skilgreiningu. Hér höfum við notað að int og char *, en þú getur líka notað fylki, um að segja, 100 þætti eða jafnvel annað strúktúr. Þegar þú ert að nota structs í C, þú ert að búa til nýjar tegundir út af safni af öðrum tegundum. Hér erum við að gera nýja tegund út af heiltölu og char *. Eins og við munum sjá síðar, a struct tegund er í a einhver fjöldi af lifnaðarhættir sem jafngilda öðrum tegund þú átt að venjast. Venjulega, ég er að bera saman hvernig strúktúr tegund er svipað heiltala tegund. Þó að númerið sem við skrifaði gildir C, það er ekki mjög gagnlegt, og clang mun gefa okkur viðvörun. Mundu hvernig structs og þess eru svipuð? Jæja, í grundvallaratriðum við bara segja int, sem er ekki mjög gagnlegt línu. Svo skulum í raun að lýsa yfir breytu af þeirri tegund með því að gefa honum nafn áður en semíkommu. Við munum hringja í breytilega nemanda. Nú höfum við lýst breytilega kallað nemandi við gerð gefið af strúktúr. Hvernig fáum við til breytur inni strúktúr? Tæknilega, nöfn fyrir þessar breytur eru meðlimir. Til að fá aðgang að þeim tiltekna félagi í nemanda struct, þú auka punkt að breyta nafni, eftir nafni félagi þú vilt. Svo hér, aðeins 2 gild möguleikar eru student.age og student.name. Og við getum gert eitthvað eins og student.age = 12 og student.name = nemanda. Nú hvað ef við vildum að gera annað nemanda? Þú gætir held að afrita og líma þessar línur og breyta nemanda til nemanda 2 eða eitthvað, og sem vilja vinna, en tæknilega, nemandi og nemandi 2 hafa ekki sömu gerð. Sjá, þú munt ekki vera fær um að framselja þá til annars. Þetta er vegna þess, að svo miklu leyti, struct hefur verið nafnlaus. Við þurfum að gefa honum nafn. Til að gera það, setja við nafnið á strúktúr eftir orðinu strúktúr. nemandi, eftir skilgreiningar. Við getum samt strax lýsa yfir breytu af tegund strúktúr nemanda, eins og við gerðum áður. Við munum kalla það S1 Með því að gefa struct nafn, við getum nú notað struct nemanda í næstum nákvæmlega sama hátt við myndum nota int. Þannig að við getum lýst breytu af tegund strúktúrinn nemanda, eins og struct nemandi S2. Eins og fylki, veita structs á frumstilling smákaka setningafræði, þannig að við getum sagt, strúktúr nemandi S2 jafngildir vinstri hrokkið Brace 3, S2. Hér S2.age verða 3, og S2.name mun benda á S2. Hugsaðu um allt það sem þú getur gert með int og flestir af þeim sem þú getur gert með nemanda strúktúrinn tegund. Við getum notað til strúktúr nemanda sem gerð fall viðfang. Við getum notað struct nemanda inni í nýja strúktúr. Við getum haft músina til að strúktúrinn nemanda. Við getum gert stærð nemanda strúktúrinn. Struct nemandi er gerð bara eins og int er gerð. Við getum einnig tengja S1 að S2 Þar sem bæði eru af sömu gerð, þannig að við getum gert S1 = S2. Hvað gerist ef við gerum S1.age = 10? Er S2 breyting á öllum? Aftur, hugsa um structs bara eins og venjulegur heiltölur. Ef við gefum einhverjum int x að einhverju int Y, eins og X = Y og breyta X, eins og í X + +, er Y breyting á öllum? Y er ekki breytt hér, og svo hvorki er S2 ofan. S2.age er enn 3. En athugið að þegar framselja einn struct til annars, öllum ábendingum benda enn á sama, þar sem þeir voru bara að afrita. Ef þú vilt ekki að ábendingar til að deila, þú þarft að höndunum höndla það, kannski með malicking eitt blokk minni fyrir einn af ábendingum að benda á og afrita gögnin yfir. Það gæti verið pirrandi að þurfa að skrifa struct nemenda alls staðar. Using a tegund def, getum við gert tegund def strúktúr og við munum kalla það nemandi. Nú getum við notað nemenda alls staðar sem við notuðum til að nota struct nemanda. Þessi tegund def er nafnlaus strúktúr og kallar það nemandi. En ef við höldum einnig nemandi auðkenni við hliðina á orðinu struct, eins og í typedef strúktúr nemanda, við getum notað bæði strúktúr nemanda og nemandi jöfnum höndum núna. Þeir gera ekki einu sinni að hafa sama nafn. Við gætum slegið def struct nemanda við Bob og svo strúktúr nemanda og Bob væri víxlanlegur tegundir. Óháð því hvaða gerð def, þurfum við auðkenni hliðina strúktúr ef skilgreining á strúktúr er endurkvæma. Til dæmis, tegund def struct hnút og það verður skilgreint sem int Val og það mun hafa músina sem vísar til annars strúktúrinn hnút., eins og í strúktúrinn hnút * næsta. Og þá munum við kalla það hnút. Þetta struct er endurkvæma, þar sem skilgreining á hnút strúktúrinn inniheldur innan þess bendi til strúktúrinn hnút. Takið eftir að við verðum að segja struct hnút * Næsta inni skilgreiningu á strúktúrinn hnút, þar sem tegund def hefur ekki lokið enn að leyfa okkur að einfalda þetta við bara hnút * næst. Þú munt læra meira um structs svipað þessu þegar að takast á við tengd listum og tré. Hvað structs í aðgerð? Þetta er líka fullkomlega gild. Við gætum hafa ógilt störf sem tekur sem rök, nemandi s og gerir eitthvað með þeim nemanda. Og þá getum við að gefa það sem strúktúr nemenda eins og svo. Störf í S1 undan. The struct hagar sér nákvæmlega sem heiltala væri þegar liðin til að virka. Störf fær afrit af S1 og svo má ekki breyta S1; heldur aðeins afrit af því sem er geymt í S. Ef þú vilt að virka til að vera fær um að breyta S1, störf þurfa að taka nemanda * s, og þú þarft að fara S1 eftir heimilisfangi, eins og svo. Student * S, störf og S1. Það er önnur ástæða til að fara með heimilisfang hér. Hvað ef strúktúr okkar innihélt 100 reiti? Hvert einasta skipti sem við standast nemanda við störf, kerfi okkar þarf að afrita allar þessar 100 sviðum í S rifrildi störf er, jafnvel ef það notar aldrei mikill meirihluti þeirra. Svo jafnvel ef störf ekki ætla að breyta nemanda, Ef geta enn vera dýrmæt líða heimilisfang. Jæja, hvað ef við viljum búa til bendi til strúktúr? Við gætum gert eitthvað eins og Nemandi * S jafngildir malloc stærð nemanda. Takið eftir að stærð samt virkar hér. Svo hvernig gera við aðgang nú aldri félagi í blokk Það er bendir á? Þú gætir fyrst að hugsa til að gera * S.age = 4, en það mun ekki alveg virka. Þar sem þetta mun í raun að túlka sem * S.age í sviga = 4, sem mun ekki einu sinni saman, þar S er ekki strúktúr eða frekar bendi til strúktúr, og svo punktur vilja ekki vinna hér. Við gætum gert (* S). Aldur = 4 en svigar geta fá pirrandi og truflandi. Sem betur fer, höfum við sérstaka ör stjórnandi sem lítur eitthvað eins og S-> aldur = 4. Þessir 2 leiðir tilvísun aldri eru jafngild og við í raun ekki alltaf þörf á örina rekstraraðila, en það gerir það líta ágætur. Þar S er bendi að einhverju blokk minni sem inniheldur struct, hægt er að hugsa um S> aldri sem fylgja músina ör og grípa aldri félagi. Svo hvers vegna ættum við að nota alltaf structs? Það er örugglega hægt að komast upp með aðeins frumstæðum heiltölur chars, ábendingum og þess háttar sem við erum að nota til að; stað S1 og S2 áður, við gætum haft age1, age2, NAME1 og NAME2 allt á mismunandi breytum. Þetta er allt í lagi með aðeins 2 nemendur, en hvað ef við hefðum 10 af þeim? Og hvað ef í stað þess að aðeins 2 svið, nemandi strúktúr hafði 100 sviðum? GPA, námskeið, hár lit, kyn, og svo framvegis. Í stað þess að aðeins 10 structs, þurfum við 1.000 aðskilin breytur. Einnig skaltu íhuga aðgerð sem tekur að strúktúr með 100 reiti með aðeins röksemdafærslu hennar og prentar út alla reiti. Ef við höfum ekki nota struct, hvert einasta skipti sem við köllum að virka, við þurfum að fara á alla 100 breytur, og ef við höfum 100 breytur fyrir nemendur 1., og 100 breytur fyrir nemanda 2, við þurfum að vera viss um að við gerum ekki óvart framhjá nokkrum breytum frá nemanda 1 og sumir breytur af nemanda 2. Það er ómögulegt að gera þessi mistök með strúktúr, þar sem allar 100 breytur eru í einum pakka. Bara nokkrar endanlega skýringum: Ef þú hefur skilið allt fram að þessu, frábært. The hvíla af the vídeó er bara fyrir sakir heilleika '. Þar structs getur haldið hvers konar músina, þeir geta einnig haldið virka ábendingum. Ef þú ert kunnuglegur með mótmæla stilla af forritun, þetta veitir möguleika til að nota structs að forrita í hlut stilla stíl. Meira á ábendingum virka á öðrum tíma. Einnig, stundum þú gætir hafa 2 structs skilgreiningar Hvers ráðast á annan. Til dæmis, við gætum hafa struct A, sem er skilgreint sem bendi til strúktúrinn B, struct B * X, og nú getum við haft struct B sem er skilgreint sem bendillinn til a struct A, struct A * Y. En þetta mun ekki þýða, þar struct B er ekki til á þeim tíma sem strúktúr A er unnin. Og ef við skipta strúktúr A og struct B, þá viljum við bara vera vinstri með sama vandamál, í þetta sinn, með strúktúr A ekki fyrir hendi. Til að leysa þetta, getum við skrifað strúktúr B; fyrir skilgreiningu á strúktúr A. Þetta er kallað fram yfirlýsingu. Þetta gerir bara þýðanda veit að struct B er gild tegund sem verður að fullu skilgreind síðar eða annars staðar. Mitt nafn er Rob Bowden, og þetta er CS50. [CS50.TV]