[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]