[Powered by Google Translate] Pogovorimo se o konstrukti. Konstrukti nam posredujete tako, da Skupina kup spremenljivk skupaj v lep paket. Verjetno je najlažje, da si primer takoj, zato smo rekli struct, Nato odprete kodraste opornik, in v tem struct, bomo imeli int starost, char * ime, in to je to. Morda se zdi čudno s podpičjem po opornico kodrasti, vendar je v resnici potrebno s konstrukti. Vsaka veljavna vrsta more iti v struct opredelitve. Tu smo uporabili int in char *, vendar lahko uporabite tudi niz, od recimo, 100 elementov ali celo drugo struct. Ko uporabljate konstrukti v C, ste ustvarjanje novih vrst iz zbirke drugih tipov. Tukaj delamo novo vrsto od celega števila in char *. Kot bomo videli kasneje, struct vrste je v veliko pogledih enakovredne katero koli drugo vrsto ste vajeni. Ponavadi bom primerjal, kako je tip struct je podoben celo vrsto. Medtem ko smo pisali koda je veljavna C, to ni zelo koristno, in bo Jek nam opozorilo. Spomnite se, kako so konstrukti in njegovi podobni? No, v bistvu samo povedal int, ki ni zelo koristno linijo. Torej, kaj je dejansko razglasi spremenljivko tega tipa tako, da mu je ime pred podpičjem. Poklicali bomo spremenljivko študenta. Zdaj smo prijavljeni spremenljivo študentsko s tipom, ki ga struct. Kako priti do spremenljivk znotraj struct? Tehnično ime za te spremenljivke člani. Za dostop do določenih državah v študentskem struct, lahko dodate piko na ime spremenljivke, sledi ime člana, ki ga želite. Torej, tu je samo 2 možnosti veljavne so student.age in student.name. In lahko naredimo nekaj podobnega student.age = 12 in student.name = študent. Zdaj, kaj če bi želeli, da bi drugi študent? Morda si mislite, da kopiranje in lepljenje teh vrstic in spreminjanje učenca, da študent 2 ali kaj podobnega, in da bo delo, ampak tehnično, študent in študentski 2 nimajo iste vrste. Glej, ne boste mogli enemu drugemu. To je zato, ker do sedaj, vaš struct je bila anonimna. Moramo mu dala ime. Da bi to dosegli, moramo vstaviti ime struct za besedo struct. študent, sledi definiciji. Še vedno se lahko takoj razglasi spremenljivko tipa struct študenta, kot smo že naredili. Bomo rekli S1 S tem, ko struct ime, sedaj lahko uporabite struct študenta skoraj točno enak način želimo uporabiti int. Tako bomo lahko razglasi za spremenljivko tipa struct študenta, kot struct študent S2. Kot nizi, konstrukti zagotavlja sintakso priročni inicializacijo, Tako lahko rečemo, struct študentski S2 enako levo kodrasti naramnicami 3, S2. Tu bo treba S2.age 3, in bo S2.name opozarjajo S2. Pomislite na vse stvari, ki jih lahko storite z int tipom in lahko večina od njih vam z vrsto struct študentov. Mi lahko uporabite struct študenta kot tip funkcija parameter. Mi lahko uporabite struct študenta znotraj novega struct. Lahko imamo kazalec na struct študenta. To lahko storimo velikost struct študenta. Struct študent je vrsta tako kot je int tip. Mi lahko določite tudi S1 ​​do S2 saj sta oba istega tipa, tako da lahko naredimo S1 = S2. Kaj se zgodi, če ne bomo S1.age = 10? Ali S2 spremembe na vseh? Again, pomislite na konstrukti prav tako kot redni cela števila. Če bomo dodelili nekega int x do neke Y int, kot x = y in nato spremenite X, kot v X + +, Y ne spremeni sploh? Y ne spremeni tu, in tako tudi ne S2 zgoraj. S2.age je še vedno 3. Vendar ugotavlja, da pri dodeljevanju 1 struct v drugo, vsi kazalci kažejo, da še vedno isto stvar, saj so samo kopirali. Če ne želite, da so kazalci, ki se delijo, boste morali ročno ravnati, da morda z malicking 1 blok pomnilnika za enega od kazalcev, da kaže na in kopiranje podatkov več. Morda bi bilo neprijetno, da bi napisal struct študenta povsod. Uporaba tipa def, lahko naredimo Tip def struct in bomo rekli, da je študent. Sedaj lahko uporabimo povsod študenta ki smo ga uporabili za uporabo struct študenta. Ta tip def je anonimna struct in poziva, da študent. Ampak, če moramo tudi študentsko identifikator poleg besede struct, kot v typedef struct študenta, da bi nam tako struct študenta in študentko izmenično zdaj. Sploh ne imeti istega imena. Mi lahko vtipkate def struct študenta z Bobom in nato dograditi študentov in Bob zamenljive vrste. Ne glede na tip def, moramo identifikator poleg struct če opredelitev struct je rekurzivna. Na primer, Tip def struct vozlišče in bo opredeljen kot int val in bo imela kazalec, ki kaže na drugo struct vozlišče., kot v vozlišču struct * dostavo. In potem bomo rekli vozlišče. Ta struct je rekurzivni, ker opredelitev vozlišča struct znotraj vsebuje kazalec na struct vozlišče. Obvestilo, da moramo reči struct vozlišče * naslednji znotraj opredelitve struct vozlišča, ker je tip def še ni zaključena, da nam omogočajo, da ta poenostavitev na samo vozlišče * naslednji. Izvedeli boste več o konstrukti, podobnih tem ko se ukvarjajo s povezanimi seznami in drevesa. Kaj pa konstrukti v funkciji? To je tudi popolnoma veljavna. Lahko bi imeli nična funkcije ki bo kot argument, Študent s in ne nekaj s tega študenta. In potem jo lahko prenese kot struct študentov kot tako. Funkcije S1 od prej. Struct obnaša točno tako, kot bi celo, ko se prenese v funkcijo. Funkcije prejme kopijo S1 in zato ne more spremeniti S1; ne le kopija tega je, da je shranjen v S. Če želite funkcijo lahko spremenite S1, funkcije bodo morali vzeti študentsko * J, in boste morali opraviti S1 z naslovom, kot tako. Študent * S funkcije in S1. Obstaja pa še en razlog, da mine naslov tukaj. Kaj pa, če naš struct vsebuje 100 polj? Vsakič se peljemo študenta z funk, naš program potrebuje za kopiranje vseh teh 100 polj v funkcijo trditev je, tudi če se nikoli ne uporablja velika večina njih. Torej, tudi če funkcije ne nameravamo spremeniti študenta, če lahko še vedno koristno, da mine naslov. V redu, kaj pa če želimo ustvariti kazalec na struct? Lahko bi naredil kaj takega Študent * S enako malloc Velikost študenta. Obvestilo, da je velikost še vedno dela tukaj. Torej, kako bomo zdaj dostop do starostne člana bloka, ki kaže na S? Morda boste najprej pomislim na to * M.star = 4, vendar to ne bo delovalo čisto. Ker bo to res treba razlagati tako, * M.star v oklepaju = 4, , ki sploh ne bo zbrati, saj S ni struct oziroma kazalec na struct, in tako pika ne bo deloval. Mi lahko storite (* S). Starost = 4 lahko pa Oklepaji dobili nadležno in zmedeno. K sreči imamo posebno puščico operaterja da izgleda nekaj podobnega S-> starost = 4. Ti 2 načina za navajanje starosti enakovredni in ne bomo res kdaj potrebovali puščico operaterja, ampak naredi stvari videti lepše. Ker S je kazalec na nek blok pomnilnika, ki vsebuje struct, lahko si misliš, starost> kot sledi kazalca puščice in zgrabi starosti člana. Torej, zakaj bi morali vedno uporabiti konstrukti? To je vsekakor mogoče pobegniti z le primitivne cela števila, znakov, kazalci in podobno da smo se uporabljajo za; namesto S1 in S2 prej, Lahko bi imeli age1, age2, NAME1 in NAME2 vse na ločenih spremenljivk. To je v redu s samo 2 študente, kaj pa, če bi imeli 10 od njih? In kaj če bi namesto samo 2 polja, Študent struct imel 100 polj? GPA, tečaji, barva las, spol, in tako naprej. Namesto, da bi samo 10 konstrukti, moramo 1.000 ločenih spremenljivk. Prav tako menijo, funkcijo da se to struct s 100 polj s samo trditvijo in natisne vsa polja. Če nam ni uporabila struct, vsakič pokličemo to funkcijo, moramo opraviti na vseh spremenljivk 100, in če imamo 100 spremenljivk za študenta 1, in 100 spremenljivke za študenta, 2 moramo biti prepričani, da ne bomo slučajno mimo nekaj spremenljivk od študenta 1 in nekatere spremenljivke iz študent 2. To je nemogoče, da bi to napako s struct, saj so vse spremenljivke 100, ki je v enem paketu. Samo nekaj končnih opomb: Če ste razumeli vse, kar je do te točke, veliko. Preostali del videa je samo zaradi popolnosti ". Ker lahko konstrukti imajo vse vrste kazalec, , ki jih lahko imajo tudi funkcijo kazalca. Če ste seznanjeni z objektno usmerjenega programiranja, Ta določa način uporabe konstrukti, da program v objektno usmerjenega slog. Več o funkcionalnih kazalci v drugem času. Prav tako, včasih morda imate 2 konstrukti katerih opredelitve so odvisne druga od druge. Na primer, Lahko bi imeli struct, ki je opredeljena kot kazalec na struct B, struct B * X, zdaj pa imamo struct B , ki je opredeljeno kot kazalec da struct, struct * Y. Toda to ne bo sestavil, saj struct B ne obstaja v času, ko je struct, ki se pripravljajo. In če bomo zamenjali struct in struct B, potem bi le lahko ostal isti problem; tokrat z struct ne obstaja. Da bi rešili to, lahko zapišemo struct B; pred opredelitvijo struct A. To se imenuje naprej izjavo. To samo vam prevajalnik ve, da struct B je veljavna vrsta, ki se bo v celoti opredeljen pozneje ali kje drugje. Moje ime je Rob Bowden, in to je CS50. [CS50.TV]