[Powered by Google Translate] Ajmo pričati o tvorevina.
Tvorevina nam kažete način da Grupa hrpu varijabli zajedno
u lijepom pakiranju.
To je vjerojatno najlakše vidjeti primjer odmah,
tako kažemo struct,
zatim otvaranje kovrčavu braće,
iu tom struct, imat ćemo int godine,
char * ime,
i to je to.
To se može činiti čudno s zarezom nakon kovrčave vitice,
ali to je u stvari potrebne s tvorevina.
Svaka valjana vrsta može ići unutar struct definiciji.
Ovdje smo koristili int i char *,
ali se također može koristiti niz, recimo, 100 elemente
ili čak još struct.
Kada koristite tvorevina u C,
ti si stvaranje novih vrsta
iz zbirke drugih vrsta.
Evo, mi smo izradu novog tip
od cijeli broj i char *.
Kao što ćemo kasnije vidjeti, struct putovanja
je u mnogo načina ekvivalent bilo koje druge vrste ste se naviknuli.
Obično, ja ću se usporedbom kako struct tip
je sličan integer tipa.
Dok kod smo pisali vrijedi C,
to nije vrlo korisno,
i jeka će nam dati upozorenje.
Sjetite se kako tvorevina, i njegovi su slični?
Pa, mi u osnovi samo rekao
int
koji nije jako pomogla linija.
Dakle, neka je zapravo deklarirati varijablu tog tipa
dajući joj ime prije zarezom.
Mi ćemo pozvati varijablu studenta.
Sada smo proglasili varijable zvane studenta
s vrste dane struct.
Kako ćemo doći do varijabli unutar struct?
Tehnički, imena ovih varijabli
su članovi.
Za pristup bilo kojeg člana u studentskom struct,
što dodati točku na ime varijable,
nakon čega slijedi ime člana želite.
Dakle, ovdje, samo dvije valjane mogućnosti
su student.age
i student.name.
I mi možemo učiniti nešto poput
student.age = 12
i student.name = učenik.
Sad, što ako smo htjeli napraviti drugi student?
Možda mislite da kopirati i zalijepiti ove retke
i promijeniti studenta student 2 ili tako nešto,
i da će raditi,
ali tehnički, učenik i student 2
nemaju istu vrstu.
Vidi, nećete biti u mogućnosti da ih dodijeliti jedan drugom.
To je zato što, do sada,
Vaš struct je anoniman.
Moramo mu dati ime.
Da bi to učinili, mi umetnite ime struct
nakon riječi struct.
učenik,
slijedi definiciji.
Mi još uvijek može odmah proglasiti varijablu tipa
struct student, kao što smo učinili prije.
Mi ćemo ga nazvati S1
Dajući struct ime,
sada možemo koristiti struct student
u gotovo isti način želimo koristiti int.
Tako možemo proglasiti varijablu tipa struct student,
kao
struct student S2.
Kao i polja, tvorevina pružiti sintaksu prečac inicijalizacije,
tako da možemo reći, struct student S2
jednaka
lijeva vitičasta braće 3, S2.
Evo, S2.age će biti 3,
i S2.name će ukazati na S2.
Razmislite o svim stvarima koje možete učiniti s int tipa
, a većina od njih možete učiniti s tipa struct student.
Možemo koristiti student struct kao tipu funkcije parametra.
Možemo koristiti struct student unutar novog struct.
Možemo imati pokazivač na struct student.
Mi možemo učiniti veličinu struct student.
Struct student putovanja
baš kao i int je tip.
Mi također može dodijeliti S1 do S2
budući da su obje od istog tipa, tako da možemo učiniti
S1 = S2.
Što će se dogoditi ako radimo
S1.age = 10?
Da li S2 promjena uopće?
Opet, mislim od tvorevina, samo što su redovite brojeva.
Ako ćemo dodijeliti neku int x na neki int Y,
kao x = y
i zatim promijeniti X,
kao u X + +,
ne Y promijeniti uopće?
Y ne mijenja ovdje, pa ni ne S2 gore.
S2.age još tri.
No, imajte na umu da kada je dodjeljivanje jedne struct na drugu,
sve pokazivače dalje ukazuju na istu stvar,
budući da su upravo kopirati.
Ako ne želite da upućuje da se dijeli,
morat ćete ručno podnijeti,
možda malicking jedan blok memorije za jedan od pokazivače ukazati na
i kopiranje podataka preko.
To bi moglo biti neugodno da moram pisati struct student posvuda.
Korištenje tipa def, možemo učiniti
Vrsta def
struct
a mi ćemo to nazvati učenik.
Sada, možemo koristiti student svugdje
da mi je koristila struct student.
Ovaj tip def je anonimni struct
i poziva ga student.
Ali ako i mi držati identifikator učenika
uz riječi struct, kao u typedef struct student,
možemo koristiti oba struct student i student naizmjenično sada.
Oni čak ne moraju imati isti naziv.
Mi smo mogli upisati def student struct da Bob
i onda struct student i Bob
će biti izmjenjivi vrste.
Bez obzira na tip def,
trebamo identifikator pokraj struct
ako je definicija struct
je rekurzivna.
Na primjer,
Vrsta def struct čvor
i to će biti definiran kao int val
i to će imati pokazivač koji ukazuje na drugom struct čvora.,
kao u struct čvor * sljedeću.
I onda ćemo ga nazvati čvor.
Ovo struct je rekurzivna,
budući da je definicija struct čvor sadrži u sebi
pokazivač na struct čvora.
Primijetit ćete da moramo reći struct node * Sljedeći
unutar definicije struct čvora,
jer je tip def još nije završila nam omogućiti da pojednostavi to
na samo čvor * next.
Vi ćete naučiti više o tvorevina sličnih ovome
kada se bave s povezanim popisima i drveće.
Što je tvorevina u funkciji?
To je ujedno i savršeno valjana.
Mogli smo
poništiti FUNC
koja uzima kao argument,
Učenik je
i učini nešto s tom učeniku.
A onda ga možemo proći kao student struct ovako.
Func od S1 od prije.
The struct ponaša
točno kao cijeli bi kada prođe funkciji.
Func prima kopiju S1
i tako se ne može mijenjati S1;
a, samo kopija od toga da je pohranjen u S.
Ako želite funkcija biti u mogućnosti mijenjati S1,
funkcija će morati uzeti studentski * S,
a vi ćete morati proći S1 prema adresi, kao i toliko.
Studentski * S, funk & S1.
Tu je još jedan razlog da prođe adresu ovdje.
Što ako je naša struct sadržavala 100 polja?
Svaki put kad smo proći učenika funkcio,
naš program treba kopirati sve one sto polja u Func argument S,
čak i ako nikada ne koristi veliku većinu njih.
Dakle, čak i ako je funkcija ne planirate na mijenjanje učenika,
ako još uvijek može biti vrijedno proći adresu.
Ok, što ako želimo stvoriti pokazivač na struct?
Mogli smo učiniti nešto slično
Učenik * S
jednaka malloc
Veličina učenika.
Obavijest tu veličinu i dalje radi ovdje.
Pa kako ćemo sada pristupiti člana dobi
bloka koji S točke na?
Ti prvi bi mogao pomisliti da to
* S.age = 4,
ali to nije sasvim će raditi.
Budući da je ovo stvarno će se tumačiti kao
* S.age u zagradama = 4,
koji neće ni sastaviti,
budući da S nije struct odnosno pokazivač na struct,
i tako dot neće raditi ovdje.
Mogli smo učiniti
(* S). Dob = 4
ali zagrade mogu dobiti neugodno i zbunjujuće.
Srećom, imamo posebnu strelica operatera
da izgleda nešto poput
S-> godina = 4.
Ove dvije načina pozivom dobi
su ekvivalent
i mi stvarno ne zatreba operatera strelica,
ali to čini stvari izgledaju ljepše.
Budući S pokazivač na neki blok memorije koja sadrži struct,
možete misliti S> dobi kao što slijedi pokazivač strelicu
i iskoristite člana dobi.
Dakle, zašto bi mi ikada koristiti tvorevina?
To je definitivno moguće da biste dobili daleko sa samo primitivnim brojeva,
znakovi, pokazivače i sl.
da smo koristiti za;
umjesto S1 i S2 prije,
Mogli smo imali age1, života2, NAME1 i NAME2
sve na odvojenim varijablama.
To je u redu sa samo dva učenika,
ali što ako smo imali 10 od njih?
A što ako umjesto samo dvije stavke,
student struct imala 100 polja?
GPA, tečajevi, boja kose, spolu i tako dalje.
Umjesto samo 10 tvorevina, moramo 1.000 odvojene varijable.
Također, razmislite funkciju
koji vodi tu struct sa 100 polja sa samo argument
i ispisuje sva polja.
Ako nismo koristiti struct,
svaki put mi zovemo tu funkciju,
moramo proći na svim sto varijabli,
i ako imamo 100 učenika varijable za 1,
i 100 varijable za studenta 2,
moramo biti sigurni da smo slučajno ne prođe neke varijable od učenika 1
i neke varijable iz student dva.
To je nemoguće napraviti tu pogrešku s struct,
budući da su sve 100 varijable sadržane u jednom paketu.
Samo par završnih bilješki:
Ako ste razumjeli sve do ove točke, veliki.
Ostatak video je samo za potpunost 'radi.
Zbog tvorevina može držati bilo koju vrstu pokazivač,
oni također mogu držati funkcija upućuje.
Ako ste upoznati s objektno orijentiranog programiranja,
to daje način za korištenje tvorevina na programu u objektno orijentiranog stila.
Više o funkcijskih upućuje na neko drugo vrijeme.
Također, ponekad vam svibanj imati dva tvorevina
čije definicije ovisiti jedni o drugima.
Na primjer,
bismo mogli imati struct,
koja se definira kao
pokazivač na struct B,
struct B * X,
i sada možemo imati B struct
koji je definiran kao pokazivač
da struct,
struct * Y.
Ali to neće sastaviti,
jer struct B uopće ne postoji vrijeme koje struct se sastaviti.
A ako ćemo zamijeniti struct i struct B,
onda mi samo bih biti lijevo s istim problemom;
ovaj put, s struct ne postoji.
Da bi se riješio ovaj, možemo pisati
struct B;
prije definiciji struct A.
To se zove naprijed deklaraciju.
To samo omogućuje prevodilac znati da
struct B je valjana vrsta koja će u potpunosti biti definiran kasnije ili negdje drugdje.
Moje ime je Rob Bowden, a ovo je CS50.
[CS50.TV]