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