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